이 인용된 git 별칭을 작동하게 하려면 어떻게 해야 합니까?

이 인용된 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

이 답변 아래의 의견은 문제가 따옴표로 인한 것임을 나타냅니다.

답변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.

관련 정보