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

如何仅同步最新变更实现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轻量判断备份仓库是否有对应分支,避免推送时的分支不存在报错。
  • 提交哈希对比:这是判断分支是否有变更的核心,只有当两个分支最新提交不一样时才会推送,真正实现增量同步。
  • 自动分支处理:本地没有对应分支时自动创建,已有则直接切换,无需手动干预。

使用说明

  1. 给脚本添加执行权限:
chmod +x sync-branches.sh
  1. 在仓库根目录运行脚本:
./sync-branches.sh

额外提示

  • 第一次运行脚本时,备份仓库如果没有任何分支,会推送所有GitHub仓库的分支,这是正常的初始化操作,之后每次运行都是增量同步。
  • 如果需要同步标签,可以在脚本末尾添加标签同步逻辑(对比标签哈希,只推送新标签或更新的标签),有需要的话可以随时调整。
  • 大仓库下,git fetch本身就是增量操作,只会拉取本地没有的提交,不会占用过多磁盘和带宽,比git push --mirror高效太多。

内容的提问来源于stack exchange,提问作者A-_-S

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 17:32:27