当我使用命令从 git 打印文件时,存在边缘情况:
git diff --no-renames --name-only
边缘情况 1:空格
(--diff-filter=D
出于说明目的而添加)
# format 1: unquoted
$: touch 'foo bar.txt'
$: git add 'foo bar.txt'
$: git commit -m 'test'
$: rm 'foo bar.txt'
$: git diff --no-renames --name-only --diff-filter=D
foo bar.txt
边缘情况二:特殊字符
# format 2: quoted
$: touch 'foo
bar.txt'
$: git add 'foo$\nbar.txt'
$: git commit -m "test"
$: rm foo$'\n'bar.txt
$: git diff --no-renames --name-only --diff-filter=D
'foo\nbar.txt'
也foo bar.txt
不能按原样'foo\nbar.txt'
提交删除。rm
而且,它们是不一致的。
有没有办法控制git
文件名的格式,以便可以按rm
原样删除它们?
答案1
你会使用 awk 吗?转义 $0 之前和之后的引号将包含带有引号中空格的名称。 rm 应该可以很好地适应这种格式。
git diff --no-renames --name-only | awk '{system("rm \""$0"\"")}'
至于第二种边缘情况,以下内容将适用于除示例中使用的换行符之外的所有特殊字符:
git diff --no-renames --name-only | awk '{system("rm "$0)}'
话虽如此,名称中包含空格已经是不好的做法,应该避免,因为这些确切的问题,名称中包含换行控制字符只会增加复杂性,但好处为 0,换行符的用例是什么一个名字?
答案2
git diff --no-renames --name-only -z | xargs -0 -I {} sh -c 'rm -- "{}"'
是我一起去的。