git clone--mirror同步桥详解

 更新时间:2026年05月19日 08:34:52   作者:Eloudy  
该文章主要了Git仓库同步的几种情况,包括保留mirror裸仓库、已删除裸仓库以及只想同步新tag等场景,通过创建裸仓库、fetch分支/标签等方式实现代价较低的增量同步,并在需要时写了长期自动同步的建议

情况一:之前的 mirror 裸仓库还在

如果你之前的 cuda-quantum.git(mirror 裸仓库)目录还保留着,两步搞定

cd ~/cuda-quantum.git

# Step 1: 从 a 仓库拉取最新内容(包括新 tag、新分支、新提交)
# 因为当初 mirror 时 fetch URL 仍指向 a,所以直接 fetch 即可
git fetch origin

# Step 2: 推送到 b 仓库(push URL 已指向 b)
git push --mirror

原理说明:

git clone --mirror https://a.git 创建的裸仓库有两个隐含配置:

$ git config --get remote.origin.url          # fetch URL → 仍是 a
https://a.git

$ git config --get remote.origin.pushurl      # push URL → 你改成了 b
ssh://b.git

$ git config --get remote.origin.mirror       # mirror 模式开启
true

所以 git fetch origina 拉取git push --mirrorb 推送,天然就是增量同步。

情况二:mirror 裸仓库已被删除

如果之前的裸仓库已经删了,不要重新 clone --mirror,否则会把 Bitbucket 的 refs/pull-requests/* 又拉回来导致推送失败。

正确做法是创建一个新的裸仓库,只 fetch 分支和标签

# 创建新的裸仓库
git clone --bare https://a.git project.git
cd project.git

# 配置推送到 b
git remote set-url --push origin ssh://b.git

# 推送所有分支和标签(跳过 Bitbucket 内部保留的 refs)
git push origin 'refs/heads/*:refs/heads/*'
git push origin 'refs/tags/*:refs/tags/*'

如果之前的裸仓库已经推送成功过一次,现在只剩增量问题,推荐用情况一保留裸仓库作为长期同步桥。

情况三:只想同步新 tag,不碰已有内容

如果 b 仓库已经有大部分内容,只想把 a 的新 tag 同步过去:

cd ~/cuda-quantum.git

# 获取 a 的所有新内容
git fetch origin

# 只推送新 tag
git push origin --tags

# 或:推送所有分支(只推送 b 上没有的)
git push origin 'refs/heads/*:refs/heads/*'

长期维护:建一个简单的同步脚本

如果 a 和 b 两个仓库需要长期保持同步,建议保留那个 mirror 裸仓库,并写一个定时脚本:

#!/bin/bash
# ~/sync-mirror.sh

REPO_DIR="$HOME/cuda-quantum.git"
cd "$REPO_DIR" || exit 1

echo "Fetching from source (a)..."
git fetch origin

echo "Pushing to mirror (b)..."
# 排除 Bitbucket 内部保留的命名空间
git push origin 'refs/heads/*:refs/heads/*'
git push origin 'refs/tags/*:refs/tags/*'

echo "Done."

加 crontab 每周自动同步:

crontab -e
# 添加
0 2 * * 1 /home/eili/sync-mirror.sh >> /home/eili/sync-mirror.log 2>&1

关键命令速查

需求命令
从 a 增量拉取git fetch origin(在 mirror 裸仓库中执行)
全量推送到 bgit push --mirror
只推送分支+标签(安全)git push origin 'refs/heads/*:refs/heads/*' && git push origin --tags
查看 fetch/push URLgit remote -v
查看新 taggit ls-remote --tags origin | tail -20

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Linux中实现开机自启动的几种常见方式及区别详解

    Linux中实现开机自启动的几种常见方式及区别详解

    在Linux中,有多个机制可以实现开机自启动,它们在不同的初始化系统(如SysVinit、systemd)下有不同的表现,以下是一些常见的自启动方法及其区别,需要的朋友可以参考下
    2025-11-11
  • 如何配置Apache服务器中的虚拟机

    如何配置Apache服务器中的虚拟机

    Apache 的虚拟主机就是在一台服务器上运行多个网站,每个虚拟主机都可以绑定独立的域名,为这些域名可以指定单独的目录,访问这些域名的时候,Apache 会打开对应目录里面的东西。本文给大家介绍Apache服务器虚拟机的配置方法,感兴趣的朋友一起学习吧
    2016-04-04
  • Centos定制rpm包、搭建yum仓库的教程

    Centos定制rpm包、搭建yum仓库的教程

    这篇文章主要介绍了Centos定制rpm包、搭建yum仓库的教程,感兴趣的朋友跟随小编一起看看吧
    2019-11-11
  • Linux切换root用户的几种实现方式

    Linux切换root用户的几种实现方式

    在Linux系统中,root用户为超级用户,拥有最高权限,切换到root用户的常用方法包括使用su、sudo、sudo-i和sudosu命令,每种方法适用于不同场景,需根据实际需求选择,使用root权限需谨慎,以免对系统造成损坏
    2024-11-11
  • 详解Linux文件系统:ext4及更高版本

    详解Linux文件系统:ext4及更高版本

    今天小编就为大家分享一篇关于Linux文件系统:ext4及更高版本的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2018-09-09
  • Linux下实现不活动用户登录超时后自动登出

    Linux下实现不活动用户登录超时后自动登出

    这篇文章主要介绍了Linux下实现不活动用户登录超时后自动登出 ,本文给大家带来了四种方式,每种方式都通过实例代码文字给大家介绍的非常详细,需要的朋友可以参考下
    2019-08-08
  • linux安装xmind的方法步骤

    linux安装xmind的方法步骤

    这篇文章主要介绍了linux安装xmind的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-07-07
  • 通过Linux进程id找到程序路径的三种方法

    通过Linux进程id找到程序路径的三种方法

    这篇文章主要介绍了三种在Linux中通过进程ID(PID)找到程序路径的方法:使用`ls`命令查看`/proc/PID/exe`符号链接,使用`readlink`命令直接获取路径字符串,以及使用`pwdx`命令查看进程的工作目录,需要的朋友可以参考下
    2025-11-11
  • Linux Crontab Shell脚本实现秒级定时任务的方法

    Linux Crontab Shell脚本实现秒级定时任务的方法

    这篇文章主要介绍了Linux Crontab Shell脚本实现秒级定时任务的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • yum安装模糊查询所需要的软件包的方法(推荐)

    yum安装模糊查询所需要的软件包的方法(推荐)

    下面小编就为大家带来一篇yum安装模糊查询所需要的软件包的方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11

最新评论