[英]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或YAML和Git日志输出最好是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”值。 我不确定这是不是你想要的。
我不知道如何只使用git log
来完成这个,但是一个简单的其他解决方案是使用git log
生成类似CSV的输出(使用制表符分隔的字段)并将此输出传递给python脚本,该脚本处理JSON生成与正确的报价。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.