使用`git diff --name-only`的输出作为具有非ASCII字符文件名的文件名

4

git diff --name-only 的输出对于文件名不是 ASCII 的情况并不是很有用。例如:

git init
echo Germany > Düsseldorf.txt
echo Mexico > Cancún.txt
git add *.txt

while read f
    do cat "$f"
done < <(git diff --cached --name-only)

这将导致以下输出结果:
cat: '"Canc303272n.txt"': No such file or directory
cat: '"D303274sseldorf.txt"': No such file or directory

我该如何获取一个有用于进一步处理的暂存文件列表?


2
尝试:while IFS= read -r f - anubhava
4
请查看git diff-z选项。该选项可以使输出使用null字符而不是换行符来分隔文件名和修改后的内容,这对于处理文件名包含空格或其他特殊字符的情况很有用。 - Biffen
2
@anubhava 这只是解决方案的一部分 - KamilCuk的答案在下面添加了缺失的部分以使其正常工作。 - Thomas W
1个回答

5
如何获得一个有用于进一步处理的暂存文件清单?
使用零分隔流。
git diff -z --cached --name-only |
while IFS= read -r -d '' f; do
   cat "$f"
done

请参考https://mywiki.wooledge.org/BashFAQ/020

使用以下命令:git diff -z --cached --name-only | xargs -0 cat


谢谢 - xargs 的替代方案看起来更好。 - Thomas W
1
请注意,如果您无法处理以 '\0' 分隔的文本,则 git -c core.quotepath=false diff ... 将减少需要引用的字符集。但是,尽可能使用 -z 方法仍然更可取。 - torek

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