簡體   English   中英

我可以在git log輸出中轉義字符嗎?

[英]Can I escape chars in git log output?

我想發布處理git log的輸出並且一直在使用--pretty設置。 當我這樣做的時候

--pretty=format:'{"sha":"%h","message":"%B","author":"%aN <%aE>","commit":"%cE","date":"%cD"}

我得到一些類似JSON的輸出; 當我在提交消息中放入一個{}甚至一個" ,這會弄亂我的輸出。

有沒有辦法告訴git log逃避這些字符,例如通過預先添加\\

有兩個類似的問題Git日志輸出到XML,JSON或YAMLGit日志輸出最好是XML ,但它們都沒有解決特殊字符的轉義(例如,如果在XML情況下我把<foo>放在我的提交消息中,結果XML將被破壞)。

逃避字符串不是Git的工作; git log沒有任何東西可以幫助你做到這一點。 要實現你所追求的目標,你需要像sed這樣的東西為你做字符串編輯。

試試這個(應該適用於大多數shell,但我只檢查過Cygwin bash):

function escape_chars {
    sed -r 's/(\{\}")/\\\1/g'
}
function format {
    sha=$(git log -n1 --pretty=format:%h $1 | escape_chars)
    message=$(git log -n1 --pretty=format:%B $1 | escape_chars)
    author=$(git log -n1 --pretty=format:'%aN <%aE>' $1 | escape_chars)
    commit=$(git log -n1 --pretty=format:%cE $1 | escape_chars)
    date=$(git log -n1 --pretty=format:%cD $1 | escape_chars)
    echo "{\"sha\":\"$sha\",\"message\":\"$message\",\"author\":\"$author\",\"commit\":\"$commit\",\"date\":\"$date\"}"
}

for hash in $(git rev-list)
do
  format $hash
done

上面將轉義{}而不是\\ ,雖然從JSON.org開始\\{\\}都是無效的轉義; 只有\\"需要被轉義。(用sed -r 's/("\\\\)/\\\\\\1/g'替換sed表達式以獲得真正的JSON輸出。)

雖然%cE命令實際上給出了提交者的電子郵件地址,但我也保留了你的例子中的“commit”值。 我不確定這是不是你想要的。

(現在這包括一個正確的但被 macrobug 拒絕編輯 。謝謝!)

我不知道如何只使用git log來完成這個,但是一個簡單的其他解決方案是使用git log生成類似CSV的輸出(使用制表符分隔的字段)並將此輸出傳遞給python腳本,該腳本處理JSON生成與正確的報價。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM