9

我正在尝试更新一个 Python 脚本,该脚本检查少数本地存储库的状态,从使用subprocess到使用GitPythonGitPython for中的等效命令是git remote show origin什么,或者检查本地存储库是否可快速转发过时(等)的更好方法是什么?

$ 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 命令要做更多的工作,并且需要更多的工作来判断哪一侧已经过时。我期待类似的东西。在GitPython中确定这一点的正确方法是什么?git.Repo.headsgit.Repo.remotes.origin.refs.master.commitgit.Repo.remotes.origin.status()

4

2 回答 2

3

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
于 2015-11-28T21:54:17.890 回答
1

如果您需要每个分支的简明报告,我不知道有什么比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())))
于 2015-04-17T14:03:21.550 回答