我想发布处理git log
的输出并一直在玩--pretty
设置。当我例如做
--pretty=format:'{"sha":"%h","message":"%B","author":"%aN <%aE>","commit":"%cE","date":"%cD"}
我得到一些类似JSON的输出;当我在提交消息中加入{
或}
或甚至"
时,这会混淆我的输出。
有没有办法告诉git log
逃避这些字符,例如通过预先\
?
有两个类似的问题Git log output to XML, JSON or YAML和Git log output preferably as XML,但它们都没有解决特殊字符的转义(例如,如果在XML情况下我将<foo>
放在提交消息中,结果XML将被破坏。
答案 0 :(得分:4)
逃避字符串不是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
表达式替换为sed -r 's/("\\)/\\\1/g'
以获得真正的JSON输出。)
虽然%cE
命令实际上给出了提交者的电子邮件地址,但我也保留了“示例”中的“commit”值。我不确定这是不是你想要的。
(现在correct but rejected edit包括macrobug。谢谢!)
答案 1 :(得分:0)
我不知道如何仅使用git log
来完成此操作,但一个简单的其他解决方案是使用git log
生成类似CSV的输出(使用制表符分隔的字段)和管道这个输出成一个python脚本,用正确的引用处理JSON生成。