如何快速克隆Git仓库并获取两次提交间的补丁日志?
加速获取Git远程仓库两次提交间补丁日志的方法
你当前的操作流程是:
GIT_TERMINAL_PROMPT=0 git clone --no-checkout --filter=blob:none https://${repo}.git tmp cd tmp git log --no-merges --first-parent --patch ${base_sha}..${head_sha} > log.patch
克隆仅需约1秒,但生成日志环节很慢——每条提交都会触发一次网络请求,请求间延迟高,单条提交耗时超1秒。问题根源在于--filter=blob:none克隆时没有拉取提交对应的blob内容,git log --patch需要这些内容时只能逐条远程请求。以下是几种更快的实现方式:
方法一:一次性拉取提交区间的完整对象
放弃--filter=blob:none,直接拉取指定区间的所有必要对象,避免后续零散请求:
GIT_TERMINAL_PROMPT=0 git clone --no-checkout --depth 1 --shallow-exclude=${base_sha} https://${repo}.git tmp cd tmp # 拉取base_sha,若提交区间较大可适当调大depth值 git fetch --depth=1000000 origin ${base_sha} git log --no-merges --first-parent --patch ${base_sha}..${head_sha} > log.patch
或者更精准的初始化+拉取方式:
mkdir tmp && cd tmp git init git remote add origin https://${repo}.git # 先拉取区间的首尾提交 git fetch origin ${base_sha}:${base_sha} ${head_sha}:${head_sha} # 协商拉取区间内的所有对象 git fetch origin --negotiate-only ${base_sha}..${head_sha} git log --no-merges --first-parent --patch ${base_sha}..${head_sha} > log.patch
方法二:让远程服务器生成补丁后返回
如果远程仓库支持,直接让服务器生成补丁并一次性传输,本地无需处理零散对象:
# 先拉取提交区间,再本地生成补丁 git fetch origin ${base_sha}..${head_sha} git format-patch --no-merges --first-parent ${base_sha}..${head_sha} -o ./patches
若服务器允许远程执行命令,还可以直接让远程生成补丁后返回:
git remote exec origin "cd $(basename ${repo}) && git format-patch --no-merges --first-parent ${base_sha}..${head_sha}" > log.patch
注:远程exec方式需要服务器开启相关权限,不一定通用。
方法三:批量预拉取所需的blob内容
如果坚持用--filter=blob:none克隆,可先批量拉取区间内提交涉及的所有blob,再生成日志:
GIT_TERMINAL_PROMPT=0 git clone --no-checkout --filter=blob:none https://${repo}.git tmp cd tmp # 拉取区间内的所有提交 git fetch origin ${base_sha}..${head_sha} # 批量拉取这些提交关联的所有blob git cat-file --batch-check='%(objectname) %(objecttype)' < <(git log --no-merges --first-parent ${base_sha}..${head_sha} --pretty=format:"%T") | grep blob | cut -d' ' -f1 | git cat-file --batch > /dev/null # 生成补丁日志 git log --no-merges --first-parent --patch ${base_sha}..${head_sha} > log.patch
这个方法把零散的blob请求合并成批量请求,大幅降低总延迟。
内容的提问来源于stack exchange,提问作者Sam Stern
相关产品推荐
相关产品推荐

