在GitPython中,我可以通过在不同提交对象之间调用diff()
方法来分别迭代树中每次更改的差异信息。如果我使用diff()
关键字参数调用create_patch=True
,则会为每个更改(添加,删除,重命名)创建一个补丁字符串,我可以通过创建的diff
对象进行访问,并对这些更改进行剖析。
但是,我没有 parent 可以与第一次提交进行比较。
import git
from git.compat import defenc
repo = git.Repo("path_to_my_repo")
commits = list(repo.iter_commits('master'))
commits.reverse()
for i in commits:
if not i.parents:
# First commit, don't know what to do
continue
else:
# Has a parent
diff = i.diff(i.parents[0], create_patch=True)
for k in diff:
try:
# Get the patch message
msg = k.diff.decode(defenc)
print(msg)
except UnicodeDecodeError:
continue
您可以使用方法
diff = repo.git.diff_tree(i.hexsha, '--', root=True)
但这会使用给定的参数在整个树上调用
git diff
,返回一个字符串,我无法分别获取每个文件的信息。也许,有一种方法可以创建某种
root
对象。如何获得存储库中的第一个更改?编辑
一个肮脏的解决方法似乎是通过直接使用its hash与空树进行比较:
EMPTY_TREE_SHA = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
....
if not i.parents:
diff = i.diff(EMPTY_TREE_SHA, create_patch=True, **diffArgs)
else:
diff = i.diff(i.parents[0], create_patch=True, **diffArgs)
但这似乎不是一个真正的解决方案。仍然欢迎其他答案。
最佳答案
简短的答案是你做不到。
GitPython似乎不支持此方法。
在提交上执行git show
是可行的,但是GitPython不支持该代码。
另一方面,您可以使用GitPython中的stats
功能来获取使您能够获取所需信息的内容:
import git
repo = git.Repo(".")
commits = list(repo.iter_commits('master'))
commits.reverse()
print(commits[0])
print(commits[0].stats.total)
print(commits[0].stats.files)
这可能会解决您的问题。如果这不能解决您的问题,则最好使用基于libgit2的pygit2-VSTS,Bitbucket和GitHub用于在其后端处理Git的库。那可能是更完整的功能。祝你好运。
关于python - 获取GitPython中第一次提交的差异细节,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33916648/