控制 git 打印文件名的方式以便将它们传递给 rm?

控制 git 打印文件名的方式以便将它们传递给 rm?

当我使用命令从 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 -- "{}"'是我一起去的。

相关内容