2012-02-15 31 views
6

我想要後處理git log的輸出,並且一直在使用--pretty設置。當我例如做我可以在git log輸出中轉義字符嗎?

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

我得到一些JSON樣的輸出;當我將{}甚至"放入提交消息時,這會弄亂我的輸出。

有沒有辦法告訴git log逃避那些chars例如通過預先\

有兩個類似的問題Git log output to XML, JSON or YAMLGit log output preferably as XML,但他們都沒有解決特殊字符的轉義(例如,如果我在提交信息把<foo>的XML情況下,生成的XML將被打破)。

+0

你應該使用'git的REV-list'的腳本 – knittl 2012-02-21 11:59:13

回答

4

轉義字符串不是Git的工作; git log沒有任何東西可以幫助你做到這一點。爲了實現您的目標,您需要使用類似sed的字符串來爲您進行字符串編輯。

試試這個(在多數殼工作,但我只在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命令實際上給出了commiter的電子郵件地址;我不確定這是你的意圖。

(現在這包括correct but rejected edit通過macrobug。謝謝!)

+1

更新版本的git需要'git rev-list --all' – maxmil 2016-08-24 08:03:02

0

我不知道如何使用git log這樣做,但一個簡單的其他解決方案是使用git log生成一個類似CSV的輸出(帶有製表符分隔的字段),並將此輸出傳送到一個python腳本中用正確的引號處理JSON生成。

+1

豈不一,在CSV也需要進行轉義?或者'git log'會這樣嗎? – 2012-02-16 10:28:59

相關問題