繁体   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