如何仅同步最新变更实现Git远程仓库增量备份脚本编写
刚好处理过类似的大仓库分支增量同步需求,给你写个实用的bash脚本,完全满足你只同步变更分支的要求,不用每次全量推送浪费带宽和时间。
前置准备
首先确保本地仓库已经配置好两个远程仓库,假设主仓库叫githubRemote,备份仓库叫otherRemote:
# 替换成你的实际仓库地址 git remote add githubRemote git@github.com:your-username/your-repo.git git remote add otherRemote git@backup-server.com:your-username/your-repo-backup.git
增量同步脚本
创建一个名为sync-branches.sh的脚本,内容如下:
#!/bin/bash # 拉取两个远程仓库的最新分支与提交信息(增量拉取,不会全量下载) git fetch githubRemote --prune git fetch otherRemote --prune # 获取githubRemote的所有远程分支名(排除HEAD引用,去掉远程前缀) github_branches=$(git branch -r | grep 'githubRemote/' | grep -v HEAD | sed 's/githubRemote\///') # 遍历每个分支进行同步判断 for branch in $github_branches; do # 检查备份仓库是否存在当前分支 if git ls-remote --heads otherRemote "$branch" | grep -q "$branch"; then # 获取两个远程分支的最新提交哈希 github_latest_hash=$(git rev-parse githubRemote/"$branch") other_latest_hash=$(git rev-parse otherRemote/"$branch") # 对比提交哈希,不一致则同步 if [ "$github_latest_hash" != "$other_latest_hash" ]; then echo "[同步] 分支 $branch 存在变更,开始推送..." # 切换到本地分支(不存在则基于远程分支创建) git checkout -b "$branch" githubRemote/"$branch" 2>/dev/null || git checkout "$branch" # 推送到备份仓库 git push otherRemote "$branch" else echo "[跳过] 分支 $branch 无变更,无需同步" fi else echo "[新增] 备份仓库不存在分支 $branch,推送新分支..." git checkout -b "$branch" githubRemote/"$branch" git push otherRemote "$branch" fi done # 切回脚本运行前的原分支(可选,提升使用体验) git checkout -
脚本关键逻辑解释
git fetch --prune:不仅增量拉取最新提交,还会清理本地已不存在的远程分支引用,保持分支列表准确。- 分支列表提取:通过过滤和字符串处理,拿到纯分支名,方便后续操作。
- 分支存在性检查:用
git ls-remote轻量判断备份仓库是否有对应分支,避免推送时的分支不存在报错。 - 提交哈希对比:这是判断分支是否有变更的核心,只有当两个分支最新提交不一样时才会推送,真正实现增量同步。
- 自动分支处理:本地没有对应分支时自动创建,已有则直接切换,无需手动干预。
使用说明
- 给脚本添加执行权限:
chmod +x sync-branches.sh
- 在仓库根目录运行脚本:
./sync-branches.sh
额外提示
- 第一次运行脚本时,备份仓库如果没有任何分支,会推送所有GitHub仓库的分支,这是正常的初始化操作,之后每次运行都是增量同步。
- 如果需要同步标签,可以在脚本末尾添加标签同步逻辑(对比标签哈希,只推送新标签或更新的标签),有需要的话可以随时调整。
- 大仓库下,
git fetch本身就是增量操作,只会拉取本地没有的提交,不会占用过多磁盘和带宽,比git push --mirror高效太多。
内容的提问来源于stack exchange,提问作者A-_-S
相关产品推荐
相关产品推荐

