gpt4 book ai didi

python - 在 GitPython 中获取第一次提交的差异细节

转载 作者:太空狗 更新时间:2023-10-30 00:13:47 49 4
gpt4 key购买 nike

在 GitPython 中,我可以通过在不同的提交对象之间调用 diff() 方法来分别迭代树中每个更改的差异信息。如果我使用 create_patch=True 关键字参数调用 diff(),则会为每个更改(添加、删除、重命名)创建一个补丁字符串,我可以通过创建的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)

这可能会解决您的问题。如果这不能解决您的问题,您最好尝试使用 pygit2它基于 libgit2——VSTS、Bitbucket 和 GitHub 用来在其后端处理 Git 的库。这可能是更完整的功能。祝你好运。

关于python - 在 GitPython 中获取第一次提交的差异细节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33916648/

49 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com