如何判断Git镜像推送是否有内容?避免无变更时解归档仓库
解决方案
要判断git push --mirror是否会产生实际推送内容,最直接可靠的方式是用Git的--dry-run参数模拟推送操作,根据模拟结果决定是否执行仓库解归档。以下是修改后的脚本及说明:
修改后的同步脚本
git remote set-url origin ssh://oldorigin git fetch --all --tags git remote update git remote set-url origin ssh://neworigin # 模拟镜像推送,捕获全部输出结果 push_result=$(git push --dry-run --mirror 2>&1) # 判断是否有内容需要推送 if [[ ! "$push_result" =~ "Everything up-to-date" ]]; then gh repo unarchive git push --mirror gh repo archive fi
关键逻辑说明
git push --dry-run --mirror:该命令会完整模拟镜像推送的流程,但不会对远程仓库做任何实际修改。如果没有内容需要推送,输出会包含Everything up-to-date;如果有提交、分支或标签需要同步,会输出具体的推送动作。2>&1:把Git命令的标准错误输出重定向到标准输出,确保能捕获到所有推送相关的提示信息,避免遗漏判断依据。- 条件判断:只有当模拟推送结果中不包含
Everything up-to-date时,才执行解归档、推送、重新归档的流程,彻底避免无意义的仓库状态变更。
补充说明
因为目标源是全新仓库,第一次执行脚本时,--dry-run必然会显示需要推送所有内容,因此会自动触发解归档和推送操作,符合预期需求。后续同步时,只有旧源出现新提交、分支或标签变更时,才会切换仓库的归档状态。
内容的提问来源于stack exchange,提问作者KamilCuk
相关产品推荐
相关产品推荐

