如何无需克隆仓库获取远程Git仓库特定时间的非最新SHA-1哈希?
Git仓库分支历史SHA-1查询方案
问题背景
我现在用以下脚本遍历多个Git仓库,获取各分支的最新提交SHA-1,全程不用克隆仓库:
git ls-remote https://$Username:$Password@git.testgit.com/r/repository1 > tmp/repository1 ... git ls-remote https://$Username:$Password@git.testgit.com/r/repository100 > tmp/repository100
每个git ls-remote的输出示例(以repository1为例):
7898b741a5c6b7bd5ks93478600165905c3e96d2 HEAD 57e9fm46caf48eb82863e0278ee17c9332ee20d4 refs/heads/development 7898b741a5c6b7bd5ks93478600165905c3e96d2 refs/heads/master
之后我会提取并保存这些SHA-1,比如current_repository1_ref_heads_development=57e9fm46caf48eb82863e0278ee17c9332ee20d4。
现在我想知道:能不能在无需克隆任何仓库的前提下,获取非最新(非heads)且在特定时间前(比如60分钟前)推送的SHA-1,用来对比当前分支SHA和之前的是否一致?
可行方案
1. 用浅克隆+时间限制获取指定时间的分支状态
git ls-remote只能拿到当前最新的引用状态,拿不到历史记录,但可以用浅克隆只拉取指定时间范围内的分支数据,操作步骤如下:
# 浅克隆指定分支,只拉取60分钟前的状态 git clone --depth 1 --shallow-since="60 minutes ago" https://$Username:$Password@git.testgit.com/r/repository1 --branch development tmp/repo1-tmp # 获取该时间点的分支SHA-1 cd tmp/repo1-tmp && git rev-parse HEAD # 用完删除临时目录 cd ../.. && rm -rf tmp/repo1-tmp
这种方法只拉取极少的历史数据,速度快,几乎和ls-remote效率差不多。
2. 利用Git服务器内置API(如果支持)
如果你的Git服务器(比如GitLab、Gitea等)提供REST/GraphQL API,可以直接调用接口查询分支的提交历史,筛选出60分钟前的提交SHA-1。比如可以查询分支的提交列表,按时间排序后取符合条件的记录。不过这个方案依赖服务器的API支持,需要参考对应服务器的文档。
3. 本地维护分支SHA的历史记录
最省心的方法是自己存历史:每次运行脚本获取当前SHA时,把SHA和当前时间戳一起写到一个历史文件里(比如repo-sha-history.txt),格式可以是:
2024-05-20 14:30:00 repository1 development 57e9fm46caf48eb82863e0278ee17c9332ee20d4
之后需要对比时,直接从历史文件里筛选出60分钟前的记录,取出对应的SHA即可。这种方法完全不需要额外请求Git服务器,逻辑最简单。
内容的提问来源于stack exchange,提问作者Sovenique
相关产品推荐
相关产品推荐

