我能否在git log输出中转义字符?

9

我希望能够处理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将被破坏)。

你应该在脚本中使用git rev-list - knittl
2个回答

6
转义字符串不是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\{\} 都是无效的转义字符;只有\"需要转义。(要得到真正的JSON输出,请使用命令 sed -r 's/("\\)/\\\1/g' 替换 sed 表达式。)
我也像你的示例一样保留了 "commit" 值,尽管 %cE 命令实际上提供的是提交者的电子邮件地址;我不确定这是否符合你的意图。
(此处还包括 macrobug正确但被拒绝的编辑。谢谢!)

2
较新版本的git需要使用git rev-list --all命令。 - maxmil

0
我不知道如何仅使用git log完成此操作,但一个简单的解决方案是使用git log生成类似CSV的输出(以制表符分隔的字段),并将此输出导入到处理JSON生成及正确引号的Python脚本中。

6
在CSV中,逗号也需要转义吗?还是git log会自动处理? - Heiko Rupp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接