gitpython 的差异和 git 日志的差异有什么区别?

What's the difference between gitpython's diff and git log's diff?

我不明白 git log -pgitpython 的输出之间的差异。

例如,对于某些合并提交 f534e1...git log -p 给出:

commit f534e1...
Merge: ....
Author: ....
Date:   ...

Merge pull request ... from ...

with no diff,我认为这是正确的(diff 带有下一个日志条目 - f534e1... 的父项之一)。

我想用gitpython达到同样的效果。我正在尝试:

repo = Repo("...")
for c in repo.iter_commits():
  print c.hexsha
  print c.summary
  print c.diff()

我得到:

f534e1...
Merge pull request ... from ...
[<git.diff.Diff object at 0x102cd3490>]

一些差异

这是什么区别?为什么我在这里得到它?我怎样才能模仿 git log -p 的行为?

根据 documentationc.diff() 会将提交与索引进行比较,即分阶段更改。

看来 git log -p 将针对所有给定提交的父项生成特殊格式差异。使用以下代码(基于您的示例)可以实现大致相当的东西。

repo = Repo("...")
for c in repo.iter_commits():
  print c.hexsha
  print c.summary
  for p in c.parents:
    handle_diff(c.diff(p))

后者会产生一个包含所有相关信息的 Diff 对象。

如果您真正想要的是 git log -p 生成的确切格式,您也可以调用 repo.git.log(p=True) 并自己解析输出。