변경된 줄(색상)만 표시하는 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
이 답변 아래의 의견은 문제가 따옴표로 인한 것임을 나타냅니다.
답변1
!
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/sh
대시가 아닌 bash에서만 작동합니다. 대시는 $'…'
이스케이프 구문을 지원하지 않습니다 . /bin/sh
대시인 경우 이스케이프 문자를 생성해야 합니다 printf
.
mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $(printf '\\033\\\\[3[12]'); }; f"
컨텍스트만 제거하고 싶지만 파일 이름과 위치 표시는 유지하려는 경우 내장된: git diff -U0
.