git同时多仓库推送笔记
Git 双仓库推送配置教程
本教程介绍如何配置 Git 同时推送到多个远程仓库(如 Gitee + GitHub),实现代码的自动同步备份。
📋 目录
为什么需要双仓库推送
使用场景
- 国内加速:Gitee 国内访问快,GitHub 国际通用
- 灾备备份:一个平台故障时,另一个仍可用
- 协作便利:不同团队使用不同平台
- 开源发布:GitHub 面向国际,Gitee 面向国内用户
优势
- ✅ 一次推送,多仓同步
- ✅ 无需手动分别推送
- ✅ IDEA/VS Code 等工具无缝支持
- ✅ 保持提交历史一致
前置条件
1. 已初始化的 Git 仓库
确保你的项目已经初始化并至少有一次提交:
git init
git add .
git commit -m "initial commit"
2. 两个远程仓库
- Gitee 仓库:
https://gitee.com/用户名/仓库名.git - GitHub 仓库:
https://github.com/用户名/仓库名.git
💡 如果还没有创建仓库,先在两个平台上创建空仓库(不要初始化 README)。
3. 认证凭据
Gitee
- 账号密码,或
- Personal Access Token(推荐)
GitHub
- Personal Access Token(必须,GitHub 已禁用密码认证)
生成 GitHub Token 步骤:
- 访问 https://github.com/settings/tokens
- 点击 "Generate new token (classic)"
- 勾选权限:
repo(完整仓库权限) - 生成并复制 Token(⚠️ 只显示一次,请妥善保存)
配置步骤
方法一:使用 origin 多推送地址(推荐)
这是最简洁的方案,只需配置一个远程名称 origin,但包含多个推送地址。
Step 1: 添加第一个远程仓库(Gitee)
# 添加 Gitee 作为 origin
git remote add origin https://gitee.com/用户名/仓库名.git
Step 2: 添加第二个推送地址(GitHub)
# 为 origin 添加 GitHub 推送地址
git remote set-url --add --push origin https://github.com/用户名/仓库名.git
Step 3: 再次添加 Gitee 推送地址
# 确保 origin 也有 Gitee 的推送地址
git remote set-url --add --push origin https://gitee.com/用户名/仓库名.git
⚠️ 重要:必须先执行 Step 2,再执行 Step 3,顺序不能错!
Step 4: 验证配置
git remote -v
预期输出:
origin https://gitee.com/用户名/仓库名.git (fetch)
origin https://github.com/用户名/仓库名.git (push)
origin https://gitee.com/用户名/仓库名.git (push)
说明:
fetch:只有一个,表示从 Gitee 拉取代码push:有两个,表示推送到两个仓库
方法二:使用多个远程名称
如果你希望更明确地区分两个仓库,可以使用不同的远程名称。
Step 1: 添加两个远程仓库
# 添加 Gitee
git remote add gitee https://gitee.com/用户名/仓库名.git
# 添加 GitHub
git remote add github https://github.com/用户名/仓库名.git
Step 2: 验证配置
git remote -v
预期输出:
gitee https://gitee.com/用户名/仓库名.git (fetch)
gitee https://gitee.com/用户名/仓库名.git (push)
github https://github.com/用户名/仓库名.git (fetch)
github https://github.com/用户名/仓库名.git (push)
Step 3: 推送时需要分别执行
# 推送到 Gitee
git push gitee master
# 推送到 GitHub
git push github master
或者创建别名简化操作:
# 创建一键推送别名
git config alias.push-all "!git push gitee master && git push github master"
# 使用
git push-all
使用方法
在命令行中推送
方法一配置(推荐)
# 推送到所有配置的远程仓库
git push origin master
Git 会自动依次推送到 Gitee 和 GitHub。
方法二配置
# 使用别名一键推送
git push-all
# 或分别推送
git push gitee master && git push github master
在 IntelliJ IDEA 中推送
方法一配置(推荐)
-
打开 Push 对话框
- 菜单栏:
Git→Push - 快捷键:
Ctrl+Shift+K
- 菜单栏:
-
点击 Push 按钮
- IDEA 会自动推送到所有配置的推送地址
- 会依次显示 Gitee 和 GitHub 的推送状态
-
查看结果
- 成功会显示 "Pushed to origin"
- 失败会显示具体错误信息
使用工具栏按钮
- 点击右上角的 Git Push 按钮(蓝色向上箭头 ↑)
- 效果与菜单操作相同
在 VS Code 中推送
- 点击左侧活动栏的 源代码管理 图标
- 点击 ... 更多选项
- 选择 Push
- VS Code 会推送到所有配置的远程仓库
常见问题
Q1: 推送时提示认证失败?
Gitee 认证失败:
# 清除旧凭据
git credential-manager-core erase
# 重新推送,会提示输入新凭据
git push origin master
GitHub 认证失败:
remote: Support for password authentication was removed on August 13, 2021.
解决方案:
- 使用 Personal Access Token 代替密码
- Windows 用户在凭据管理器中更新 GitHub 凭据
- 或在 URL 中嵌入 Token(不推荐,不安全):
git remote set-url --add --push origin https://用户名:TOKEN@github.com/用户名/仓库名.git
Q2: 其中一个仓库推送失败怎么办?
现象:
Pushing to https://gitee.com/用户名/仓库名.git
Success!
Pushing to https://github.com/用户名/仓库名.git
error: Authentication failed
解决方案:
- 检查失败仓库的认证凭据
- 单独重新推送失败的仓库:
# 方法一配置 git push origin master # 会再次尝试两个仓库 # 方法二配置 git push github master # 只推送 GitHub
Q3: 如何修改或删除推送地址?
查看所有推送地址:
git remote -v
删除某个推送地址:
# 先查看所有地址
git remote get-url --push origin
# 删除后重新添加正确的
git remote set-url --delete --push origin <错误的URL>
git remote set-url --add --push origin <正确的URL>
重置所有推送地址:
# 清除所有推送地址
git remote set-url --push --delete origin
# 重新添加
git remote set-url --add --push origin https://gitee.com/用户名/仓库名.git
git remote set-url --add --push origin https://github.com/用户名/仓库名.git
Q4: 拉取代码时会从哪个仓库拉取?
答案: 从 fetch 配置的仓库拉取。
在方法一配置中:
origin https://gitee.com/用户名/仓库名.git (fetch) ← 从这里拉取
origin https://github.com/用户名/仓库名.git (push)
origin https://gitee.com/用户名/仓库名.git (push)
所以 git pull 会从 Gitee 拉取代码。
如果想从 GitHub 拉取:
git pull github master # 仅适用于方法二配置
Q5: 如何切换默认的 fetch 源?
# 修改 fetch 地址为 GitHub
git remote set-url origin https://github.com/用户名/仓库名.git
# 保留原有的推送地址不变
git remote set-url --add --push origin https://gitee.com/用户名/仓库名.git
git remote set-url --add --push origin https://github.com/用户名/仓库名.git
Q6: 推送顺序有影响吗?
答案: 没有影响。Git 会按添加顺序依次推送,任何一个失败不影响其他仓库。
但你可以通过调整添加顺序来控制优先级:
# 先添加的会先推送
git remote set-url --add --push origin https://gitee.com/用户名/仓库名.git # 先推送
git remote set-url --add --push origin https://github.com/用户名/仓库名.git # 后推送
最佳实践
1. 使用 HTTPS 而非 SSH(推荐新手)
HTTPS 优点:
- ✅ 配置简单
- ✅ 防火墙友好
- ✅ 可使用 Token 认证
SSH 优点:
- ✅ 无需每次输入密码
- ✅ 更安全
SSH 配置示例:
git remote set-url --add --push origin git@gitee.com:用户名/仓库名.git
git remote set-url --add --push origin git@github.com:用户名/仓库名.git
2. 定期同步检查
# 检查两个仓库是否一致
git fetch gitee
git fetch github
# 比较分支状态
git log gitee/master..github/master
git log github/master..gitee/master
如果有差异,说明某个仓库推送失败,需要重新推送。
3. 使用 CI/CD 自动同步
对于重要项目,可以配置 GitHub Actions 自动同步到 Gitee:
.github/workflows/sync-to-gitee.yml
name: Sync to Gitee
on:
push:
branches: [master]
jobs:
sync:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v3
with:
fetch-depth: 0
- name: Sync to Gitee
uses: Yikun/hub-mirror-action@master
with:
src: github/用户名
dst: gitee/用户名
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
static_list: "仓库名"
force_update: true
4. 保护敏感信息
不要提交的内容:
- ❌
.env文件(含密钥) - ❌
settings.xml(含 Maven 密码) - ❌
id_rsa/id_ed25519(SSH 私钥) - ❌ 任何含 Token/Password 的文件
添加到 .gitignore:
# 敏感配置文件
.env
settings.xml
*.pem
*.key
# IDE 配置
.idea/
.vscode/
# 构建产物
target/
build/
5. 分支策略建议
master/main - 主分支,保持稳定,双仓库同步
develop - 开发分支,可选同步
feature/* - 功能分支,通常只在主要仓库
推荐: 只同步 master 分支,功能分支在主要仓库开发即可。
快速参考卡片
方法一:单远程多推送(推荐)
# 初始化
git remote add origin https://gitee.com/用户名/仓库名.git
git remote set-url --add --push origin https://github.com/用户名/仓库名.git
git remote set-url --add --push origin https://gitee.com/用户名/仓库名.git
# 推送
git push origin master
# 查看配置
git remote -v
方法二:多远程独立管理
# 初始化
git remote add gitee https://gitee.com/用户名/仓库名.git
git remote add github https://github.com/用户名/仓库名.git
# 创建别名
git config alias.push-all "!git push gitee master && git push github master"
# 推送
git push-all
# 查看配置
git remote -v
相关资源
版本历史
| 版本 | 日期 | 说明 |
|---|---|---|
| 1.0 | 2024-01-01 | 初始版本 |

浙公网安备 33010602011771号