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
該答案下的評論表明問題是由於引號引起的。
一個沒有的 git 別名
!
由 Git 自己執行。如果別名包含一個|
字元,那隻是一個|
字元。不涉及外殼,因此|
並不意味著管道。以 開頭的 git 別名
!
由 shell 執行。Git!
在 shell 中執行後面的內容(在進行一些引號解析之後),並在最後傳遞參數。您的第二次嘗試無效,因為 Git 解析了反斜杠,您需要將它們加倍,並將前面的反斜杠加倍,[
因為 shell 必須看到\\[
才能讓 grep 看到\[
:mdiff = ! git diff --color | grep --color=never $'\\e\\\\[3[12]m'
但是這樣是不對的,因為
git mdiff foo
相當於執行shell命令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,但不適用於 dash。Dash 不支持$'…'
轉義語法。如果/bin/sh
是破折號,您需要使用 . 生成轉義字元printf
。mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $(printf '\\033\\\\[3[12]'); }; f"
如果您只想刪除上下文(但保留文件名和位置指示符),則內置:
git diff -U0
.