11

我有一个文件设法将自己命名为:

# 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"
4

3 回答 3

14

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

键入后使用制表符补全test/fixtures/companies.yml(如果您的外壳支持此功能)将输入实际字符或使用通配符代替转义符test/fixtures/companies.yml*companies.yml。后者可能但可能不会匹配其他文件名。

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

于 2012-11-06T12:21:04.237 回答
12

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

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

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

您可以在“ Git:如何在命令行上指定包含八进制表示法的文件名”中看到类似的解决方案。

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


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

请参阅SZEDER Gábor ( ) 的提交 3dfe23b(2018 年 4 月 16 日szeder

完成:支持完成非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视为“不寻常”,并且不会引用包含此类字符的路径名。

请注意,包含反斜杠、双引号或控制字符的路径名仍将被引用;本系列的后续补丁将处理这些问题。

于 2012-11-06T12:40:22.707 回答
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 Агента/*"

有效!

于 2017-01-29T15:14:12.720 回答