GitPython эквивалент git удаленного шоу происхождения?

Я пытаюсь обновить скрипт Python, который проверяет состояние нескольких локальных репозиториев по сравнению с удаленными с помощью subprocess на использование GitPython. Что такое эквивалентная команда в GitPython для git remote show origin или как лучше проверить, является ли локальное хранилище быстро перемотанным или устаревшим< /em> (и т. д.)?

$ git remote show origin
* remote origin
  Fetch URL: <url>
  Push  URL: <url>
  HEAD branch: master
  Remote branches:
    XYZ    tracked
    master tracked
  Local branches configured for 'git pull':
    XYZ    merges with remote XYZ
    master merges with remote master
  Local refs configured for 'git push':
    XYZ    pushes to XYZ    (up to date)
    master pushes to master (up to date)

Последние две строчки меня больше всего интересуют. Похоже, что это возможно с помощью GitPython путем перебора git.Repo.heads и git.Repo.remotes.origin.refs и сравнения хэшей .master.commit (и т. д.). Кажется, что это намного больше работы, чем приведенная выше единственная собственная команда git, и потребуется еще больше работы, чтобы определить, какие стороны устарели. Я ожидал чего-то вроде git.Repo.remotes.origin.status(). Как правильно определить это в GitPython?


person wes    schedule 01.10.2012    source источник


Ответы (2)


Вы можете использовать git.cmd.Git(), если gitpython не поддерживает желаемую функциональность. Он напрямую вызывает git, так что это довольно удобно, хотя я думаю, что в основном это просто оболочка подпроцесса:

import git

g = git.cmd.Git("/path/to/git/repo")
print(g.execute("git remote show origin"))  # git remote show origin
print(g.execute(["git", "remote", "show", "origin"]))  # same as above
print(g.remote(verbose=True))  # git remote --verbose
person Michał Góral    schedule 28.11.2015

Я не знаю ничего лучше, чем запуск git remote show origin в качестве подпроцесса, если вам нужен краткий отчет по каждой ветке. Если вы заинтересованы в одной ветке, предполагая, что вы сделали выборку, вы можете проверить, сколько коммитов вы позади или впереди, следующим образом:

commits_behind = list(repo.iter_commits(
            '{branch}..{tracking_branch}'.format(
                branch=branch,
                tracking_branch=repo.heads[branch].tracking_branch())))

commits_ahead = list(repo.iter_commits(
            '{tracking_branch}..{branch}'.format(
                branch=branch,
                tracking_branch=repo.heads[branch].tracking_branch())))
person Mark Riggins    schedule 17.04.2015