实现跨平台同步:详解如何将本地 Git 仓库连接到多个云端仓库

引言

通常情况下,一个本地 Git 仓库对应一个远程仓库,每次pullpush仅涉及本地仓库和该远程仓库的同步;然而,在一些情况下,一个本地仓库需要同时关联多个远程仓库,比如:同时将一个项目发布在 GiteeCoding.net 上,以兼顾不同地区的用户访问。

那么,如何让一个本地仓库同时关联多个远程仓库呢?

解决方法

方法一:每次push、pull时需分开操作

首先,查看本地仓库所关联的远程仓库:

bash 复制代码
λ git remote -v
origin  https://gitee.com/xxxx/vite-git-test.git (fetch)
origin  https://gitee.com/xxxx/vite-git-test.git (push)

然后,用git remote add <name> <url>添加一个远程仓库,其中name可以任意指定(对应上面的origin部分),比如:

bash 复制代码
λ git remote add coding https://e.coding.net/xxxx/gittest/vite-test.git

再次查看本地仓库所关联的远程仓库,可以发现成功关联了两个远程仓库:

bash 复制代码
λ git remote -v
coding  https://e.coding.net/xxxx/gittest/vite-test.git (fetch)
coding  https://e.coding.net/xxxx/gittest/vite-test.git (push)
origin  https://gitee.com/xxxx/vite-git-test.git (fetch)
origin  https://gitee.com/xxxx/vite-git-test.git (push)

此后,若需进行push操作,则需要指定目标仓库,git push <repo> <branch>,对这两个远程仓库分别操作:

bash 复制代码
λ git push origin master
λ git push coding master

同理,pull操作也需要指定从哪个远程仓库拉取,git pull <repo> <branch>,从这两个仓库中选择其一:

bash 复制代码
λ git pull origin master
λ git pull coding master

方法二:push和pull无需额外操作

在方法一中,由于我们添加了多个远程仓库,在pushpull 时便面临了仓库的不停选择问题。但是在许多情况下,我们只需要保持远程仓库完全一致,而不需要进行区分,因而这样的区分便显得有些浪费时间。

具体操作,先查看已有的远程仓库:

bash 复制代码
λ git remote -v
origin  https://gitee.com/xxxx/vite-git-test.git (fetch)
origin  https://gitee.com/xxxx/vite-git-test.git (push)

然后,不额外添加远程仓库,而是给现有的远程仓库添加额外的 URL。使用git remote set-url -add <name> <url>,给已有的名为name的远程仓库添加一个远程地址,比如:

bash 复制代码
λ git remote set-url --add origin https://e.coding.net/xxxx/gittest/vite-demo-test.git

再次查看所关联的远程仓库:

bash 复制代码
λ git remote -v
origin  https://gitee.com/xxxx/vite-git-test.git (fetch)
origin  https://gitee.com/xxxx/vite-git-test.git (push)
origin  https://e.coding.net/xxxx/gittest/vite-demo-test.git (push)

可以看到我们并没有如方法一, 增加远程仓库的数目,而是给一个远程仓库添加了多个地址(或者准确地说,多个用于push的地址)。因此,这样设置后的pushpull操作与最初的操作完全一致,不需要进行调整。这样一次性就可以提交所有的仓库。

扩展阅读

这两种操作的本质都是改变 gitconfig 配置文件,config 文件是当前 git 项目根目录下 .git/config.git 目录是隐藏文件),使用 git config -e 或者 cat .git/config 命令行也可查看编辑内容。

bash 复制代码
[core]
        repositoryformatversion = 0
        filemode = false
        bare = false
        logallrefupdates = true
        symlinks = false
        ignorecase = true
[remote "origin"]
        url = https://gitee.com/xxxx/vite-git-test.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = https://e.coding.net/xxxx/gittest/vite-demo-test.git
[remote "coding"]
        url = https://e.coding.net/xxxx/gittest/vite-test.git
        fetch = +refs/heads/*:refs/remotes/coding/*
  • 当使用 git remote add <name> <url> 时,追加 [remote "name"] 的标签。
bash 复制代码
[remote "coding"]
        url = https://e.coding.net/xxxx/gittest/vite-test.git
        fetch = +refs/heads/*:refs/remotes/coding/*  
  • 使用 git remote set-url --add <name> <url> 会为名为<name> 的仓库添加 url 连接,比如示例中, 在 origin 下会多出一个 url 的键值对
bash 复制代码
[remote "origin"]
        url = https://gitee.com/xxxx/vite-git-test.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        url = https://e.coding.net/xxxx/gittest/vite-demo-test.git  

删除关联的远程仓库和地址

针对上面的这两种设置方法都有对应的删除命令:

bash 复制代码
# 删除名为 <name> 的远程连接
git remote remove <name>

# 删除 <name> 仓库下的指定连接
git remote set-url --delete <name> <url>

重名远程仓库

bash 复制代码
git remote rename <旧名> <新名>

写在最后

通过本篇的文章可以学习到一个本地仓库关联多个远程仓库的两种方法,喜欢的话帮忙点个赞 + 关注吧,将持续更新 前端 相关的文章,还可以关注我的公众号 梁三石FE ,感谢您的关注~

相关推荐
mCell1 天前
GSAP ScrollTrigger 详解
前端·javascript·动效
gnip1 天前
Node.js 子进程:child_process
前端·javascript
excel1 天前
为什么在 Three.js 中平面能产生“起伏效果”?
前端
excel1 天前
Node.js 断言与测试框架示例对比
前端
天蓝色的鱼鱼1 天前
前端开发者的组件设计之痛:为什么我的组件总是难以维护?
前端·react.js
codingandsleeping1 天前
使用orval自动拉取swagger文档并生成ts接口
前端·javascript
石金龙1 天前
[译] Composition in CSS
前端·css
白水清风1 天前
微前端学习记录(qiankun、wujie、micro-app)
前端·javascript·前端工程化
Ticnix1 天前
函数封装实现Echarts多表渲染/叠加渲染
前端·echarts
用户22152044278001 天前
new、原型和原型链浅析
前端·javascript