【Git 实战】三类方案实现一键推送多端仓库(Gitee & GitHub)

在日常开发中,将同一个代码库同时同步至 Gitee (做国内加速/备份)和 GitHub(面向全球受众)是一个非常普遍的需求。

本文将为你梳理三种实现一键多推的方案 ,并详细说明如何在命令行TortoiseGit (小乌龟) 以及 SourceTree 中进行配置,最后针对只推送成功了一边和 SSH 认证权限报错提供具体的排查对策。


一、 方案 1:单 Remote 绑定多 Push URLs(最推荐)

这是最优雅、最主流的做法。其原理是给同一个远程仓库别名(通常是 origin)绑定多个推送地址(pushurl)。

1. 命令行 (Command Line) 配置方法

打开终端或 Git Bash,进入你的项目根目录,依次运行以下命令:

bash 复制代码
# 1. 假设你目前已经关联了主仓库(比如 Gitee)
# 2. 为 origin 添加 GitHub 的推送地址
git remote set-url --add --push origin git@github.com:your-username/your-repository.git

# 3. 再为 origin 补上原本的 Gitee 推送地址(以防原默认推送被覆盖)
git remote set-url --add --push origin git@gitee.com:your-username/your-repository.git

验证配置

运行 git remote -v,若显示如下,说明配置成功:

text 复制代码
origin  git@gitee.com:your-username/your-repository.git (fetch)
origin  git@github.com:your-username/your-repository.git (push)
origin  git@gitee.com:your-username/your-repository.git (push)

推送命令

直接运行 git push origin master,Git 会自动串行对两个仓库发起推送。


2. TortoiseGit (小乌龟) 配置方法

  1. 在项目空白处右键 ,选择 TortoiseGit -> Settings (设置)

  2. 在左侧菜单中依次展开 Git -> 选中 Remote (远程)

  3. 在右侧 Remote 列表中选中 origin

  4. 点击右下角的 Edit local .git/config (编辑本地配置文件)

  5. 在打开的记事本中,找到 [remote "origin"] 段落,添加 pushurl 行:

    ini 复制代码
    [remote "origin"]
        url = git@gitee.com:your-username/your-repository.git
        fetch = +refs/heads/*:refs/remotes/origin/*
        pushurl = git@gitee.com:your-username/your-repository.git
        pushurl = git@github.com:your-username/your-repository.git
  6. 保存关闭记事本,应用并确定设置。


3. SourceTree 配置方法

由于 SourceTree 的常规图形界面中同样没有为单个 Remote 提供直接的多行 pushurl 编辑框,我们推荐通过以下方式在其界面内快速修改配置:

  1. 在 SourceTree 中打开你的项目。
  2. 点击右上角的 Repository (仓库) -> Repository Settings (仓库设置)
  3. 在弹出的窗口中,选择 Remotes (远程) 选项卡。
  4. 点击右侧的 Edit Config File... (编辑配置文件) 按钮。这会直接调用文本编辑器打开项目的本地 Git 配置文件。
  5. 同上,在 [remote "origin"] 段落下添加两行 pushurl 并保存关闭即可。

!TIP

配置完成后,在 SourceTree 顶部点击 Push (推送) 按钮,直接勾选本地分支并确定,SourceTree 的进度弹窗同样会依次向两个平台进行推送。


二、 方案 2:独立 Remote 别名 + 批处理脚本(灵活控制)

如果你希望保留独立性,可以给 Gitee 和 GitHub 赋予两个完全独立的 Remote 别名,再利用自动化脚本实现一键串联推送。

1. 配置两个独立的 Remotes

bash 复制代码
git remote add gitee git@gitee.com:your-username/your-repository.git
git remote add github git@github.com:your-username/your-repository.git

2. 编写一键推送脚本 (Batch/Shell)

在项目根目录下创建一个 push_all.bat (Windows 环境) 脚本文件:

bat 复制代码
@echo off
echo ===========================================
echo 开始推送代码至 Gitee 和 GitHub...
echo ===========================================

:: 获取当前当前分支名,默认为 master
set branch=master
if not "%1"=="" set branch=%1

echo 推送至 Gitee [%branch%]...
git push gitee %branch%

echo.
echo 推送至 GitHub [%branch%]...
git push github %branch%

echo.
echo 同步完成!
pause
  • 使用方式 :未来有改动提交后,直接在根目录双击运行 push_all.bat 即可,或者在命令行运行 push_all.bat dev 将特定分支(如 dev)推送至多端。

三、 方案 3:使用 Git Alias 别名封装(命令行极客首选)

通过自定义 Git Alias 别名,可以将复杂的多个推送指令绑定到一个自定义的全局或本地 Git 命令行上,非常利于纯命令行开发者。

1. 配置多端别名

同方案 2,首先确保你本地绑定了两个独立的 Remote 链接(如 giteegithub):

bash 复制代码
git remote add gitee git@gitee.com:your-username/your-repository.git
git remote add github git@github.com:your-username/your-repository.git

2. 注册 Git Alias 自定义指令

在终端运行以下命令,为 Git 注册一个名为 pushall 的全局命令:

bash 复制代码
git config --global alias.pushall "!git push gitee && git push github"
  • 命令解释! 符号告诉 Git 该别名是一个外部的 shell 命令组合,它会先执行向 gitee 的推送,成功后紧接着执行向 github 的推送。

3. 如何使用?

未来在任何需要推送的仓库下,只需在终端敲下:

bash 复制代码
git pushall

Git 就会像内置命令一样,自动一键同步多端!


四、 场景处理:只推送成功了一个平台,如何补推?

情况:在本地修改已全部 Commit 提交后,因为之前未配双推或者某一侧连接报错,只推到了 Gitee,而 GitHub 尚未同步。

解决办法:直接再次发起 Push

Git 在检测本地更新时,会对每个 pushurl 或 remote 目的地进行独立校验。

  • 针对方案 1 :直接在小乌龟右击选择 Push,或者运行 git push origin master。Git 会对已同步的 Gitee 提示 Everything up-to-date,并自动把所有历史提交同步推送给先前缺失的 GitHub 平台。
  • 针对方案 2 & 3 :直接单独执行 git push github master 或者是运行你的 pushall 命令补推即可。

五、 突发排查:解决 SSH 公钥拒绝 (Permission denied) 报错

如果推送 GitHub 时报 Permission denied (publickey) 错误,可用以下几种方式排查:

1. 将 TortoiseGit 的 SSH 客户端换为原生 OpenSSH

小乌龟默认使用 PuTTY 的 Plink 客户端进行 SSH 握手,它无法读取 OpenSSH 的默认密钥(即 C:\Users\用户名\.ssh\id_rsa)。

  • 解决 :在 TortoiseGit Settings -> Network -> SSH client 处,将路径改为 Git 安装目录下的 ssh.exe(通常在 C:\Program Files\Git\usr\bin\ssh.exe)。

2. 为多套 SSH Key 配置路由规则 (config 文件)

如果你为 Gitee 和 GitHub 分别生成了不同的密钥(如 id_rsa_giteeid_rsa_github):

  • C:\Users\你的用户名\.ssh\ 目录下新建一个名为 config(无后缀名)的文本文件。

  • 填入路由规则:

    text 复制代码
    Host gitee.com
        HostName gitee.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa
    
    Host github.com
        HostName github.com
        PreferredAuthentications publickey
        IdentityFile ~/.ssh/id_rsa_github

3. 保底方案:改用 HTTPS 地址

将你本地配置中的 GitHub SSH 链接:git@github.com:your-username/your-repository.git

直接替换为 HTTPS 链接:https://github.com/your-username/your-repository.git

保存后再次推送。此时系统会提示你进行弹窗登录授权,授权完毕即可瞬间成功推送,彻底绕过复杂的 SSH 凭证配置。

相关推荐
鹏毓网络科技2 天前
Cursor Rules 文件配置实战:3 个隐藏参数让我每月少写 40% 样板代码
前端·github
嘻嘻仙人2 天前
Ubuntu中 git上传自己的项目和二次上传一般流程
git·github
Patrick_Wilson2 天前
Squash Merge 的血缘陷阱:为什么删掉的代码又活了过来
前端·git·程序员
白鲸开源2 天前
Apache SeaTunnel Zeta Engine 的 Basic Auth 是怎么工作的?
java·vue.js·github
白鲸开源2 天前
一文读懂DolphinScheduler插件机制:如何轻松扩展任务类型与数据源
java·架构·github
沉浸学习的匿名网友2 天前
什么是 .gitignore?为什么每个 Git 项目几乎都离不开它?
前端·git
徐小夕3 天前
万字拆解 JitWord:企业级实时协同文档底层架构 + 大模型 AI 融合完整实践
前端·vue.js·github
深海鱼在掘金3 天前
Git 完全指南 —— 第3章:理解工作区、暂存区、版本库三个核心
git
码流怪侠3 天前
【GitHub】Ponytail:给 AI 编码代理植入“懒人资深开发者“灵魂的开源插件深度拆解
程序员·github·ai编程
齐翊3 天前
怎么确认 AI 看懂了你的提示词?
人工智能·github·ai编程