이 git 별칭을 따옴표로 어떻게 만들 수 있습니까?
변경된 줄 (색상) 만 표시하는 git diff 별칭을 만들고 싶습니다.
[alias]
mdiff = diff --color | grep --color=never $'^\e\[3[12]m'
분명히 파이프는 git 별칭에서 사용할 수 없기 때문에 작동하지 않지만 이 답변은 해결 방법을 보여줍니다 .
[alias]
mdiff = ! git diff --color | grep --color=never $'^\e\[3[12]m'
그러나 이것도 작동하지 않으며 여전히이 오류가 발생합니다. fatal: bad config line 17 in file /home/me/.config/git/config
그 대답 아래의 의견은 문제가 따옴표로 인한 것이라고 제안합니다.
답변
없는 git 별칭 !은 Git 자체에서 실행됩니다. 별칭에 |문자 가 포함되어 있으면 문자 일뿐 |입니다. 셸이 관련되어 |있지 않으므로 파이프를 의미하지는 않습니다.
로 시작하는 git 별칭 !은 쉘에 의해 실행됩니다. Git은 !셸에서 (따옴표 구문 분석을 수행 한 후) 뒤에 오는 것을 실행 하고 끝에 인수를 전달합니다. 두 번째 시도는 Git이 백 슬래시를 구문 분석하기 때문에 유효하지 않습니다. grep이 볼 수 있도록 [쉘이 봐야 \\[하기 때문에 백 슬래시를 두 배로, 앞에 백 슬래시를 두 배로 늘려야합니다 \[.
mdiff = ! git diff --color | grep --color=never $'\\e\\\\[3[12]m'
그러나 이것은 git mdiff foo쉘 명령을 실행하는 것과 동일하기 때문에 옳지 않습니다.
git diff --color | grep --color=never $'\\e\\\\[3[12]m' foo
인수를 git에 전달하도록 배열해야합니다. 함수를 정의한 다음 실행하면됩니다. ;견적이 필요하기 때문에주의가 필요합니다. 이것은 Git 측에서 작동합니다.
mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $'\\e\\\\[3[12]m'; }; f"
이것은 /bin/shbash 인 경우에만 작동 하지만 대시 인 경우에는 작동 하지 않습니다. 대시는 $'…'이스케이프 구문을 지원하지 않습니다 . /bin/sh대시 인 경우 를 사용하여 이스케이프 문자를 생성해야합니다 printf.
mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $(printf '\\033\\\\[3[12]'); }; f"
컨텍스트를 제거하기 만하면 (파일 이름과 위치 표시기는 유지) 다음 기능이 내장되어 git diff -U0있습니다.