用Github Action自动将GitHub代码同步到Gitee

背景

本人正在开发一个开源的项目------pear-rec,代码库在GitHub上,但是对于国内的同学来说不太方便,因为国内访问GitHub不太稳定,所以我就想把代码同步到国内的代码管理平台gitee上面,这时我们就需要将Github的代码同步到gitee仓库的需求。具体的,对于我们目前参与的项目来说核心诉求是:以Github社区作为主仓,并且定期自动同步到Gitee作为镜像仓库

方案

一. 手动同步

Gitee 的仓库镜像管理,提供了同步的按钮,你只用点一下,即可与 Github 同步更新。

有点麻烦的是,我们需要在推送到 Github 后,再到 Gitee 项目主页手动点击一下。

二. 推送两个仓库

除此之外,我们也可以在 git 管理里设置两个 remote,直接推送到两个仓库地址上,我们可以修改一下git,如下:

  1. 首先查看远程仓库地址:
js 复制代码
git remote -v
  1. 添加多个远程仓库地址:
js 复制代码
git remote add origin-name1 http://xxxxxx

git remote add origin-name2 http://xxxxxx
  1. 更新代码(从某个远程仓库)
js 复制代码
git pull origin-name1 branch_name1

git pull origin-name2 branch_name1
  1. 推送代码:
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 入门教程》

为了实现 GiteeGithub 的同步,我们需要借助一个 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 上,这样就可以实现 GitHubGitee 的通信

这里我们从 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 的代码就会自动同步。

至此,我们实现了 GithubGitee 代码仓库的同步。

Q&A

    1. Q: 出现如下报错怎么处理?

A:YAML格式化网站 可以解决

    1. Q: 有源码吗?

A: 当然有,地址如下:pear-rec,有兴趣的话可以大家一起探讨,同时也欢迎大家forkstar

相关推荐
学习路上_write31 分钟前
FPGA/Verilog,Quartus环境下if-else语句和case语句RT视图对比/学习记录
单片机·嵌入式硬件·qt·学习·fpga开发·github·硬件工程
谎言西西里31 分钟前
Git入门指南:掌握基本概念与日常操作
git·github
喵叔哟32 分钟前
重构代码之取消临时字段
java·前端·重构
还是大剑师兰特1 小时前
D3的竞品有哪些,D3的优势,D3和echarts的对比
前端·javascript·echarts
王解1 小时前
【深度解析】CSS工程化全攻略(1)
前端·css
一只小白菜~1 小时前
web浏览器环境下使用window.open()打开PDF文件不是预览,而是下载文件?
前端·javascript·pdf·windowopen预览pdf
方才coding1 小时前
1小时构建Vue3知识体系之vue的生命周期函数
前端·javascript·vue.js
阿征学IT1 小时前
vue过滤器初步使用
前端·javascript·vue.js
王哲晓1 小时前
第四十五章 Vue之Vuex模块化创建(module)
前端·javascript·vue.js
丶21361 小时前
【WEB】深入理解 CORS(跨域资源共享):原理、配置与常见问题
前端·架构·web