【问题标题】:Git pull invalid Windows file namesGit 拉取无效的 Windows 文件名
【发布时间】:2016-02-15 14:08:42
【问题描述】:

我正在使用 git 进行版本控制的共享项目。我在 Windows 上,而我的伙伴在 Unix 上。

我的伙伴用<file1>.txt 命名了一些文件。当我尝试提取这些文件时,它们不被接受,因为 <> 是 Windows 的无效字符。这很好,我不需要触摸文件。但是,它们被添加到我的提交中作为删除。所以,如果我推送,我会删除这些我不想做的文件。

  1. 我无法使用 git reset --hard,因为它为每个“已删除”文件找到了无效路径。

  2. 有没有办法从我的提交中排除这些文件?我尝试将<file1> 添加到我的.git/info/exclude,但没有成功。

【问题讨论】:

  • 这些文件是如何出现在您的提交中的?你是git commit -a 还是git add .?你想编辑你的提交还是只想从索引中删除这些文件?
  • 我个人要求使用git mv 更改名称,之后您应该能够执行强制拉取,但这是个人喜好。这是一个简单的解决方案,因为它允许您编辑这些文件,而不是无法对它们做任何事情。
  • 或者,自己动手:使用 Cygwin 安装程序安装 git 包(及其任何所需的依赖项),导航到 Cygwin 终端中的结帐目录(例如 cd /cygdrive/c/Users/Nryan6/projects/FooBar),@ 987654321@、git mv \<file1\>.txt file1.txt(对任何其他文件执行相同操作),然后提交和推送。 Cygwin 会将 U+003C (<) 和 U+003E (>) 转换为 Windows 允许的 U+F03C 和 U+F03E,但 Cygwin 会将它们视为正常的 <> 字符。
  • 有更复杂的方法来解决这个问题,包括在恢复错误提交或硬重置后应用修改后的补丁,但使用git mv,提交更改并推送更改到遥控器是最简单的。
  • 您可以在签入更改时尝试将 gitignore 文件添加到本地项目中。将这些文件添加到您的 .gitignore 文件中。确保您没有将 .gitignore 文件签入到 repo,因为您不希望您的合作伙伴的机器忽略这些文件。参考:help.github.com/articles/ignoring-files

标签: windows git filenames


【解决方案1】:

您需要让您的合作伙伴将名称更改为在 Windows 上也有效的名称。在他们重命名后,我要做的是:

  1. 备份您仅在本地拥有的所有更改(未提交和已提交但未推送)。
  2. 运行git reset --hard <commit>,其中<commit> 是添加文件之前的任何提交。
  3. 运行git pull 一直到最新版本(文件被重命名的地方)。
  4. 从 1 恢复备份的更改。

这应该会获得更新的版本,其中文件没有以这种方式命名,Windows,非法方式,并且它们不会被操作系统从 git 下删除(或曾经创建):)

附:我知道这是一个老问题,但我最近遇到了这个问题,所以希望我得到的解决方案也可以帮助其他人。

编辑:

为避免再次发生这种情况,您的合作伙伴可以添加一个预提交挂钩,以阻止他们提交名称在 Windows 上不允许的文件。 pre-commit.sample 中经常有一个示例/示例。我在过去做了一些改变,最终得到了类似的结果:

# Cross platform projects tend to avoid non-ASCII filenames; prevent
# them from being added to the repository. We exploit the fact that the
# printable range starts at the space character and ends with tilde.
if [ "$allownonascii" != "true" ] &&
    # Note that the use of brackets around a tr range is ok here, (it's
    # even required, for portability to Solaris 10's /usr/bin/tr), since
    # the square bracket bytes happen to fall in the designated range.
    echo $(git diff --cached --name-only --diff-filter=A -z $against | LC_ALL=C)
    test $(git diff --cached --name-only --diff-filter=A -z $against |
      LC_ALL=C tr -d '[ !#-)+-.0-9;=@-[]-{}~]\0' | wc -c) != 0
then
    cat <<\EOF
Error: Attempt to add a non-ASCII file name.

This can cause problems if you want to work with people on other platforms.

To be portable it is advisable to rename the file.

If you know what you are doing you can disable this check using:

  git config hooks.allownonascii true
EOF
    exit 1
fi

'[ !#-)+-.0-9;=@-[]-{}~]\0' 位是我稍作改动的重要部分。它定义了所有允许的字符范围,示例一个仅禁止“非 ascii”字符(这是顶部的注释所说的),但也有一些 ascii 字符在 Windows 上的文件名中是不允许的(例如如?:)。

所有允许的字符都被删除,如果有任何剩余 (wc -c != 0) 则会出错。它可能有点难以阅读,因为您看不到任何不允许的字符。如果您有一个在阅读或编辑时要查看的字符范围列表,这将很有帮助。

【讨论】:

    【解决方案2】:

    如果文件已被跟踪,则忽略无济于事。

    使用Sparse checkout 跳过这些文件。

    【讨论】:

      猜你喜欢
      • 2013-09-25
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 2016-02-29
      • 1970-01-01
      • 2023-02-03
      相关资源
      最近更新 更多