如何检测上游仓库最新提交是否存在于复刻仓库中?
自动同步上游仓库新提交的正确实现方案
问题分析
你当前遇到两个核心问题:
- 循环逻辑完全错误:每次循环都会无条件覆盖
has_new_commits的值,哪怕之前找到和上游匹配的提交,后续不匹配的提交也会把值改回true,导致无论上游有没有新提交,最终都会判定为需要同步 - 提交哈希获取的误解:你提到“无法从复刻仓库获取超过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
相关产品推荐
相关产品推荐

