将 Git 存储库从 GitHub 分叉到 GitLab

Posted

技术标签:

【中文标题】将 Git 存储库从 GitHub 分叉到 GitLab【英文标题】:Forking Git repository from GitHub to GitLab 【发布时间】:2018-12-01 01:15:53 【问题描述】:

假设我想对其他人的项目实施修复。该项目位于 GitHub 上。

我可以在 GitHub 上创建一个分支并实施修复。

但是,我想在 GitLab 而不是 GitHub 上创建我的 fork。

这可能吗?怎么样?

我读过这篇文章: https://about.gitlab.com/2016/12/01/how-to-keep-your-fork-up-to-date-with-its-origin/

无论如何,我不确定我应该怎么做。

我是否应该以某种方式从 GitHub 的项目的 GitLab 上创建一个分支? 或者我应该在 GitLab 上为来自 GitHub 的项目创建一个镜像? 或者我应该在 GitLab 上创建一个镜像然后 fork 镜像? 或者我应该做一些完全不同的事情吗?

什么是正确的方法。

谢谢。

更新

GitLab 上的存储库镜像可能没有意义。我可以在 GitLab 上创建我的 GitHub 存储库的镜像,但我无法创建其他人的存储库的镜像。

https://docs.gitlab.com/ee/workflow/repository_mirroring.html

这是我到目前为止所做的:

我已将原始 GitHub 项目克隆到我的本地计算机。我已将修复提交到本地存储库中的新分支。我在 GitLab 上创建了一个空项目。我已将本地存储库中的原点设置为 GitLab 上的那个空项目,并将两个分支都推送到 GitLab。我已将本地存储库中的上游设置为 GitHub 存储库。

当我想从原始 GitHub 存储库获取新提交到 GitLab 上的存储库(即同步存储库)时,我可以使用本地存储库作为中间步骤来执行此操作。但是,GitHub 上的 repo 和 GitLab 上的 repo 之间没有直接联系。我的设置正确吗?如果我在 GitHub 上做一个 fork 有什么不同吗?

【问题讨论】:

【参考方案1】:

您可以仅使用 Web 界面导入任何公开可用的 GitHub 存储库,而不是分叉:

    从您的 GitLab 仪表板中单击 新建项目 切换到导入项目标签 点击按网址回购按钮 填写“Git 存储库 URL”和其余项目字段 点击创建项目开始导入过程 完成后,您将被重定向到新创建的项目

最近使用了这种技术,即使没有 GitHub 帐户,它也适用于任何公共存储库。有关信息来源,请参阅此 GitLab docs 页面。

【讨论】:

好的。如果将新的提交添加到 GitHub 上的原始存储库,我可以简单地将更改合并到 GitHub 上的存储库吗?这是一个棘手的操作,也许没有中间存储库就无法完成(请参阅问题的最后一段)。【参考方案2】:

仅浏览器方式:

    在 Gitlab 中新建一个项目(只要一个有名字的空项目就可以了) 转到设置 -> 存储库 在“镜像存储库”下输入 GitHub URL 确保“镜像方向”为“拉动” 按“镜像存储库”按钮 按出现的条目旁边的同步图标

【讨论】:

我没有企业版许可证,即在第 3 步中看不到“镜像存储库”。无论如何,如果我有这样的许可证,我可以创建其他人的 GitHub 存储库的镜像吗? @Cimlman 这很奇怪,因为我也是免费许可证。也许重新检查?应该在“设置->存储库”中排在第三位。需要说明的是:侧边栏上的设置,而不是配置文件菜单。 @Cimlman 您是否使用自定义/本地 gitlab 实例?我在 gitlab.com 上的个人基本帐户中有更多选择 我们使用的是自我管理安装,版本 10.7.2。最新版本是 11.6。好的,这是一个很好的观点。 :) 我无法在我们的 GitLab 上尝试您的解决方案。无论如何,这个问题现在对我来说已经过时了。这完全是关于我们对 3rd 方库的自定义错误修复。但是,该错误修复已合并到该库的正式版本中。 GitLab.com 曾经允许 PULL,但它似乎在某个时候停止了,因为现在它只显示 PUSH 选项并且我所有的镜像配置都消失了。将不得不求助于 cron 工作。【参考方案3】:

如果您只想跟踪更改,请先在 GitLab(或您可能正在使用的任何其他工具)中创建一个空存储库,然后将其克隆到您的计算机。

然后将 GitHub 项目添加为“upstream”远程:

git remote add upstream https://github.com/user/repo

现在,如果有任何更改,您可以从上游获取和拉取。 (如果您有访问权限,也可以推送或合并。)

git pull upstream master

最后,推送回您自己的 GitLab 存储库:

git push origin master

如果您不想手动拉上游/推送源,GitLab 在 Settings => Repository => Mirroring repositories 中提供了镜像功能。

【讨论】:

我只想补充这个答案,说明为什么这是正确的方法。 “分叉”是 GitHub 创建的概念,因此仅存在于 GitHub 上,但仍然有用。如果您考虑纯 git 本身(就像在网络中某处运行的纯 git 服务器),那就像将 repo 克隆到您自己的服务器,然后将其克隆到您的本地计算机。然后,您将在本地添加原始存储库作为上游。我相信这就是 GitHub 在幕后所做的。 只想添加分支确实在 GitLab 上存在,例如参见 here。 我不得不使用:pull upstream master --allow-unrelated-histories 以后如何提交拉取请求? @ErikAronesty 这更棘手,因为“拉取请求”不是 git 的东西,而是 GitHub 的东西。一种方法是在 GitHub 上创建一个副本,然后将你的 fork 存储库添加为另一个远程,例如 git remote add upstream-fork git@github.com:myuser/repo。然后只需git push upstream-fork master 并通过 GitHub 站点提交您的拉取请求。【参考方案4】:

可以派生一个私有 github 存储库。

    点击新建项目 选择导入 选择github OAuth2 用于认证和自动创建 gitlab 应用 选择要分叉的项目

^ 我刚刚在 github 上使用私人 repo 完成了此操作,成功导入(inc 分支等)。导入的项目会自动保密;)

【讨论】:

项目导入需要“个人访问令牌”。我试图在 GitHub 上生成一个。当我想从我在 GitHub 上的项目在 GitLab 上创建一个项目时,这个功能似乎很有用。这个假设正确吗?问题是关于 fork 别人的 GitHub 项目。 -1 因为,正如前面的评论所说,问题是关于分叉别人的 github 项目。在这种情况下,此答案中的说明将不起作用。 @NikosAlexandris 你确定吗?您不能为您的帐户创建访问令牌并访问您有权读取的其他人的存储库吗? (例如,每个公共回购)

以上是关于将 Git 存储库从 GitHub 分叉到 GitLab的主要内容,如果未能解决你的问题,请参考以下文章

将 git 存储库从 GitLab 转移到 GitHub - 我们可以,如何转移和陷阱(如果有的话)?

Eclipse:将 git 存储库从项目重定位到工作区

如何在不分叉的情况下在 gitlab/github 上复制 git 存储库?

NPM 打包分叉 Git 存储库的 BUILT 版本的正确方法是啥?

我可以使分叉的 github 存储库从原始版本中保持最新吗? [复制]

使用没有主干标签和分支的 SVN 存储库从 SVN 迁移到 Git