You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测上游仓库最新提交是否存在于复刻仓库中?

自动同步上游仓库新提交的正确实现方案

问题分析

你当前遇到两个核心问题:

  1. 循环逻辑完全错误:每次循环都会无条件覆盖has_new_commits的值,哪怕之前找到和上游匹配的提交,后续不匹配的提交也会把值改回true,导致无论上游有没有新提交,最终都会判定为需要同步
  2. 提交哈希获取的误解:你提到“无法从复刻仓库获取超过1条提交”,实际上git log --format='%H'会输出所有提交哈希,只是你的循环逻辑没有正确执行,而且这种遍历所有提交的方式效率极低,Git有更高效的内置命令来完成分支对比

正确实现思路

不需要手动遍历提交哈希,利用Git的merge-base命令找到上下游分支的共同祖先,再对比上游最新提交和共同祖先的哈希,就能快速判断上游是否有本地未同步的新提交。

修正后的脚本

# 添加上游仓库(如果已添加过可省略此行)
git remote add upstream https://github.com/upstream/upstream.git
# 拉取上游仓库的最新代码和标签
git fetch upstream --tags

# 获取上游main分支与本地main分支的最近共同提交
common_commit=$(git merge-base upstream/main main)
# 获取上游main分支的最新提交哈希
upstream_latest=$(git rev-parse upstream/main)

# 判断上游是否有本地未同步的新提交
if [ "$upstream_latest" != "$common_commit" ]; then
    echo "检测到上游有新提交,开始同步..."
    git checkout main
    git rebase upstream/main
    git push -f origin main
    echo "同步完成!"
else
    echo "当前已是最新状态,无需同步。"
fi

关键命令解释

  • git merge-base upstream/main main:找到上游分支和本地分支的最近共同祖先提交,这个提交是两者都包含的最后一个节点
  • git rev-parse upstream/main:获取上游分支的最新提交哈希
  • 对比两者哈希:如果不相等,说明上游分支在共同祖先之后有新提交,需要同步;如果相等,说明本地已经包含上游所有提交

对原始代码的补充说明

你之前尝试的git rev-list -n 30 main和git log --format='%H'都能正确获取提交哈希,但用遍历的方式对比完全是绕远路,而且循环逻辑错误导致判断失效。上面的方案用Git原生命令完成判断,既高效又准确。

内容的提问来源于stack exchange,提问作者theycallmepix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 23:01:03