我有一个设法让自己命名的文件:
# 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
我该如何处理?
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"
答案 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 3dfe23b见SZEDER 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 Агента/*"
有效!