如何获得 git log -p as json

How to get git log -p as 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

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