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

ssc*_*rus 9 git

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

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

# entry in my git working tree
"test/fixtures/companies.yml\342\200\250companies.yml"
Run Code Online (Sandbox Code Playgroud)

由于令人讨厌的原因,此特定项目的工作树中充满了仍需要组织的其他文件.我想从上面输入上面的条目,但是当我尝试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"
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 12

由于你是bash,你可以使用printf命令:

git rm --cached `printf "test/fixtures/companies.yml\342\200\250companies.yml"`
Run Code Online (Sandbox Code Playgroud)

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

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

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


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

提交3dfe23b(2018年4月16日)由SZEDER的Gabor( )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"不寻常",并且不会引用包含此类字符的路径名.

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


pnd*_*ndc 11

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

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

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