Git拉取无效的Windows文件名称

11

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

我的合作伙伴用<file1>.txt命名了一些文件。当我尝试拉取这些文件时,由于<>是Windows中无效的字符,它们不被接受。这很好,我不需要触碰这些文件。但是,它们被添加到我的提交中,被标记为已删除。因此,如果我推送的话,我将删除这些我不想要的文件。

  1. 我不能使用git reset --hard,因为它会发现每个这些“已删除”文件的无效路径。

  2. 有没有一种方法可以将这些文件从我的提交中排除?我尝试将<file1>添加到我的.git/info/exclude文件中,但那并没有起作用。


1
这些文件是如何出现在你的提交中的?你是使用了 git commit -a 还是 git add . 命令?你想要编辑你的提交还是只想从索引中删除这些文件? - Paul
我个人建议使用 git mv 更改名称,然后您应该能够执行强制拉取,但这是个人偏好。这是简单的解决方案,因为它允许您编辑这些文件,而不是无法对其进行任何操作。 - user539810
或者,您可以自己操作:使用Cygwin安装程序安装git包(以及其所需的任何依赖项),在Cygwin终端中导航到检出目录(例如cd /cygdrive/c/Users/Nryan6/projects/FooBar),再次拉取(可能会覆盖本地更改;单击获取更多信息)git mv \<file1\>.txt file1.txt(对于任何其他文件也是如此),然后提交并推送。Cygwin将U+003C(<)和U+003E(>)转换为U+F03C和U+F03E,Windows将允许这样做,但Cygwin将把它们视为普通的<>字符。 - user539810
还有更复杂的解决方法,包括在还原错误提交或硬重置之后应用修改后的补丁,但是使用git mv,提交更改并将更改推送到远程是最简单的。 - user539810
在提交更改时,您可以尝试在本地项目中添加一个gitignore文件。将这些文件添加到.gitignore文件中。确保不要将.gitignore文件提交到存储库中,因为您不希望合作伙伴的机器忽略这些文件。参考:https://help.github.com/articles/ignoring-files/ - SaurabhM
2个回答

6
您需要让合作伙伴更改名称,使其在Windows上也有效。重命名后,您可以执行以下步骤:
  1. 备份本地所有未提交和已提交但未推送的更改。
  2. 运行git reset --hard <commit> ,其中<commit>是在这些文件添加之前的任何提交。
  3. 运行git pull以获取最新修订版(其中包括已更改文件的名称)。
  4. 从步骤1中恢复您备份的更改。
这将获取新的修订版,其中文件没有使用不符合 Windows 规则的名称,因此它们将不会被操作系统删除(或创建)。
附注:我知道这是一个旧问题,但是我最近也遇到了这个问题,所以希望我得出的解决方案也可以帮助其他人。
编辑:
为避免再次出现这种情况,您的合作伙伴可以添加一个 pre-commit 钩子,阻止他们提交具有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”字符(正如顶部的注释所说),但是在Windows文件名中还有一些ASCII字符不允许使用(例如?:)。

删除了所有允许的字符,如果还剩下任何内容(wc -c != 0),则出现错误。这可能有点难以阅读,因为您无法看到任何被禁止的字符。当阅读或编辑时,如果您有一个字符范围列表,则会很有帮助。"


2

如果文件已经被跟踪,忽略它们是没有用的。

使用Sparse checkout来跳过这些文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接