GitHub与Gitee双向同步
目录
1 注意自己的需求
如果只是想把一个origin作为主要源(比如GitHub), 另一个作为镜像源(比如Gitee), 那么使用git remote set-url --add origin git@gitee.com:zhyoch/blog.git
即可添加镜像源, 使用git remote -v
查看得到以下信息:
|
|
这样在git push
时, 就会同时推送到两个源。
如果想提交到一个主要源, 让镜像源和主要源之间自动同步, 甚至是同步多个仓库, 请阅读本文后续内容。
2 GitHub同步到Gitee
2.1 设置dst_key
- 在
GitHub
上打开自己的一个仓库 (可以是要同步的源仓库, 也可以是别的仓库, 总之这个仓库将用来执行GitHub Actions) , 在它的setting
→Secrets
中, 新建一个GITEE_PRIVATE_KEY
。 - 在电脑上生成SSH密钥对。
- 复制私钥
id_rsa
的值, 粘贴为第1步GITEE_PRIVATE_KEY
的Value
。 - 复制公钥
id_rsa.pub
的值。打开Gitee
, 在个人设置
→安全设置
→SSH公钥
中新添加公钥, 标题无所谓, 将公钥id_rsa.pub
的值粘贴上。
2.2 设置dst_token
- 在刚才的
GitHub
仓库的setting
→Secrets
中, 再新建一个GITEE_TOKEN
。 - 打开
Gitee
, 在个人设置
→安全设置
→私人令牌
中新建一个私人令牌, 名字无所谓, 全选权限, 确定, 然后复制它的值, 粘贴为第1步中GITEE_TOKEN
的Value
。
2.3 配置Github Actions
在刚才的GitHub仓库中, 新建.github/workflows/SyncToGitee.yml
文件, 写入以下代码, 然后提交:
|
|
2.3.1 注意事项
这个配置文件仅适用于
GitHub
中的源仓库在每次提交更改后, 自动将源仓库同步到Gitee
的目标仓库。也可以使用
cron
命令使其定时运行:1 2 3 4 5
on: schedule: - cron: '0 1 * * *' #每天北京时间 9点运行 branches: - master
源仓库与目标仓库的名称应该设置为相同, 至于名称不同的解决方法, 作者Yikun暂时还没有实现, 参考这个issue。源仓库与目标仓库的名称可以设置为相同, 方便一些; 不相同的情况参考作者的解答。
3 Gitee同步到GitHub
3.1 设置dst_key和设置dst_token
参考GitHub同步到Gitee中的设置dst_key和设置dst_token。
3.2 配置Github Actions
在Gitee仓库中新建
.github/workflows/SyncFromGitee.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
name: Sync Github Repos From Gitee on: push: branches: - master jobs: build: runs-on: ubuntu-20.04 steps: - name: Sync Github Repos From Gitee #名字随便起 uses: Yikun/hub-mirror-action@v1.2 #使用Yikun开发的 hub-mirror-action with: src: gitee/user_name #源端账户名 dst: github/user_name #目的端账户名 dst_key: ${{ secrets.GITEE_PRIVATE_KEY }} #SSH密钥 对中的私钥, 即 id_rsa dst_token: ${{ secrets.GITEE_TOKEN }} #Gitee账户 的私人令牌 account_type: user #账户类型 clone_style: "ssh" #使用ssh方式进行clone, 也可以使用 https debug: true #启用后会显示所有执行命令 force_update: true #启用后, 强制同步, 即强制覆盖目的 端仓库 static_list: "repository_name" #静态同步列表, 在此 填写需要同步的仓库名称, 可填写多个 timeout: '600s' #git超时设置, 超时后会自动重试git操 作
在与之同步的GitHub仓库中同样新建一个
.github/workflows/SyncFromGitee.yml
文件, 内容一样, 然后提交。由于此Github Action并不能实时检测到Gitee相应仓库的更新, 所以建议使用cron命令使其定时运行。
技巧
- 如果有多个仓库需要同步, 建议单独设置一个用于执行同步Action的仓库, 便于管理。
- 有问题建议在issues上询问。