sync repo from Github to Gitee using github action

缘起

早年在 github 上做了个 repo 用作图床,但是由于种种原因,大陆访问 github.com 的速度感人,故而想把(图床)数据在大陆的 gitee.com 上也同步一份,然后用 gitee.com 上的图床来给大家访问。

网上搜了下,有用 gitee 的“镜像仓库”的功能的,但这个功能需要申请开通,直接否掉。然后其他基本都是用 github action 来实现,这个我也是认同的。不过好多人都是直接用的别人做好的项目来实现的,由于我一是觉得这个东西不复杂没必要用别人封装好的东西(因为他封装好的好些东西我不一定需要),再个感觉虽然别人也开源但我也没那闲功夫整天 review 别人的代码,所以我就想不用别人现成的东西,自己整。

具体方案

准备

公私钥一对

没有的话可以生成:

1
2
3
4
ssh-keygen -t ed25519 -f id_ed25519_github2gitee -C "for sync from github to gitee";
# 按两次回车键以输入空的 passphrase
# 私钥在 id_ed25519_github2gitee 里
# 公钥在 id_ed25519_github2gitee.pub 里

github 账号及图床仓库

这里假设是 xxxxgithub 和 imagehostgithub

gitee 测

github 测

上传私钥

在 Settings->Secrets 配置一个叫 GITEE_PRIVATE_KEY 的 Repository secrets,内容就是前面准备的私钥(文件 id_ed25519_github2gitee 里)

配置 github action

新建文件 .github/workflows/sync2gitee.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
26
27
28
29
30
31
name: sync2gitee
on:
push:
branches:
- master
jobs:
repo-sync:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
with:
persist-credentials: false

- name: sync github -> gitee
env:
SSH_KEY: ${{ secrets.GITEE_PRIVATE_KEY }}
GITHUB_REPO: "https://github.com/xxxxgithub/imagehostgithub.git"
GITEE_REPO: "[email protected]:xxxxgitee/imagehostgitee.git"
run: |
mkdir -p ~/.ssh/
echo "$SSH_KEY" | tr -d '\r' > ~/.ssh/id_rsa
chmod 600 ~/.ssh/id_rsa
ssh-keyscan github.com >> ~/.ssh/known_hosts
ssh-keyscan gitee.com >> ~/.ssh/known_hosts
git config --global user.name "xxxxgitee"

git clone --mirror "$GITHUB_REPO" && cd `basename "$GITHUB_REPO"`
git remote set-url --push origin "$GITEE_REPO"
git fetch -p origin
git for-each-ref --format 'delete %(refname)' refs/pull | git update-ref --stdin
git push --mirror

保存,提交,就应该会触发同步。在 github 里 repo 下的 Actions 里可以看下结果