从GitHub到GitLab的Git仓库分叉

192

假设我想对别人的项目进行修复,该项目位于 GitHub 上。

我可以在 GitHub 上创建一个 fork 并实现修复。

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

这可能吗?怎么做?

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

无论如何,在我的情况下我不确定该怎么做。

  • 我应该以某种方式在 GitLab 上创建 GitHub 项目的 fork 吗?
  • 还是应该在 GitLab 上创建 GitHub 项目的镜像?
  • 或者我应该先在 GitLab 上创建一个镜像,然后再 fork 镜像?
  • 或者我该采取完全不同的方法?

什么是正确的方法。

谢谢。

更新

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

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

到目前为止,我已经做了以下工作:

我已经把原始的GitHub项目克隆到本地机器上。我已经将修复后的内容提交到本地仓库的一个新分支中。我在GitLab上创建了一个空项目。我已经将本地仓库中的origin设置为GitLab上的空项目,然后将两个分支都推送到GitLab上。我还将本地仓库中的upstream设置为GitHub仓库。

当我想要从GitHub仓库获取新的提交并同步到GitLab上的仓库时,我可以使用本地仓库作为中间步骤。但是,GitHub仓库和GitLab仓库之间没有直接连接。我的设置是否正确?如果我在GitHub上创建一个fork,是否有任何区别?

4个回答

263
如果您只想跟踪更改,请先在GitLab(或其他您可能使用的平台)中创建一个空存储库,并将其克隆到您的计算机上。
然后使用以下命令将GitHub项目添加为“upstream”远程:
git remote add upstream https://github.com/user/repo

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

最后,将更改推送到您自己的GitLab存储库中:

git push origin master

如果您不想手动拉取上游/推送原始版本,GitLab在“设置= >存储库= >镜像存储库”中提供了一个镜像功能。

30
我想补充一下为什么这是正确的方法。 "Forking" 是 GitHub 创建的概念,因此仅存在于 GitHub 上,尽管很有用。 如果你考虑纯粹的 git 本身(就像在你的网络中运行的纯粹的 git 服务器),那就像将 repo 克隆到自己的服务器上,然后再将其克隆到本地计算机上。 然后你会在本地将原始 repo 添加为 upstream。 我相信这就是 GitHub 在幕后所做的事情。 - Bruno Finger
17
只想补充一点,在GitLab上确实存在forking,例如请参见此处 - bellackn
7
我需要使用: pull upstream master --allow-unrelated-histories。这条命令的作用是将远程库的更新合并到当前本地分支,即使两者的提交历史没有任何关系也可以执行。 - hmojtaba
4
如何提交后续的拉取请求? - Erik Aronesty
3
这有些棘手,因为“Pull Requests”并不是 Git 的东西,而是 GitHub 的东西。其中一种方法是在 GitHub 上分叉一个副本,并将其作为另一个远程仓库添加,例如 git remote add upstream-fork git@github.com:myuser/repo。然后只需运行 git push upstream-fork master,并通过 GitHub 网站提交您的拉取请求即可。 - Chris Watts
显示剩余6条评论

28

仅限于浏览器的方式:

  1. 在Gitlab中创建一个新项目(只需一个名称为空的空项目即可)
  2. 转到“设置” -> “存储库”
  3. 在“镜像存储库”下输入GitHub URL
  4. 确保“镜像方向”为“拉取”
  5. 点击“镜像存储库”按钮
  6. 在出现的条目旁边点击同步图标

我没有企业版许可证,即无法从步骤3中看到“镜像存储库”。不管怎样,如果我有这样的许可证,我能否创建别人的GitHub存储库的镜像? - Cimlman
2
@Cimlman 这很奇怪,因为我也在使用免费许可证。也许可以再检查一下?应该是在“设置->存储库”中的第三个选项。只是为了明确:这些设置在侧边栏上,而不是个人资料菜单中。 - aksh1618
2
@Cimlman 你是否在使用自定义/本地的GitLab实例?我在gitlab.com上的个人基本账户中有更多选项。 - aksh1618
2
我们正在使用一个自管理的安装,版本为10.7.2。最新版本是11.6。好的,这是一个好的点。:) 我无法在我们的GitLab上尝试您的解决方案。不管怎样,对我来说这个问题已经过时了。这一切都关于我们对第三方库的自定义错误修复。但是,该错误修复已经被合并到该库的官方发布版中了。 - Cimlman
2
GitLab.com曾经允许PULL,但似乎在某个时间点停止了,因为现在它只显示PUSH选项,而且我的所有镜像配置都消失了。只能求助于cron作业。 - aksh1618
显示剩余3条评论

14

不必进行派生代码,您可以只使用Web界面导入任何公开可用的GitHub存储库:

  1. 从您的GitLab仪表板单击新建项目
  2. 切换到导入项目选项卡
  3. 单击Repo by URL按钮
  4. 填写“Git存储库URL”和其余项目字段
  5. 单击创建项目开始导入过程
  6. 导入完成后,您将被重定向到新创建的项目

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


2
好的。如果在GitHub上的原始存储库中添加了新的提交,我是否可以将更改合并到GitHub上的存储库中?这是一个棘手的操作,可能需要使用中间存储库才能完成(请参见问题的最后一段)。 - Cimlman
导入项目是一次性的操作。除了在本地机器或管道中使用正常的git命令之外,没有办法以后将已导入的项目与上游同步以获取最新更改。您也可以在Gitlab中使用合并请求(创建分支,推送到它,然后打开合并请求并进行合并)来保持同步。 - Speeddymon

1

可以fork一个私有的github仓库。

  1. 点击新项目
  2. 选择导入
  3. 选择github
  4. 使用OAuth2进行身份验证并自动创建gitlab应用程序
  5. 选择要fork的项目

^我刚刚在github上做了这个,成功导入(包括分支等)。导入的项目自动保持私有 ;)


3
项目导入需要一个“个人访问令牌”。我尝试在GitHub上生成一个。似乎这个功能在我想从GitHub上的项目创建一个GitLab项目时很有用。这个假设正确吗?问题是关于从别人的GitHub项目中派生一个项目。 - Cimlman
3
-1,因为正如前面的评论所说,这个问题是关于fork别人的GitHub项目。在这种情况下,这个答案中的指令是不起作用的。 - Nikos Alexandris
1
@NikosAlexandris 你确定吗?难道你不能为自己的账户创建一个访问令牌,然后访问那些你已经拥有读取权限的其他人的存储库吗?(例如,每个公共存储库) - DGoiko

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