Я пишу скрипт 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
. Это работает хорошо, но у него есть следующие проблемы:
- Когда локальный коммит опережает удаленный, мой код просто печатает все коммиты до первого.
- Удаленный коммит может иметь более одного родителя, а локальный коммит может быть вторым родителем. Это означает, что мой код никогда не найдет локальный коммит в удаленном репозитории.
Я могу справиться с удаленными репозиториями, находящимися за локальным: просто посмотрите в другом направлении (локально-удаленно) в то же время, код становится грязным, но он работает. Но эта последняя проблема убивает меня: теперь мне нужно создать дерево (потенциально неограниченное), чтобы найти соответствие для локальной фиксации. Это не просто теоретически: мое последнее изменение было объединением репо, которое представляет эту проблему, поэтому мой сценарий не работает.
Было бы очень полезно получить упорядоченный список коммитов в удаленном репозитории, например, repo.iter_commits()
для локального репо. Но я не нашел в документации , как это сделать. Могу ли я просто получить объект Repo для удаленного хранилища?
Есть ли другой подход, который может привести меня туда, и я использую молоток, чтобы гвоздить винты?