Git

如何使這個帶引號的 git 別名起作用?

  • September 16, 2020

我想做一個 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/shbash,但不適用於 dash。Dash 不支持$'…'轉義語法。如果/bin/sh是破折號,您需要使用 . 生成轉義字元printf

mdiff = ! "f () { git diff --color \"$@\" | grep --color=never $(printf '\\033\\\\[3[12]'); }; f"

如果您只想刪除上下文(但保留文件名和位置指示符),則內置:git diff -U0.

引用自:https://unix.stackexchange.com/questions/609731