【问题标题】:How to get the latest commit hash on remote using gitpython?如何使用 gitpython 在远程获取最新的提交哈希?
【发布时间】:2020-06-23 00:10:55
【问题描述】:

有没有一种方法可以使用 gitpython 获取远程存储库上的最新提交? 我不想在我的本地分支上执行诸如拉取或合并之类的操作。我也不想依赖我本地的 master 分支来获取这些信息。我所拥有的只是一个有效的回购协议,我正在使用repo.remotes.origin.url 来获取信息。

仅使用 repo URL,我可以获得该存储库的最新提交吗?

【问题讨论】:

  • fetch 怎么样,可以吗?
  • @matt 好吧,是的,这可以工作。我想知道我是否可以在不处理 github 令牌的情况下以某种方式实现这一目标
  • @Shrav 我在下面的回复回答了你的问题,还是你想继续挖掘?我知道这并不理想,但生活就是这样。
  • @DV82XL 谢谢!它确实回答了我的问题。但是,我的用例有点不同,因为我必须在 Buildkite 上执行此操作,而无需安装 ssh 凭据。我最终创建了一个新插件,用​​于在 docker 容器内执行 git 操作之前设置 repo。

标签: python-3.x git gitpython


【解决方案1】:

可以使用gitpython 进行操作,而无需先创建本地存储库:

remote_heads = git.cmd.Git().ls_remote(repo_url, heads=True)

【讨论】:

  • 虽然没有记录,但它可以工作。
【解决方案2】:

使用 gitpython,如果没有本地克隆,您将无法做到这一点。 Git 是一个分布式系统,因此它是为用户在其本地存储库上操作而设计的。这些答案给出了一些不错的解释和替代方案:

使用 gitpython - 需要本地仓库

您可以进行浅层克隆(为了速度),使用 git rev-parsegit ls-remote 获取最新的提交 SHA,然后删除本地 repo。

import git
from pathlib import Path

repo_url = 'https://github.com/path/to/your/repo.git'
local_repo_dir = Path('/path/to/your/repo')

# delete the repo if it exists, perform shallow clone, get SHA, delete repo
local_repo_dir.unlink(missing_ok=True)
repo = git.Repo.clone_from(repo_url, local_repo_dir, depth=1)
sha = repo.rev_parse('origin/master')
local_repo_dir.unlink()
print(sha)

使用 python 子进程 - 不需要本地 repo

这个更简单的解决方案使用git ls-remote,它不需要本地克隆。以下使用subprocess 从远程仓库获取给定分支的 SHA-1,无需本地克隆。请注意,需要通过在第一个选项卡处拆分来从输出响应中提取 SHA。

import subprocess
import re

repo_url = 'https://github.com/path/to/your/repo.git'
process = subprocess.Popen(["git", "ls-remote", repo_url], stdout=subprocess.PIPE)
stdout, stderr = process.communicate()
sha = re.split(r'\t+', stdout.decode('ascii'))[0]
print(sha)

【讨论】:

  • git ls-remote 不需要本地克隆,您可以给它一个远程 URL 作为参数。我不认为gitpython 可以处理它。
  • 没错。 git ls-remote 必须使用子进程调用来调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多