发布于 2025-12-08 1 阅读
0

Github 和 Gitlab 同步 将 Gitlab 同步到 Github(简单) 将 Github 同步到 Gitlab(中级,除非付费) 注意事项

Github 和 Gitlab 同步

将 Gitlab 同步到 Github(简单)

将 Github 同步到 Gitlab(除非付费,否则需要中级)

注意事项

Github 和 Gitlab 都是在线托管 Git 代码库的绝佳方式。它们都提供优秀的工具来管理你的项目,无论是开源项目还是私有代码。
我不会深入比较这两种服务,因为很多指南已经做过比较了。对我来说,Github 和 Gitlab 之间的主要区别在于,Gitlab 更注重为企业提供 CI/CD 流水线和工具,而 Github 更注重社区建设,致力于打造一个共享开源代码的平台。
两者都可以用于任何一种场景……这使得在它们之间做出选择变得非常困难!

但是如果我告诉你你不必选择 O_o 呢?

为什么我想同时使用 Gitlab 和 Github

简单声明一下,这是我用的方法。它对我有用,但可能不适用于所有人。我建议你亲自尝试一下,做一些测试。
我分享我的经验,是因为我觉得它对和我处境相同的人可能有用。

我喜欢把我的仓库按项目(或者 Gitlab 中的组)组织起来。可惜 Github 做不到这一点。
我还想让尽可能多的人接触到我的仓库,毕竟 Github 拥有最大的社区。
唉,我卡住了,两个平台的功能我都想要。

对我来说幸运的是,Gitlab 有两个功能可以使这两个工具之间的共生成为可能:

  1. Github 存储库导入这使得从 Github 导入存储库变得非常容易
  2. Gitlab 到 Github 的仓库同步(免费)这样我就可以同时使用 Gitlab 作为主要数据来源,以及 Github 上的仓库。我可以使用 Github 的问题跟踪器、wiki 和论坛(Github 讨论)。
  3. 很棒的 CI/CD(好吧,我说了两件事,我撒了谎)

将 Gitlab 同步到 Github(简单)

这个很简单。你可以自己设置一些 CI/CD。不过 Gitlab 会自动帮你完成。

  1. 转到“设置 > 存储库 > 镜像存储库”
  2. 输入你的 Github repo,并在前面输入你的用户名https://<github username>@github.com/path/to/your/repo.git
  3. 在密码字段中,输入您的 Github 令牌
  4. 选择推送(这需要订阅)
  5. 新闻镜像库

从现在起,对 Gitlab 的更改将镜像到 Github

将 Github 同步到 Gitlab(除非付费,否则需要中级)

有两种方法可以做到这一点(两者只是从相反的平台来看是等效的)

  1. 您可以在 Github 上设置一个 CI/CD 管道,使用 webhook(在推送和拉取请求时)触发。
  2. 你可以在 GitLab 上设置一个 CI/CD 流水线,使用 Webhook(在推送和拉取请求时)触发。原来这实际上是一个高级功能……现在如果不付费,就无法使用拉取 Webhook。

我个人选择从 Github 端执行此操作,因为 Github 方法是免费的

方法 1 Github CI/CD

  1. 在您的 Github 存储库中创建以下机密
    1. TARGET_URL值:Gitlab 仓库的 URL
    2. TARGET_TOKEN价值:Gitlab 代币
    3. TARGET_USERNAME值:Gitlab 用户名
  2. 使用以下代码为您的存储库创建一个 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 }}
Enter fullscreen mode Exit fullscreen mode
  1. 确保您在 Gitlab 中推送的分支不受保护或允许强制推送

方法 2 Gitlab CI/CD(需要 Gitlab premium)

请注意,如果您订阅了 Gitlab,您也可以通过几次点击在同一个界面中完成此操作,就像我们设置从 Gitlab 到 Github 的同步一样。

转到“设置 > 存储库 > 镜像存储库”

  1. 输入你的 Github repo,并在前面输入你的用户名https://<github username>@github.com/path/to/your/repo.git
  2. 在密码字段中,输入您的 Github 令牌
  3. 选择拉取(这需要订阅)
  4. 新闻镜像库

手动设置

设置 webhook

如果您通过 Github 导入工具创建了 Gitlab 项目,那么您可以完全跳过此步骤。

  1. 在您的 Github 存储库中,转到“设置 > Webhooks”
  2. 创建新的 webhook
    • Payload 路径:(https://gitlab.com/api/v4/projects/<gitlab project id>/mirror/pull项目 ID 可在“设置 > 常规”中找到)
    • 内容类型:application/json
    • SSL 验证:关闭
    • 仅发送:推和拉
  3. 激活

  4. 在 Gitlab 项目中,转到“设置 > Webhooks”

  5. 选择从存储库推送事件并进入 Github 存储库(如果是私有的,则需要使用令牌)

设置 CI/CD 变量

  1. 在 Gitlab 项目中,转到“设置 > CI/CD > 变量”
  2. 创建一个具有 key:ACCESS_TOKEN和 value: 的变量(由于这是敏感的,因此将其隐藏)
    1. 创建一个具有 key:REMOTE_REPOSITORY_URL和 value: 的变量<your Github token>@<your repository URL>(由于这是敏感的,因此将其隐藏)

设置 CI/CD

  1. 通过转到“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
Enter fullscreen mode Exit fullscreen mode

注意事项

这并非没有缺点。以下是我在测试此设置时发现的一些问题。

  • Wiki、问题、讨论、版块等内容不会在两个托管服务提供商之间同步。这只会同步您仓库中的内容。有一些方法可以同步 Wiki(Wiki 本质上是一个隐藏的 .git 仓库,Github 和 Gitlab 都使用相同的 Wiki 格式)。
  • 同时拥有两个远程存储库可能会造成混淆
  • 如果同时在两个位置发生多次提交并产生冲突,它们可能会不同步(我只在我使用的存储库中使用它)
文章来源:https://dev.to/brunorobert/github-and-gitlab-sync-44mn