我可以在git log输出中转义字符吗?

时间:2012-02-15 21:26:54

标签: git

我想发布处理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 YAMLGit log output preferably as XML,但它们都没有解决特殊字符的转义(例如,如果在XML情况下我将<foo>放在提交消息中,结果XML将被破坏。

2 个答案:

答案 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生成。