使用Github Actions镜像Github仓库到Gitee

2020/03/02

由于国内访问Github仓库速度太慢,这里提供一个方案将Github的仓库镜像到Gitee,稍作修改还能支持各个Git仓库之间同步,或者一个仓库创建多个镜像。

定义

   
Gitee令牌 可用于访问Gitee仓库的凭据
原始仓库 已经存在,打算镜像到其他地方的上游仓库
镜像仓库 从原始仓库镜像出来的仓库

1. 生成Gitee令牌

如果不需要自动同步,那可以跳过这一步

进入Gitee-设置-私人令牌

私人令牌页面

点击+生成新令牌

生成新令牌页面

这里只勾选projects权限应该就够用了,点击提交

生成令牌验证

输入Gitee登录密码,点击验证

成功生成令牌

此时生成了令牌,复制保存下来,因为离开页面就没办法再找回令牌了。示例中生成的令牌是b1946ac92492d2347c6235b4d2611184,下文都是用令牌指代此字符串。

(任何时候,令牌泄露了可以删除令牌而不影响账号,如果不介意的话直接用账号密码作为令牌也可以的)

2. 初始化镜像仓库

进入Gitee首页

Gitee首页

鼠标移到右上角加号,在展开的菜单中选择从 GitHub/GitLab 导入仓库

导入仓库页面

假设我要镜像OpenWrt的Github仓库,则在Git仓库URL输入 https://github.com/openwrt/openwrt.git,名称和路径自定义,我这里都是用openwrt,仓库介绍和是否开源都按需配置,然后点击导入

正在导入页面

这时会出现正在导入的提示,通常一分钟以内就完成了。

导入完成后,这个镜像仓库就可以克隆到本地了,但是现在的镜像仓库不会自动从Github同步新的变化,所以下一步利用Github Actions定时同步上游仓库到镜像仓库

3. 定时同步

如果不需要自动同步,那可以跳过这一步

在Github中任意创建一个仓库,接下来用任务仓库指代这个仓库,用于配置同步任务。

创建任务仓库

本例中仓库名称是repo-sync-actions,点击Create repository

添加Secret入口

打开任务仓库Settings,在左侧导航栏点击Secrets,点击Add a new secret

Secret内容

Name字段填入PUSH_TARGET_PREFIX

Value字段填入Gitee仓库前缀,模式是https://Gitee用户名:Gitee令牌@gitee.com/Gitee空间,其中Gitee令牌即第一步生成的令牌Gitee空间是第二步选择的项目归属,通常就是Gitee用户名;我这里最终填写的是 https://jjm2473:b1946ac92492d2347c6235b4d2611184@gitee.com/jjm2473(最后不要有斜杠)

点击Add secret

创建新文件

回到任务仓库的首页,点击Create new file

任务文件配置

上面的文件名填入.github/workflows/openwrt+openwrt.yaml(路径不能变,扩展名.yaml,文件名任意),下面的文件内容输入:

[//]: # “”

name: openwrt/openwrt

on:
  watch:
    types: [started]
  schedule:
    - cron: '22 * * * *'

jobs:
  sync:
    name: Sync
    runs-on: ubuntu-latest
    steps:
      - name: Clone
        run: git clone --mirror --no-single-branch --depth=$DEPTH $SRC_REPO repo.git
        env:
          SRC_REPO: https://github.com/openwrt/openwrt.git
          DEPTH: 20
      - name: Config DownStream
        run: git -C repo.git remote add downstream "$PUSH_TARGET"
        env:
          PUSH_TARGET: ${{ secrets.PUSH_TARGET_PREFIX }}/openwrt.git
      - name: Push DownStream
        run: git -C repo.git push --all downstream && git -C repo.git push --tags downstream
      - name: Try Unshallow On Failed
        if: failure()
        run: |
          git -C repo.git fetch --unshallow || exit 1 
          git -C repo.git gc
          git -C repo.git count-objects -vH
          git -C repo.git push --all downstream && git -C repo.git push --tags downstream

[//]: # “”

这里有几行需要修改,注意保持缩进:

  • 第一行的name是任务名称,可自定义,无格式限制
  • cron这一行指定定时任务执行的条件,22 * * * *表示每个小时的22分都执行一次
  • SRC_REPO需要修改成你打算镜像的原始仓库地址
  • PUSH_TARGET需要把斜杠后面的仓库改成第二步的路径加上.git

改完后点击Commit new file提交任务。

Actions入口

之后可以在Actions页面查看任务执行情况,如果想立即执行,自己给任务仓库加个Star即可。

参考

Github Actions

Post Directory