如何使用 gitpython 在远程获取最新的提交哈希?

How to get the latest commit hash on remote using gitpython?

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

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

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

使用 gitpython - 需要本地存储库

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

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 子流程 - 不需要本地存储库

这个更简单的解决方案使用 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)

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

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