github仓库代码和gitee仓库代码双向自动同步方案

2025-09-09 21:55:35
2904字
16.1分钟
‌日常工作中,可能会遇到github代码仓库需要自动同步代码至gitee仓库,或者gitee仓库代码同步至github仓库的应用场景,针对这个应用场景,下面便归纳一下github和gitee仓库实现双向自动同步方案和步骤。

到目前为止,想要实现在本地提交代码至Github仓库时,同时更新至Gitee仓库是可行的。相反,想要在本地提交代码至Gitee仓库时,同时更新至Github仓库也可以实现的。无论我们使用Github还是Gitee任意一个远程仓库,在代码提交时,头可以自动同步到另一个远程仓库,即所谓的双向自动同步(可推送至远端仓库,亦可从远端仓库同步更新)。当然,日常开发中,按照个人喜好,我们只需要选择一种即可。

Github同步代码至Gitee或者是从Gitee更新代码,都需要借助Github Actions功能。GitHub Actions‌ 是 GitHub 提供的持续集成与持续交付(CI/CD)平台,主要用于自动化软件开发流程中的构建、测试和部署任务。通过yml格式文件配置workflow实现自动化操作,可以实现一次提交,多仓库代码同步。目前Github Actions在实现本地代码提交Github仓库时,同步代码到Gitee,可以自动触发workflow执行,实现自动同步功能。反过来,当Gitee代码库存在更新,Github从Gitee同步更新时,借助Github Actions无法实现自动,只能借助定时任务,定时从Gitee同步代码。

相对于Github同步方案而言,Gitee同步代码至Github或者从Github更新代码非常简单。借助Gitee提供的强大的仓库镜像功能,只需要在Gitee的源仓库上进行简单配置就可以实现。

下面介绍Github和Gitee双向同步的具体实现步骤。

1 Github自动同步Gitee

Github自动同步Gitee是指在本地提交代码至Github远程仓库时,同步将代码更新至Gitee仓库。目前通过Github Actions 实现Github仓库同步到gitee的Actions有很多,本文主要讲述如何使用【git-mirror-action】镜像来实现同步操作。

git-mirror-action 是一个用于自动同步 GitHub 和 Gitee(或其他 Git 平台)仓库的 GitHub Action,通过配置工作流(workflow)实现自动化部署。github仓库地址为:【wearerequired/git-mirror-action@master

核心功能如下:

  • 双向同步:支持将 GitHub 仓库同步到 Gitee 或其他平台,也可实现反向同步。
  • ‌灵活配置‌:通过 .yml 文件定义同步规则,支持源仓库与目标仓库的地址映射。
  • 自动化部署‌:结合 GitHub Actions 工作流,可在代码更新时自动触发同步操作。

同步的原理:利用 SSH 公私钥配对的方式拉取 Github 仓库的代码并推送到 Gitee 仓库中。

详细配置参考:github源码仓库文档

1.1 创建Gitee目标仓库

在实现github仓库同步到gitee仓库之前,首先需要在gitee初始化一个仓库,作为同步的目标仓库。可以直接创建一个空仓库,或者直接通过gitee自带的导入github仓库代码功能。具体导入github仓库步骤如下:

① 登陆[gitee] -> 右上角加号 -> 从github/gitlab导入仓库。进入页面后,可直接通过url输入,也可以通过github授权后,批量选择导入的仓库。

温馨提示
1 从url导入私有仓库时,需要填写仓库的账户和个人令牌。此处的令牌并非密码(github现在不建议直接账户密码认证),而是GitHub 的「Personal access token」。点击前往设置【Personal access token
2 从github导入仓库,需要github授权才行,授权后可以选择需要导入的仓库。

② 仓库导入成功后,进入仓库,仓库名称后面会显示一个 符号,点击便可手动同步github仓库代码至gitee。私有仓库同步时,需要输入账号和个人令牌(github的Personal access token)

至此,github仓库同步gitee仓库前期准备工作已准备完毕,下面开始介绍如何配置github自动同步代码至gitee。

1.2 创建SSH公私钥

SSH密钥对由公钥和私钥组成,公钥用于加密数据,私钥用于解密数据,通过非对称加密确保通信安全。使用 SSH 协议可以连接远程服务器和服务并向它们验证。 利用 SSH 密钥可以连接到 GitHub,而无需在每次访问时都提供用户名和 personal access token。GitHub通过公钥加密信息,私钥用于解密,从而确认用户身份。

①在本地机器上打开终端应用程序
②生成SSH密钥对
使用ssh-keygen命令来生成密钥对。您可以通过以下命令开始:

ssh-keygen -t rsa  -b 4096 -C "youremail@example.com"

这里,-t rsa指定了密钥的类型为RSA,-b 4096指定了密钥的位长度为4096位。RSA密钥的长度可以是1024位、2048位或4096位,推荐使用2048位或更高的安全性。-C(Comment)是 ssh-keygen 命令的一个选项,用于为生成的 SSH 密钥对添加注释。注释内容可以是任意文本,但通常推荐使用邮箱地址或密钥用途描述。注释仅保存在公钥文件中,私钥文件不包含此信息。

执行上述命令后,系统会询问您希望将密钥存储在哪个文件中,默认是~/.ssh/id_rsa(私钥)和~/.ssh/id_rsa.pub(公钥)。您可以按回车接受默认设置,或者输入其他路径来存储密钥文件。

接下来,系统会询问您是否要为密钥设置密码(passphrase)。强烈建议设置密码,因为即使私钥文件被保护,知道密码仍然可以访问您的服务器。如果您不想设置密码,可以按回车跳过此步骤。

如果连续三次回车,生成的秘钥对存储默认位置。id_rsa 为私钥,id_rsa.pub为公钥。如果提示:already exists(已经存在),则可以到电脑位置:C:\Users\电脑账号名\ .ssh 直接使用。

具体图文参考:【生成/添加SSH公钥

1.3 GitHub配置SSH私钥

打开Github需要同步的项目,点击Settings->Secrets->Actions,设置私钥名称为:GITEE_RSA_PRIVATE_KEY,值为:上面生成SSH的私钥,即id_rsa 文件的内容

1.4 GitHub配置SSH公钥

在Github点击右上角用户图像,点击Settings->SSH and GPG keys->New SSH key,名称为:GITEE_RSA_PUBLIC_KEY,值为:上面生成SSH的公钥,即id_rsa_pub文件内容

1.5 Gitee配置SSH公钥

在Gitee 设置->安全设置->SSH公钥,标题为:GITEE_RSA_PUBLIC_KEY,值为:上面生成SSH的公钥,即id_rsa_pub文件内容

1.6 创建Github workflow

github创建workflow有2种方式,第一种直接在github项目中,点击actions创建新的workflow,第二种就是将项目clone本地,进行配置。二者大同小异,都是配置相应的设置。

①第一种:点击actions创建新的workflow ②第二种:将项目clone到本地,用vscode打开,根目录下创建文件.github\workflows\sync-to-gitee.yml,内容如下:

sync-to-gitee.yml
name: Sync to Gitee
on:
    push:
        branches:
            # 或者你想要同步的分支
            - main
jobs:
    sync:
        runs-on: ubuntu-latest
        steps:
            - name: Sync to Gitee
              uses: wearerequired/git-mirror-action@master
              env:
                  # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY
                  SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}
              with:
                  # 注意替换为你的 GitHub 源仓库地址
                  source-repo: git@github.com:AnyFork/anyfork-docs-client.git
                  # 注意替换为你的 Gitee 目标仓库地址
                  destination-repo: git@gitee.com:AnyFork/anyfork-docs-client.git

至此,github workflow配置完毕。以后提交代码至github仓库时,便会触发workflow自动执行,自动将github仓库代码同步至gitee仓库中。

2 Github从Gitee同步更新

Github仓库从Gitee仓库同步代码,也是借助Github Actions功能进行实现,能够实现此功能的Actions较多,本文还是采用 【Yikun/gitee-mirror-action】进行实现。

由于Github Actions在Gitee代码仓库更新时,无法自动感知gitee仓库发生更新,从而不能自动触发workflow的执行,因此形成了2种不同的同步方式:webhooks实时同步方式定时延迟同步方式。下面分别介绍这2种同步方式的具体实现步骤。

2.1 定时延迟同步方式

定时延迟同步方式是最简单的一种方式,虽然存在延迟,但大部分情况下对代码同步的实时性要求并不高。可以根据实际需求,调整定时任务频率,增加同步次数。

1 创建Github目标仓库

在实现从Gitee同步代码至目标仓库Github之前,需要在Github上创建一个空的仓库作为同步的目标仓库。登陆【gihub】->右上角加号->创建仓库,私有或者公有仓库均可。

2 目标仓库配置SSH私钥

github目标仓库创建好后,需要配置仓库SSH私钥,具体步骤参考:【1.3 github配置ssh私钥

3 目标仓库创建Github workflow

在【1.6 创建Github workflow】已经讲述了如何创建Github workflow,此处不在赘述。下面采用第二种方式进行配置。将项目clone到本地,用vscode打开,根目录下创建文件.github\workflows\sync-to-github.yml,内容如下:

sync-to-github.yml
name: Sync to Github
on:
   schedule:
    # 每个小时10-59分钟之间,从10分钟开始,每5分钟执行一次
    - cron:  '10/5 * * * *'
jobs:
    sync:
        runs-on: ubuntu-latest
        steps:
            - name: Sync to Github
              uses: wearerequired/git-mirror-action@master
              env:
                  # 注意在 Settings->Secrets 配置 GITEE_RSA_PRIVATE_KEY
                  SSH_PRIVATE_KEY: ${{ secrets.GITEE_RSA_PRIVATE_KEY }}
              with:
                  # 注意替换为你的 Gitee源仓库地址
                  source-repo: git@gitee.com:AnyFork/anyfork-docs-client.git
                  # 注意替换为你的 Github 目标仓库地址
                  destination-repo: git@github.com:AnyFork/anyfork-docs-client.git

上面配置了on:schedule:cron定时任务,时间到了定时任务设置的时间,便会触发workflow执行。

温馨提示
1 设定的 schedule 是UCT时间,比如设置的08:00(也就是北京时间的16:00),但实际运行的时间为北京时间17:00 至 17:20 不等。
2 Schedule在 GitHub 操作工作流运行的高负载期间,事件可能会延迟。高负载时间包括每小时开始。为了减少延迟的可能性,请安排您的工作流在不同的时间运行。实测延迟的时间为几十分钟,或者超过一个小时,甚至在某种极端情况下,将不会执行。
3 Schedule 设置的 cron 时刻,仅仅是工作流进行计划排队的时刻,而不是准确的运行时刻。

GitHub Actions 默认使用 UTC 时间。如果你的工作流程应该在特定本地时间执行,你可以在 YAML 文件中指定时区:

jobs:
  job1:
    runs-on: ubuntu-latest
    steps:
    - name: Set Timezone
      uses: szenius/set-timezone@v1.0
      with:
        timezoneLinux: "Asia/Shanghai"

对于一些不需要实时进行同步的需求,可以采用定时延迟同步方案,方便配置也简单。

2.2 实时同步方式

Webhook是一种事件驱动的通知机制,当发生特定事件(如代码推送、拉取请求创建等)时,会自动向指定的外部服务器发送HTTP POST请求(通常包含事件数据)。这种机制替代了轮询API的实时通知方式,允许开发者在事件发生时立即触发外部操作(如部署、测试或发送通知)。

Github和Gitee都支持Webhook功能,因此我们可以借助这一功能,在gitee代码发生提交时,触发gitee配置的自定义webhook,webhook通过调用github Api触发github actions自动执行,从而实现实时同步方式。

3 Gitee自动同步Github

4 Gitee从Github同步更新

最后更新时间: 2026-03-12 10:02:23