Variable
從字元串的特定部分中的變數回顯
我正在嘗試為擁有一個漂亮的
git log
. 說我有以下內容:git log --color --pretty=format:"%C(cyan)<%an>" --abbrev-commit
我想做的是製作一個變數,該變數
%an
根據輸出字元串採用並決定它將是什麼顏色。到目前為止,我有
USER=$(if [ ! %an = "my own user name" ] then echo "%C(cyan)<%an>" else echo %C(bold blue)<%an> fi)
因此,我將變數放入 git log 中,這樣我就有了
git log --color --pretty=format:"$USER" --abbrev-commit
應該這樣做,如果我完成了送出,它將以青色列印我的使用者名;否則,它將以粗體藍色列印協作者的使用者名。然而,事實並非如此。
我只是想知道是否有人知道我在這裡做錯了什麼?我懷疑這與將變數列印到已經是字元串的環境中有關,但我不知道如何修復它。任何幫助表示讚賞!
您正在嘗試將 shell 腳本放入 Git 的格式化參數中。當然,它不會起作用。1
- 有一些 Git 參數實際上接受 shell 腳本,比如
git filter-branch
; 但它們將在相應的手冊頁中明確指定。您嘗試完成的工作實際上可以完成,而不是通過 Git,而是通過使用外部過濾器來匹配名稱,並使用ANSI 轉義序列用顏色標記它們。
例如,當作者姓名與“ Joe Average ”匹配時,以青色突出顯示姓名和尖括號;否則,以粗體藍色突出顯示名稱和尖括號。2在這兩種情況下保持文本的其他部分不變……
通過使用 Perl 5 作為過濾器來實現:
git log "--pretty=tformat:%h <%an> %s" | perl -n -e ' chomp; if(/^(.*)<([^>]*)>(.*)$/) { if ($2 eq "Joe Average") { print $1."\e[36m<".$2.">\e[39m".$3."\n"; } else { print $1."\e[1m\e[34m<".$2.">\e[39m\e[0m$3\n"; } } else { print $_."\n"; }'
通過
sed
用作過濾器來實現(有點 hacky 3)……git log "--pretty=tformat:%h <%an> %s" | sed ' s/<\(Joe Average\)>/\x1B[36m<\1>\x1B[39m/g; t matched; s/<\([^>]*\)>/\x1B[1m\x1B[34m<\1>\x1B[39m\x1B[0m/g; :matched'
來自測試儲存庫的正常輸出(無過濾器):
$ git log "--pretty=tformat:%h <%an> %s" e7f3209 <Joe Average> improving portability e3ebe74 <Jim Sixpack> adding first working prototype
突出顯示的輸出(通過任一過濾器):
請注意,即使您更改了
git log
輸出格式,這些過濾器命令仍然有效,前提是:
- 作者姓名始終包含在
<
>
.- 一行不超過一個作者。
- 沒有其他東西被包含在
<
>
.執行您所要求的另一種方法是使用不同的and進行兩次不同的
git log
呼叫,將結果合併在一起,並按時間戳對它們進行排序;但棘手的部分是確保兩個呼叫的輸出不會產生重疊輸出。(你不能使用,因為這樣做會用不同的轉義序列標記它們)--author``--pretty``git log``uniq
腳註
- 1實際上,由於沒有引用,你的
if [ ! %an = "my own user name" ] ...
已經在該USER=
行執行(%an
將按字面比較——它在 shell 中沒有特殊含義);USER="%C(cyan)<%an>"
在您甚至可以呼叫git log
命令之前使其有效。- 2另外,你說你想用青色突出你自己的名字,而其他人用藍色加粗;但是您的原始程式碼實際上嘗試了相反的操作:如果(作者姓名)不是(我自己的使用者名),則以青色突出顯示,否則以粗體藍色突出顯示。我堅持你的描述。
- 3
\x
是GNU sed 的擴展,如果您在非 GNU 系統上使用它,您的里程可能會有所不同。