2

コミット ツリーをナビゲートしても、タグが指すコミットを見つけることができません。この特定の例では、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 の直接非巡回グラフですべてのコミットを見つけることを想定していますが、再帰関数を使用して DAG を再帰的にナビゲートする別のアプローチを試したところ、同じ結果が得られました。

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を使用しています。

4

1 に答える 1

5

以前に gitpython を使用したことがなかったので、興味があり、ダミーのリポジトリでスクリプトを試してみました。エラーは発生せず、タグは適切に印刷されました。しかし、私は疑念を持っていました:

ブランチを追加し、コミットを追加して、タグを付けました。その後、エラーが発生し、状況が明らかになりました。

repo.iter_commits()現在のブランチのコミットのみを取得します。したがって、別のブランチのコミットへのタグには、コミットはありませんcommits。ブランチを作成した新しいブランチに変更しようとしましたが、別のコミットが見つからなかったと言って失敗しました。これはもちろん、ダミーリポジトリのマスターにありました。

それはあなたの問題です。すべてのブランチからすべてのコミットを取得する方法を見つける必要があります。

PS: タグが指しているコミットを正しく取得するために遠回りをしていることを知っていますか?

于 2011-04-27T17:30:41.347 に答える