GitHub与Gitee双向同步

如果只是想把一个origin作为主要源(比如GitHub), 另一个作为镜像源(比如Gitee), 那么使用git remote set-url --add origin git@gitee.com:zhyoch/blog.git即可添加镜像源, 使用git remote -v查看得到以下信息:

1
2
3
origin  git@github.com:zhyoch/blog.git (fetch)
origin  git@github.com:zhyoch/blog.git (push)
origin  git@gitee.com:zhyoch/blog.git (push)

这样在git push时, 就会同时推送到两个源。

如果想提交到一个主要源, 让镜像源和主要源之间自动同步, 甚至是同步多个仓库, 请阅读本文后续内容。

  1. GitHub上打开自己的一个仓库 (可以是要同步的源仓库, 也可以是别的仓库, 总之这个仓库将用来执行GitHub Actions) , 在它的settingSecrets中, 新建一个GITEE_PRIVATE_KEY
  2. 在电脑上生成SSH密钥对。
  3. 复制私钥id_rsa的值, 粘贴为第1步GITEE_PRIVATE_KEYValue
  4. 复制公钥id_rsa.pub的值。打开Gitee, 在个人设置安全设置SSH公钥中新添加公钥, 标题无所谓, 将公钥id_rsa.pub的值粘贴上。
  1. 在刚才的GitHub仓库的settingSecrets中, 再新建一个GITEE_TOKEN
  2. 打开Gitee, 在个人设置安全设置私人令牌中新建一个私人令牌, 名字无所谓, 全选权限, 确定, 然后复制它的值, 粘贴为第1步中GITEE_TOKENValue

在刚才的GitHub仓库中, 新建.github/workflows/SyncToGitee.yml文件, 写入以下代码, 然后提交:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
name: Sync Github Repos To Gitee

on:
  push:
    branches:
      - master

jobs:
  build:
    runs-on: ubuntu-20.04
    steps:

    - name: Sync Github Repos To Gitee #名字随便起
      uses: Yikun/hub-mirror-action@v1.2 #使用Yikun开发的hub-mirror-action
      with:
        src: github/user_name #源端账户名
        dst: gitee/user_name #目的端账户名
        dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} #SSH密钥对中的私钥, 即 id_rsa
        dst_token:  ${{ secrets.GITEE_TOKEN }} #Gitee账户的私人令牌
        account_type: user #账户类型
        clone_style: "ssh" #使用ssh方式进行clone, 也可以使用https
        debug: true #启用后会显示所有执行命令
        force_update: true #启用后, 强制同步, 即强制覆盖目的端仓库
        static_list: "repository_name" #静态同步列表, 在此填写需要同步的仓库名称, 可填写多个
        timeout: '600s' #git超时设置, 超时后会自动重试git操作
  1. 这个配置文件仅适用于GitHub中的源仓库在每次提交更改后, 自动将源仓库同步到Gitee的目标仓库。

  2. 也可以使用cron命令使其定时运行:

    1
    2
    3
    4
    5
    
    on:
      schedule:
        - cron: '0 1 * * *'  #每天北京时间 9点运行
        branches:
          - master
    
  3. 源仓库与目标仓库的名称应该设置为相同, 至于名称不同的解决方法, 作者Yikun暂时还没有实现, 参考这个issue

  4. 源仓库与目标仓库的名称可以设置为相同, 方便一些; 不相同的情况参考作者的解答

参考GitHub同步到Gitee中的设置dst_key设置dst_token

  1. 在Gitee仓库中新建.github/workflows/SyncFromGitee.yml文件, 写入以下代码, 然后提交:

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    
    name: Sync Github Repos From Gitee
    
    on:
      push:
        branches:
          - master
    
    jobs:
      build:
        runs-on: ubuntu-20.04
        steps:
    
        - name: Sync Github Repos From Gitee #名字随便起
          uses: Yikun/hub-mirror-action@v1.2 #使用Yikun开发的   hub-mirror-action
          with:
            src: gitee/user_name #源端账户名
            dst: github/user_name #目的端账户名
            dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} #SSH密钥    对中的私钥, 即 id_rsa
            dst_token:  ${{ secrets.GITEE_TOKEN }} #Gitee账户   的私人令牌
            account_type: user #账户类型
            clone_style: "ssh" #使用ssh方式进行clone, 也可以使用    https
            debug: true #启用后会显示所有执行命令
            force_update: true #启用后, 强制同步, 即强制覆盖目的    端仓库
            static_list: "repository_name" #静态同步列表, 在此    填写需要同步的仓库名称, 可填写多个
            timeout: '600s' #git超时设置, 超时后会自动重试git操   作
    
  2. 在与之同步的GitHub仓库中同样新建一个.github/workflows/SyncFromGitee.yml文件, 内容一样, 然后提交。

  3. 由于此Github Action并不能实时检测到Gitee相应仓库的更新, 所以建议使用cron命令使其定时运行。

技巧
  1. 如果有多个仓库需要同步, 建议单独设置一个用于执行同步Action的仓库, 便于管理。
  2. 有问题建议在issues上询问。