다음 명령을 사용하여 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
엣지 케이스 2: 특수 문자
# 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)}'
이름에 공백을 포함하는 것은 이미 나쁜 습관이며 이러한 정확한 문제 때문에 피해야 합니다. 이름에 개행 제어 문자를 포함하면 복잡성만 추가되지만 이점은 없습니다. 이름에 개행을 사용하는 사례는 무엇입니까?
답변2
git diff --no-renames --name-only -z | xargs -0 -I {} sh -c 'rm -- "{}"'
나는 그와 함께 갔다.