操作によって適用されようとしているコミットのリストを取得する Python スクリプトを作成していgit pull
ます。優れたGitPython ライブラリは、開始するのに最適なベースですが、git の微妙な内部動作が私を悩ませています。さて、これが私が現時点で持っているものです(簡略化された注釈付きバージョン):
repo = git.Repo(path) # get the local repo
local_commit = repo.commit() # latest local commit
remote = git.remote.Remote(repo, 'origin') # remote repo
info = remote.fetch()[0] # fetch changes
remote_commit = info.commit # latest remote commit
if local_commit.hexsha == remote_commit.hexsha: # local is updated; end
return
# for every remote commit
while remote_commit.hexsha != local_commit.hexsha:
authors.append(remote_commit.author.email) # note the author
remote_commit = remote_commit.parents[0] # navigate up to the parent
基本的に、次の で適用されるすべてのコミットの作成者を取得しgit pull
ます。これはうまく機能していますが、次の問題があります。
- ローカル コミットがリモート コミットより先にある場合、私のコードはすべてのコミットを最初に出力します。
- リモート コミットは複数の親を持つことができ、ローカル コミットは 2 番目の親になることができます。これは、私のコードがリモート リポジトリでローカル コミットを見つけられないことを意味します。
ローカルリポジトリの背後にあるリモートリポジトリに対処できます。同時に反対方向(ローカルからリモート)を見ると、コードが乱雑になりますが、機能します。しかし、この最後の問題は私を殺しています: ローカル コミットに一致するものを見つけるために、(潜在的に無制限の) ツリーをナビゲートする必要があります。これは単なる理論的なものではありません。私の最新の変更は、まさにこの問題を引き起こすレポ マージであったため、スクリプトが機能していません。
ローカル リポジトリの場合のように、リモート リポジトリでコミットの順序付きリストを取得するrepo.iter_commits()
と、非常に役立ちます。しかし、私はドキュメントでそれを行う方法を見つけていません。リモート リポジトリの Repo オブジェクトを取得できますか?
そこに到達する可能性のある別のアプローチはありますか?ハンマーを使用してネジを釘付けにしていますか?