如何获取 git log -p 作为 json

问题描述

我想运行 git log -p 并以 JSON 格式获取结果。 我无法从 pretty format documentation 中找到方法,但我可能遗漏了一些东西。

我心目中的理想结果是这样的:

[{
  "commit": SHA,"author": AUTHOR,"date": DATE,"commit_message": COMMIT_MSG,"full_diff": FULL_DIFF
}]

解决方法

git log 实现是不可能的,因为 diff 没有格式。可以使用管道命令编写脚本:

echo '['
git rev-list HEAD | while read sha1; do
    full_diff="$(git show --format='' $sha1 | sed 's/\"/\\\"/g')"
    git --no-pager show --format="{%n  \"commit\": \"%H\",%n  \"author\": \"%an\",%n  \"date\": \"%ad\",%n  \"commit_message\": \"%s\",%n  \"full_diff\": \"$full_diff\"%n}," -s $sha1
    done
echo ']'

一些注意事项:

git rev-list HEAD | while read sha1; do…done

表示“遍历所有提交,将每个哈希读入变量 sha1”。

full_diff="$(…)"

提取提交的完整差异。将 " 替换为 \" 以避免生成损坏的 JSON。

git show --format="…" -s $sha1

以给定格式打印有关提交的信息。单独添加完整差异。