由于国内访问Github仓库速度太慢,这里提供一个方案将Github的仓库镜像到Gitee,稍作修改还能支持各个Git仓库之间同步,或者一个仓库创建多个镜像。
定义
Gitee令牌 | 可用于访问Gitee仓库的凭据 |
原始仓库 | 已经存在,打算镜像到其他地方的上游仓库 |
镜像仓库 | 从原始仓库镜像出来的仓库 |
1. 生成Gitee令牌
如果不需要自动同步,那可以跳过这一步
进入Gitee-设置-私人令牌
点击+生成新令牌
这里只勾选projects权限应该就够用了,点击提交
输入Gitee登录密码,点击验证
此时生成了令牌,复制保存下来,因为离开页面就没办法再找回令牌了。示例中生成的令牌是b1946ac92492d2347c6235b4d2611184
,下文都是用令牌指代此字符串。
(任何时候,令牌泄露了可以删除令牌而不影响账号,如果不介意的话直接用账号密码作为令牌也可以的)
2. 初始化镜像仓库
进入Gitee首页
鼠标移到右上角加号,在展开的菜单中选择从 GitHub/GitLab 导入仓库
假设我要镜像OpenWrt
的Github仓库,则在Git仓库URL输入 https://github.com/openwrt/openwrt.git
,名称和路径自定义,我这里都是用openwrt
,仓库介绍和是否开源都按需配置,然后点击导入
这时会出现正在导入的提示,通常一分钟以内就完成了。
导入完成后,这个镜像仓库就可以克隆到本地了,但是现在的镜像仓库不会自动从Github同步新的变化,所以下一步利用Github Actions定时同步上游仓库到镜像仓库
3. 定时同步
如果不需要自动同步,那可以跳过这一步
在Github中任意创建一个仓库,接下来用任务仓库指代这个仓库,用于配置同步任务。
本例中仓库名称是repo-sync-actions
,点击Create repository
打开任务仓库的Settings,在左侧导航栏点击Secrets,点击Add a new 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页面查看任务执行情况,如果想立即执行,自己给任务仓库加个Star即可。