背景
本人正在开发一个开源的项目------pear-rec,代码库在GitHub
上,但是对于国内的同学来说不太方便,因为国内访问GitHub
不太稳定,所以我就想把代码同步到国内的代码管理平台gitee
上面,这时我们就需要将Github
的代码同步到gitee
仓库的需求。具体的,对于我们目前参与的项目来说核心诉求是:以Github社区作为主仓,并且定期自动同步到Gitee作为镜像仓库
方案
一. 手动同步
在 Gitee
的仓库镜像管理,提供了同步的按钮,你只用点一下,即可与 Github
同步更新。
有点麻烦的是,我们需要在推送到 Github
后,再到 Gitee
项目主页手动点击一下。
二. 推送两个仓库
除此之外,我们也可以在 git
管理里设置两个 remote
,直接推送到两个仓库地址上,我们可以修改一下git,如下:
- 首先查看远程仓库地址:
js
git remote -v
- 添加多个远程仓库地址:
js
git remote add origin-name1 http://xxxxxx
git remote add origin-name2 http://xxxxxx
- 更新代码(从某个远程仓库)
js
git pull origin-name1 branch_name1
git pull origin-name2 branch_name1
- 推送代码:
js
git push origin-name2 branch_name1:将代码推送到远程仓库origin-name2的branch_name1分支
git push origin-name3 branch_name2:将代码推送到远程仓库origin-name3的branch_name2的分支
这个方法比上一个方法好一些了,不用登录gitee
和点击同步按钮,直接通过git
就可以同步代码,但是我还想更加简便,于是我就想到了Github Action
。
三. Github Actions 自动同步
我们也可以利用 Github Actions
,写一个工作流,在发现 Github
仓库的 mian
分支代码更新后,自动同步当前代码到 Gitee
上。
关于 Github Actions
的介绍,可以参考阮一峰老师的 《GitHub Actions 入门教程》。
为了实现 Gitee
和 Github
的同步,我们需要借助一个 action
,还好业界已经有现成的实现了,这里我采用的是 Hub Mirror Action,我们可以看到使用的示例代码:
js
steps:
- name: Mirror the Github organization repos to Gitee.
uses: Yikun/hub-mirror-action@master
with:
src: github/kunpengcompute
dst: gitee/kunpengcompute
dst_key: ${{ secrets.GITEE_PRIVATE_KEY }}
dst_token: ${{ secrets.GITEE_TOKEN }}
account_type: org
# src_account_type: org
# dst_account_type: org
使用 Github Actions
1. 新建文件
在代码库的根目录下创建一个.github
文件夹,然后在文件夹内新建一个workflows
的文件夹,最后在新建一个syncToGitee.yml
文件,目录结构如下:
js
└── .github
└── workflows
└── syncToGitee.yml
2. 修改代码
例子代码我们并不能直接用我们要修改一下,首先我们要理解代码中的四个配置的参数的含义:
src
表示需要被同步的源端账户名,即我们 Github 的账户名,因为我的 Github ID 是 027xiguapi,所以这里我应该改成github/027xiguapi
。dst
表示需要同步到的目的端账户名,即我们 Gitee 的账户名,因为我的 Gitee ID 也是 xiguapi027,所以这里我应该改成gitee/xiguapi027
。dst_key
表示用于在目的端上传代码的私钥,然后将其保存在 Secrets 中。dst_token
表示用于在在 Gitee 上创建一个私人令牌(token),然后将其保存在 Secrets 中。
知道参数的含义后,我们就可以修改代码了,我的代码如下:
js
name: syncToGitee
'on':
push:
branches:
- main
jobs:
repo-sync:
runs-on: ubuntu-latest
steps:
- name: Mirror with force push (git push -f)
uses: Yikun/hub-mirror-action@master
with:
src: github/027xiguapi
dst: gitee/xiguapi027
dst_key: '${{ secrets.GITEE_PRIVATE_KEY }}'
dst_token: '${{ secrets.GITEE_TOKEN }}'
static_list: pear-rec
force_update: true
debug: true
3. 设置 GitHub 变量
- 获取私钥 打开shell输入下面代码:
js
cat ~/.ssh/id_rsa
- 将私钥复制到 GitHub 仓库
选择 "Setting" -> "Secrets" -> "actions" -> "New repository secret"
- 通过设置中的
Secrets
创建一个GITEE_PRIVATE_KEY
变量,将私钥内容拷贝到值区域
然后点击 Add secret
即可。
- 同理将公钥传到
Gitee
上,这样就可以实现GitHub
和Gitee
的通信
这里我们从 Gitee
上获取,具体地址为 gitee.com/profile/per...。生成并复制 Token,然后同样的步骤,保存在 Github 的 Secrets 中,Name 为 "GITEE_TOKEN",界面如下:
- 类似上面,创建一个
GITEE_TOKEN
变量,将私人令牌作为值粘贴进去
- 将配置文件中的源和目标设置为你自己的账号即可。
js
src: github/<这里改成自己的GitHub名字>
dst: gitee/<这里改成自己的Gitee名字>
- 修改
Github Actions
配置 选择 "Setting" -> "Actions" -> "General" 进入页面,如图
在 Actions permissions
内选择选择第四个,并添加
js
Yikun/hub-mirror-action@master,
这样配置就完成了。
4.结果
每当我们推送代码的时候,GitHub Action
就会开始启动并工作了。效果如下: 执行时间大概一分钟左右,Gitee
的代码就会自动同步。
至此,我们实现了 Github
与 Gitee
代码仓库的同步。
Q&A
-
- Q: 出现如下报错怎么处理?
A:YAML格式化网站 可以解决
-
- Q: 有源码吗?
A: 当然有,地址如下:pear-rec,有兴趣的话可以大家一起探讨,同时也欢迎大家fork
和star