从GitLab到GitHub的镜像同步

73

我一直在使用私有的GitLab实例来管理我的代码。但是由于现在与我一起工作的大部分员工都有GitHub账号,所以我真的很想把我的GitLab库同步到GitHub上。

我的情况:

  • 运行GitLab(Omnibus)的服务器
  • 一个GitHub账号,我将为其创建一个组织,让我和我的员工可以在一起组织。

我知道git中有一个--mirror开关,但是我不确定它是如何工作的。我在网上找到的文档非常混乱...所以如果有人能帮助我就太好了 :)


你打算保留你的Gitlab实例还是完全转移到Github呢? - Matti Virkkunen
可能是重复的问题:如何将包含所有分支的git仓库从Bitbucket迁移到Github? - Frxstrem
1
可能是[将GitLab存储库转移到GitHub - 我们可以吗?如何做?风险有哪些?]的重复问题 (https://dev59.com/3WEh5IYBdhLWcg3wjUKJ) - random
@MattiVirkkunen 是的。请看我在下面答案的评论。 - Ingwie Phoenix
1
对于从GitHub到GitLab的相反问题(镜像),请参见此处:https://serverfault.com/questions/531931/mirror-github-to-gitlab/849151 - knocte
6个回答

72

现在,GitLab有一个选项可以在UI中完成此操作,请转到您的存储库的Settings->Repository:

https://gitlab.com/yourUserNameInGitLab/yourRepoName/settings/repository

然后找到“镜像存储库”选项并单击展开。您要做的是选择“Push”镜像方向并填写此URL:

https://yourUserNameInGitHub@github.com/yourUserNameInGitHub/yourRepoName.git

在密码字段中,您必须使用个人访问令牌(因为GitHub现在已弃用密码访问),您可以在此生成:https://github.com/settings/tokens (不要忘记在生成时启用“repo”和“workflow”权限)


4
我刚刚尝试了在私有代码库的情况下双方都使用它,对我来说运作良好。 - GollyJer
6
GitLab在其文档中提供了更详细的说明,包括如何使用令牌代替密码 来设置从GitLab到GitHub的镜像 - Jess Telford
有人能确认在 GitHub 启用强制双重身份验证后,这个方法是否仍然有效吗? - alfC
3
它使用访问令牌(access token)进行操作。你需要将访问令牌设置为密码。 - niels
3
我的用户账户已配置双重身份验证并且令牌可用。我正在向组织的代码库提交推送。顺便说一句,GitLab应该在他们的镜像配置页面上链接到这个答案!这个解释比文档好多了。谢谢knocte。 - Bill McGonigle
显示剩余3条评论

22

另一个选项是向 origin 添加一个额外的URL:

git remote set-url --add origin git@github.com:<USERNAME>/<PROJECTNAME>.git

当您推送到主机时,它将同时推送到原始源(gitlab)和上面添加的一个源(github)。


这会显示先前在GitHub上的Git贡献吗? - Lameck Meshack
我想应该可以,因为它会推送所有提交,但我建议你试一下以确保。 - Kris

15

这个 StackOverflow 的问题 解决了如何将代码仓库从其他服务迁移到 GitHub,其中的第一个答案讲述了如何使用命令行完成迁移,而第二个和第三个答案则提供了更加用户友好的方式。但是如果你的 GitLab 实例在本地服务器上(这似乎是你的情况),这些方法都不适用。

然而,你可以通过命令行将代码仓库“导入”到 GitHub 中,具体方法可以参考 GitHub 文档,这也是官方建议的方式之一,因为 GitHub 还提供了另一种选择,即使用其 GitHub 导入工具(该工具在之前提到的 SO 问题中有介绍)。

下面是官方文档中列举的步骤:

  1. 在 GitHub 上创建新仓库,该仓库将作为你导入的目标。
  2. 从 GitLab 服务器中克隆出一个本地 bare 仓库:

    git clone --bare https://githost.org/extuser/repo.git

Bare 克隆是完全复制一个仓库,但没有工作目录用于编辑文件,因此可以看做是一种干净的导出。

  1. 进入该目录,并使用 --mirror 标志推送到 GitHub。 这个标志确保了引用(分支/标签)被复制到 GitHub 上。

    cd *repo.git*

    git push --mirror https://github.com/ghuser/repo.git

  2. 最后删除你本地创建的仓库。

    cd ..

    rm -rf repo.git


3
我的Gitlab服务器实际上是有点公开的。我想将http://git.ingwie.me/ingwie/bird3镜像到GitHub组织中,但由于其中包含了功能请求通知等信息,我只想将它镜像到GitHub上。因此,我不想搬迁,而是要进行镜像。以前甚至还有一个专门用于镜像仓库的特殊图标。 - Ingwie Phoenix
@IngwiePhoenix 啊,抱歉,你的问题表述方式让很多人认为你想要转移。也许编辑一下,明确说明你想要一个镜像并保留原始仓库?无论如何,请参考这个链接:https://dev59.com/k2Yq5IYBdhLWcg3wridD,其中提到了相同的设置,你可以使用 GitLab 监视 GitHub 仓库或者使用 Webhooks/Post Receive Hook 自动化处理,我想这就是你想要的。https://dev59.com/GGEh5IYBdhLWcg3w1mfs - matrixanomaly

11

如果您更喜欢使用SSH连接而不是HTTPS连接在GitLab和GitHub之间进行镜像,请执行以下操作:

  • 从您的GitHub存储库中复制SSH克隆链接。(例如,git@github.com:yourusername/yourrepositoryname.git
  • 在GitLab中,进入您的存储库页面,转到设置 > 存储库 > 镜像存储库
  • 输入存储库URL。不要直接粘贴复制的链接!将其修改为ssh://git@github.com/yourusername/yourrepositoryname.git
  • 选择验证方法为SSH公钥
  • 点击“镜像存储库”
  • 添加后,单击您的存储库链接旁边的“复制SSH公钥”按钮。 enter image description here
  • 在GitHub中,转到您的目标存储库页面并导航至设置 > 部署密钥,单击添加部署密钥按钮,并粘贴由GitLab生成的公共SSH密钥。
  • 不要忘记勾选允许写访问复选框,因为GitLab需要写访问权限以进行镜像。

参考资料


1
经过数小时的尝试,我认为这个功能已经坏了。没有人提到需要将SSH密钥添加为部署密钥(每个项目级别),而不是作为常规SSH密钥(每个用户级别)。 - Arsinclair
非常感谢,终于有一份对我来说有意义的指南! - jnt

5

2021年8月13日后的文章:如果仅使用用户名和密码从GitLab到GitHub进行镜像,将失败,因为我们需要使用个人访问令牌(PAT)来进行此操作。

步骤1:从GitHub创建PAT:

  • 点击右上角的GitHub个人资料图标
  • 点击“设置”
  • 从左侧显示的菜单中,点击“开发者设置”
  • 点击“个人访问令牌”
  • 点击“生成新令牌”
  • 添加一个注释,以帮助您识别要生成的访问令牌的范围
  • 从下拉菜单中选择过期时间(理想情况下,您应避免选择“无到期时间”选项)
  • 最后,选择要授予生成的访问令牌相应访问权限的范围。确保选择最少所需的范围,否则您仍将在执行某些Git操作时遇到问题。
  • 最后,点击“生成令牌”。

您还应该能够看到您的个人访问令牌。请确保复制它,因为我们在以下步骤中需要它。

步骤2:从GitLab转到您要镜像的repo:

  • 点击“设置”。
  • 点击“存储库”。
  • 点击“镜像存储库”选项-->展开它。
  • 使用以下URL作为Git存储库URL: https://<<githubtoken>>@github.com/<<username>>/<<repositoryname>>.git
  • 使用步骤1中创建的令牌用于上述URL中的部分。
  • 在不填写密码字段的情况下,单击“镜像存储库”按钮。

GitHub个人访问令牌所需的最小范围是什么? - Elias Strehle
我该如何在组织仓库中完成这个操作?我尝试了所有这里的答案,想知道你是否知道。 - Royce
@Royce,我认为您应该在Gitlab中担任“维护者”角色才能执行此操作。 - AmeeraJ

0
如果你的GitLab上有太多的仓库,迁移或镜像这些仓库将会变得非常困难。
我之前也遇到过同样的情况,为了解决这个问题,我编写了一个简单的工具,可以在GitLab和GitHub之间镜像所有可见的仓库。 例如,它会在GitLab上进行镜像克隆所有可见的仓库,然后在你的GitHub账户上创建仓库,并将其进行镜像推送。
目前不支持Gitee,你可以查看tests.go来了解如何使用它。

https://github.com/kom0055/git-mirror

我正在撰写一个更具体的自述文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接