实现跨平台同步:详解如何将本地 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 ,感谢您的关注~

相关推荐
萧行之2 小时前
可视化技术复盘:从图形语法看 D3、Vega-Lite、ECharts、Observable Plot
前端·学习·数据可视化
尾善爱看海9 小时前
Vue 面试收官篇:SSR、性能优化落地、30 道高频面试题精讲(附标准答案)
前端·javascript·vue.js·面试·vue
驳是10 小时前
一个组件,提升 react-router 开发的幸福感
前端·preact
GreenTea10 小时前
OpenAI Agents API 上手实测:一次调用把整个 agent loop 甩给 OpenAI
前端·后端·算法
星云API技术支持10 小时前
企业微信二次开发:群权限设置、成员管理与群资料维护的接口组合实践
java·前端·企业微信
京东云开发者11 小时前
81.8 秒的视频,我们改了 15 个版本:一次纯 Codex 驱动的 AI-native 视频实践
前端·aigc
Csvn11 小时前
TypeScript 大型项目架构:从单体 tsconfig 到分层可扩展的工程
前端
计算机魔术师13 小时前
Dario Amodei 发文呼吁为前沿 AI 降速并提出三点计划
前端
计算机魔术师13 小时前
OpenAI的AI代理偷偷给RubyGems下毒,我们却毫无察觉
前端
甲维斯13 小时前
0代码,0建模,3句话开发一个3D游戏!
前端·游戏·游戏开发