Git Python 找不到提交

2 投票
1 回答
2200 浏览
提问于 2025-04-16 16:31

我在查看提交记录时,找不到某个标签指向的提交。在这个例子中,我使用的是直接从Github上克隆下来的Tornado Web代码库。

import sys
import git

if len(sys.argv) < 2:
    print 'python git_test.py <repo path>'
    sys.exit(0)

repo = git.Repo(sys.argv[1])
commits = {}

for git_commit in repo.iter_commits():
    commits[git_commit.hexsha] = git_commit

print len(commits)

for git_tag in repo.tags:
    print 'Tag %s points to Commit %s' % (
        git_tag.name,
        commits[git_tag.commit.hexsha]
    )

这个方法应该能找到git中所有的提交记录,但我尝试了另一种方法,通过一个递归函数来遍历这个提交记录的图,结果也是一样的。

ian@ian-EP45-UD3L:~/code/playground$ python git_test.py ~/code/tornado/
459
Tag v1.0.0 points to Commit eb5b3d8df7a305ac1ffa0a12c813e5d7ee4d6cd3
Traceback (most recent call last):
  File "git_test.py", line 19, in <module>
    commits[git_tag.commit.hexsha]
KeyError: '2b5064b7ed962603ade0db0c8e21846a9879e30e'

我是不是做错了什么?我该如何解决这个问题?任何帮助都非常感谢!

我使用的是git-python v0.3.1。

1 个回答

5

我之前没用过gitpython,所以我很好奇,就在一个测试的仓库上试了你的脚本。没有出现任何错误,标签也正常打印出来了。不过我有点怀疑:

我添加了一个分支,做了一个提交,然后给它打了个标签。结果就出现了你遇到的那个错误,这时候事情就变得清楚了。

repo.iter_commits() 只会获取当前分支的提交记录。所以如果你在另一个分支上给某个提交打标签,那这个提交在commits里是找不到的。我尝试切换到我新建的分支,但失败了,提示找不到不同的提交,而那个提交当然是在我测试仓库的主分支上。

这就是你的问题所在。你需要找到一种方法来获取所有分支的所有提交。

顺便说一下,你知道你现在的做法是绕了个弯子来获取标签指向的提交吧?

撰写回答