从git中删除一个带有奇怪名称的文件

时间:2012-11-06 12:02:33

标签: git

我有一个设法让自己命名的文件:

# file's name (both lines)
companies.yml
companies.yml

# entry in my git working tree
"test/fixtures/companies.yml\342\200\250companies.yml"

由于令人讨厌的原因,此特定项目的工作树中充满了仍需要组织的其他文件。我想从上面输入上述条目,但是当我尝试git add "test/fixtures..."git rm "test/fixtures..."时,它会失败:
fatal: pathspec 'test/fixtures/companies.yml\342\200\250companies.yml' did not match any files

我该如何处理?


Git状态

On branch master
# Your branch is ahead of 'production/master' by 4 commits.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)

modified:   [other files]
modified:   "test/fixtures/companies.yml\342\200\250companies.yml"

3 个答案:

答案 0 :(得分:11)

Git正在打印文件名的UTF-8编码的文字八位字节,因为它们是非ASCII字符,并将它们打印为八进制转义符。但是,你的shell不理解它们,并且在剪切和粘贴时向git命令发送文字反斜杠和数字,所以你实际上输入的是不同的文件名。

在键入test/fixtures/companies.yml(如果你的shell支持这个)之后使用tab-completion,它将输入实际字符或通配符代替转义符test/fixtures/companies.yml*companies.yml。后者可能,但可能不会与其他文件名匹配。

另一种可能性是,只需将文件重命名为更合理的文件,然后使用git add -u / git add .让git注意重命名。

答案 1 :(得分:11)

由于您使用的是bash,因此可以使用printf command

git rm --cached `printf "test/fixtures/companies.yml\342\200\250companies.yml"`

以\ 0开头的八进制转义可能包含最多四位数字 (POSIX最多指定三个)

您可以在“Git: how to specify file names containing octal notation on the command line”上看到类似的解决方案。

这将从索引中删除文件,同时仍将其保留在工作树上 然后,您可以根据需要重命名它。


使用Git 2.18更新(2018年第二季度,6年后),使用简单的完成工作应该有效。

commit 3dfe23bSZEDER Gábor (szeder)(2018年4月16日){{3}}。

完成:支持完成非ASCII路径名

  

除非用户在某处拥有“core.quotePath=false”   配置,“git ls-files”和“git diff-index”都将通过   默认引用包含值大于的字节的任何路径名   0x80,并将这些字节转义为“\nnn”八进制值   这可以防止在完成当前路径组件时完成路径   包含任何非ASCII,最明显的是UTF-8字符,因为没有   列出的引用路径将与命令中的当前单词匹配   线。

     

为那些“core.quotePath=false”和“git ls-files”调用设置“git diff-index”,因此他们不会将高于0x80的字节视为“异常”,并且不会引用包含此类字符的路径名。

     

请注意包含反斜杠,双引号或控件的路径名   字符仍然会被引用;这个系列的后续补丁会   处理那些。

答案 2 :(得分:1)

我想删除我的git存储库中包含俄语字母名称的文件夹:“ФайлыMail.RuАгента”。首先,我手动删除了该文件夹,并希望使用

在git中删除它
git rm "..."

命令在下一步中。但是git向我展示了已删除文件夹的一个非常新颖的名称: “\ 320 \ 244 \ 320 \ 260 \ 320 \ 271 \ 320 \ 273 \ 321 \ 213 Mail.Ru \ 320 \ 220 \ 320 \ 263 \ 320 \ 265 \ 320 \ 275 \ 321 \ 202 \ 320 \ 260”。 我用

恢复了文件夹
git checkout

而不仅仅是复制了文件夹的名称和执行的命令

git rm "Файлы Mail.Ru Агента/*"

有效!