Git:如何在命令行中指定包含八进制符号的文件名

5

对于文件名中的非ASCII字符,Git会使用八进制记法输出它们。例如:

> git ls-files
"\337.txt"

如果这样的字节序列不代表一个合法的编码(对于命令行当前的编码),我就不能在命令行上输入相应的字符串。那么,我如何仍然可以在这些文件上调用Git命令呢?显然,使用git ls-files显示的字符串是无效的:
> git rm "\337.txt"
fatal: pathspec '337.txt' did not match any files

在Windows上测试,使用msysgit 1.7.10(git版本为1.7.10.msysgit.1)


请参阅如何使Git在控制台窗口中正确显示UTF-8编码的路径名?git config --global core.quotepath off - Hans Ginzel
1个回答

10
在Bash中,您可以使用printf来实现这种目的:
$ printf "\337.txt"
▒.txt

$ git rm `printf "\337.txt"`  # this would pass the awkward filename to git

问题显然是,shell 和 git 都不执行八进制转义,但 printf 可以。
此外,echo -e可以进行八进制转义:
$ echo -e '\0337.txt'
▒.txt

但是这种用法被不太鼓励,您应该尽可能使用printf


我该如何将其与Git命令结合使用?如果我已经安装了msysgit,会怎样呢? - mstrap
@mstrap,我希望msys提供了printf实用程序,因为它是标准的posix实用程序之一。你应该尝试看看它是否可用。另外请参见编辑。 - ulidtko
1
printf 版本在 msysgit 的 bash 中完美运行。谢谢! - mstrap
git ls-tree --name-only $GIT_COMMIT | xargs -0 printf | xargs -I files mv files $d - qxo

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