Shr*_*rav 3 git python-3.x gitpython
有没有办法可以使用 gitpython 在远程存储库上获取最新提交?我不想在本地分支上执行拉取或合并之类的操作。我也不想依赖本地的 master 分支来获取这些信息。我所拥有的只是一个有效的回购协议,我正在使用它repo.remotes.origin.url来获取信息。
仅使用 repo URL,我可以获得该存储库的最新提交吗?
使用 gitpython,没有本地克隆就无法做到这一点。Git 是一个分布式系统,所以它是为用户在他们的本地存储库上操作而设计的。这些答案给出了一些不错的解释和替代方案:
您可以进行浅克隆(为了速度),使用git rev-parse或获取最新提交的 SHA git ls-remote,然后删除本地存储库。
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)
Run Code Online (Sandbox Code Playgroud)
这个更简单的解决方案使用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)
Run Code Online (Sandbox Code Playgroud)