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中的CPU实现上下文切换

    Linux中的CPU实现上下文切换

    这篇文章主要介绍了Linux中的CPU实现上下文切换方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-02-02
  • Linux跨服务器文件传输的操作步骤

    Linux跨服务器文件传输的操作步骤

    scp命令是Secure Copy的缩写,可以在不同的Linux服务器之间安全地复制文件,这篇文章主要介绍了Linux跨服务器文件传输的操作步骤,需要的朋友可以参考下
    2024-07-07
  • linux DMA接口知识点详解

    linux DMA接口知识点详解

    在本篇文章里小编给大家整理了关于linux DMA接口知识点内容,需要的朋友们可以学习参考下。
    2020-02-02
  • Linux(CentOS)安装Nginx图文教程

    Linux(CentOS)安装Nginx图文教程

    本文文介绍了两种安装Nginx的方式:通过yum安装和通过编译源码包安装,yum安装简单,全程无忧,但需root权限;编译安装需具备配置相关操作,但安装后可能定制化更强,最后附上了设置Nginx服务开机启动的方法
    2026-04-04
  • Linux环境(CentOS6.7 64位)下安装subversion1.9.5的方法

    Linux环境(CentOS6.7 64位)下安装subversion1.9.5的方法

    这篇文章主要介绍了Linux环境(CentOS6.7 64位)下安装subversion1.9.5的方法,结合实例形式分析了CentOS下安装subversion1.9.5的相关步骤、命令及操作注意事项,需要的朋友可以参考下
    2018-04-04
  • Apache Airflow 快速入门教程应用场景分析

    Apache Airflow 快速入门教程应用场景分析

    ApacheAirflow是一个用于编排、调度和监控工作流的开源平台,适用于ETL和MLOps用例,它通过有向无环图(DAG)定义管道,支持任务依赖关系、调度、错误处理和日志记录,本文介绍Apache Airflow 快速入门教程,感兴趣的朋友一起看看吧
    2024-12-12
  • C语言中 malloc,calloc,realloc的区别

    C语言中 malloc,calloc,realloc的区别

    这篇文章主要介绍了C语言中 malloc、calloc、realloc的区别的相关资料,需要的朋友可以参考下
    2017-02-02
  • Linux上MySQL通过图形化界面操作方式

    Linux上MySQL通过图形化界面操作方式

    本文介绍了MySQL图形化工具Workbench的优势、安装与配置流程,并通过多个实际操作案例,展示其在数据库查询与管理中的高效性,总结指出,Workbench作为官方工具极大提升了开发和管理效率
    2025-10-10
  • centos查找已安装的jdk路径的方法

    centos查找已安装的jdk路径的方法

    本篇文章主要介绍了centos查找已安装的jdk路径的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 一文详解Linux中的fork机制

    一文详解Linux中的fork机制

    fork() 是一种系统调用,用于在操作系统中创建新进程,当 fork() 被调用时,会生成一个当前进程的副本(称为子进程),而原始进程则被称为父进程,本文给大家详细介绍了Linux中的fork机制,需要的朋友可以参考下
    2025-03-03

最新评论