Github 和 Gitlab 同步
将 Gitlab 同步到 Github(简单)
将 Github 同步到 Gitlab(除非付费,否则需要中级)
注意事项
Github 和 Gitlab 都是在线托管 Git 代码库的绝佳方式。它们都提供优秀的工具来管理你的项目,无论是开源项目还是私有代码。
我不会深入比较这两种服务,因为很多指南已经做过比较了。对我来说,Github 和 Gitlab 之间的主要区别在于,Gitlab 更注重为企业提供 CI/CD 流水线和工具,而 Github 更注重社区建设,致力于打造一个共享开源代码的平台。
两者都可以用于任何一种场景……这使得在它们之间做出选择变得非常困难!
但是如果我告诉你你不必选择 O_o 呢?
为什么我想同时使用 Gitlab 和 Github
简单声明一下,这是我用的方法。它对我有用,但可能不适用于所有人。我建议你亲自尝试一下,做一些测试。
我分享我的经验,是因为我觉得它对和我处境相同的人可能有用。
我喜欢把我的仓库按项目(或者 Gitlab 中的组)组织起来。可惜 Github 做不到这一点。
我还想让尽可能多的人接触到我的仓库,毕竟 Github 拥有最大的社区。
唉,我卡住了,两个平台的功能我都想要。
对我来说幸运的是,Gitlab 有两个功能可以使这两个工具之间的共生成为可能:
- Github 存储库导入这使得从 Github 导入存储库变得非常容易
- Gitlab 到 Github 的仓库同步(免费)这样我就可以同时使用 Gitlab 作为主要数据来源,以及 Github 上的仓库。我可以使用 Github 的问题跟踪器、wiki 和论坛(Github 讨论)。
- 很棒的 CI/CD(好吧,我说了两件事,我撒了谎)
将 Gitlab 同步到 Github(简单)
这个很简单。你可以自己设置一些 CI/CD。不过 Gitlab 会自动帮你完成。
- 转到“设置 > 存储库 > 镜像存储库”
- 输入你的 Github repo,并在前面输入你的用户名
https://<github username>@github.com/path/to/your/repo.git
- 在密码字段中,输入您的 Github 令牌
- 选择推送(这需要订阅)
- 新闻镜像库
从现在起,对 Gitlab 的更改将镜像到 Github
将 Github 同步到 Gitlab(除非付费,否则需要中级)
有两种方法可以做到这一点(两者只是从相反的平台来看是等效的)
- 您可以在 Github 上设置一个 CI/CD 管道,使用 webhook(在推送和拉取请求时)触发。
- 你可以在 GitLab 上设置一个 CI/CD 流水线,使用 Webhook(在推送和拉取请求时)触发。原来这实际上是一个高级功能……现在如果不付费,就无法使用拉取 Webhook。
我个人选择从 Github 端执行此操作,因为 Github 方法是免费的
方法 1 Github CI/CD
- 在您的 Github 存储库中创建以下机密
TARGET_URL
值:Gitlab 仓库的 URLTARGET_TOKEN
价值:Gitlab 代币TARGET_USERNAME
值:Gitlab 用户名
- 使用以下代码为您的存储库创建一个 Github 操作:
name: GitlabSync
on:
- push
- delete
jobs:
sync:
runs-on: ubuntu-latest
name: Git Repo Sync
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: wangchucheng/git-repo-sync@v0.1.0
with:
# Such as https://github.com/wangchucheng/git-repo-sync.git
target-url: ${{ secrets.TARGET_URL }}
# Such as wangchucheng
target-username: ${{ secrets.TARGET_USERNAME }}
# You can store token in your project's 'Setting > Secrets' and reference the name here. Such as ${{ secrets.ACCESS\_TOKEN }}
target-token: ${{ secrets.TARGET_TOKEN }}
- 确保您在 Gitlab 中推送的分支不受保护或允许强制推送
方法 2 Gitlab CI/CD(需要 Gitlab premium)
请注意,如果您订阅了 Gitlab,您也可以通过几次点击在同一个界面中完成此操作,就像我们设置从 Gitlab 到 Github 的同步一样。
转到“设置 > 存储库 > 镜像存储库”
- 输入你的 Github repo,并在前面输入你的用户名
https://<github username>@github.com/path/to/your/repo.git
- 在密码字段中,输入您的 Github 令牌
- 选择拉取(这需要订阅)
- 新闻镜像库
手动设置
设置 webhook
如果您通过 Github 导入工具创建了 Gitlab 项目,那么您可以完全跳过此步骤。
- 在您的 Github 存储库中,转到“设置 > Webhooks”
- 创建新的 webhook
- Payload 路径:(
https://gitlab.com/api/v4/projects/<gitlab project id>/mirror/pull
项目 ID 可在“设置 > 常规”中找到) - 内容类型:
application/json
- SSL 验证:关闭
- 仅发送:推和拉
- Payload 路径:(
-
激活
-
在 Gitlab 项目中,转到“设置 > Webhooks”
-
选择从存储库推送事件并进入 Github 存储库(如果是私有的,则需要使用令牌)
设置 CI/CD 变量
- 在 Gitlab 项目中,转到“设置 > CI/CD > 变量”
- 创建一个具有 key:
ACCESS_TOKEN
和 value: 的变量(由于这是敏感的,因此将其隐藏)- 创建一个具有 key:
REMOTE_REPOSITORY_URL
和 value: 的变量<your Github token>@<your repository URL>
(由于这是敏感的,因此将其隐藏)
- 创建一个具有 key:
设置 CI/CD
- 通过转到“CI/CD > 编辑器”或
.gitlab-ci.yml
在项目根目录中创建文件并添加以下内容来创建管道:
sync-with-github:
before_script:
- git config --global user.name "${GITLAB_USER_NAME}"
- git config --global user.email "${GITLAB_USER_EMAIL}"
script:
- git remote add github $REMOTE_REPOSITORY_URL
- git checkout master
- git pull origin master
- git pull github master
- git status
- git push https://root:$ACCESS_TOKEN@$CI_SERVER_HOST/$CI_PROJECT_PATH.git HEAD:master
注意事项
这并非没有缺点。以下是我在测试此设置时发现的一些问题。
- Wiki、问题、讨论、版块等内容不会在两个托管服务提供商之间同步。这只会同步您仓库中的内容。有一些方法可以同步 Wiki(Wiki 本质上是一个隐藏的 .git 仓库,Github 和 Gitlab 都使用相同的 Wiki 格式)。
- 同时拥有两个远程存储库可能会造成混淆
- 如果同时在两个位置发生多次提交并产生冲突,它们可能会不同步(我只在我使用的存储库中使用它)