删除 GitHub 仓库的 fork 依赖

336

我该如何使GitHub忘记或取消关联我的仓库最初是另一个项目的分支?

我在GitHub上fork了一个项目。现在我可以看到"forked from whatever/whatever"。原始仓库"whatever/whatever"不再维护。我已经被允许继续使用原始仓库的代码库创建独立的仓库。

是否有一种方法可以将我的项目与原始仓库分离?

8个回答

322

2022年1月更新:

请使用GitHub聊天机器人虚拟助手:https://support.github.com/contact?tags=rr-forks&subject=Detach%20Fork&flow=detach_fork

第一个回答: 你可以联系GitHub支持,请求将你的代码库切换到“正常模式”。

这个页面的“提交是在Fork中完成的”段落中,解释了需要通过支持来进行切换。因此,很可能没有办法自己完成(除非你销毁并重新创建你的repo,但要小心,如果你的项目附带有票据或维基,它们将会被删除!)。


60
我可以确认联系客服非常顺畅,而且他们通常在几个小时内回复 :-) - BenC
3
页面已经更改,但最后一部分仍包括:“要将 fork 分离并将其转换为 GitHub.com 或 GitHub Enterprise 上的独立存储库,请联系 GitHub 支持或您的站点管理员。” - Thomas Moulard
5
在Github Enterprise中,您现在可以在管理员->协作->网络下找到它,根据您的用例,您应该使用“Make Root”、“Detach”或“Extract”。 - Kutzi
5
我希望GitHub不要把forks当作二等公民,从而使这种“分离”变得必要。Forks应该保留其从父级forks继承的内容,并且它们应该被视为与“root”repos平等的存在。在fork上工作并没有什么可耻的,相反,与他人合作和继承是值得骄傲的,我们不应该为了让repo得到一流的待遇而抹去这种继承关系。 - mindthief
6
我在10分钟前通过虚拟助手请求分离两个叉子,但在5分钟后它们都已经分离了 :O - Chih-Hsuan Yen
显示剩余11条评论

120

您可以从GitHub UI中将派生库复制到新的库(没有依赖项),然后删除原始的派生库:

  • 登录GitHub
  • 选择右上角的+符号,选择导入存储库
  • 导入您的派生库。新的存储库将不具有派生依赖关系。
  • 在存储库设置中删除原来的派生存储库。

注意:这种方法将不会保留问题和拉取请求。


2
有其他人遇到导入功能“挂起”的问题吗?我的已经在“检测您的项目版本控制系统…”上停留了大约5个小时。我不确定是否正在排队还是实际挂起了。仓库很小。我想留它过夜,以防我在排队中。 - Benjamin West
1
我最终变得好奇,然后只是点击了“取消”。点击取消允许它跳过VCS检测,直接导入代码/提交/分支等。这是从Github导入到Github的情况。如果我来自不同的VCS,导入可能不会挂起?不确定。请注意,在使用第二个存储库进行此操作时,我必须取消两次才能使其正常工作。如果CLI复制了所有相同的数据,那可能是一种更好的方法,但希望这可以帮助选择这条路线的其他人。 - Benjamin West
13
为了明确起见,这种方法不会保留问题和拉取请求。 - golopot
不需要支持电子邮件的简单解决方案。所有提交也都被注册了。真的很好。 - andy
无法工作。也许目标仓库是私有的? - Jehong Ahn

47
确保您的本地存储库中具有所有重要的分支和标签,删除 github 存储库,通过常规方式重新创建存储库(不进行 fork 操作),并使用 git push --all 命令将本地存储库推送回去。请注意,如果您有不想发布的本地分支,可能值得为该操作创建一个临时干净的本地克隆。
然而,这也会清除 wiki 和问题。由于 wiki 实际上是一个独立的存储库,因此可以通过克隆、重新创建和推送来类似处理。存储库地址在 wiki 的 Git Access 页面上 (git@github.com:user/repo.wiki.git)。
这样就留下了问题。它们可以通过API导出,但据我所知,您只能使用自己的帐户创建问题和评论,因此无法完美地导入它们。
因此,如果您需要保留问题,请像 Thomas Moulard 建议的那样联系 github 支持团队。

根据问题的数量,可能可以在从网站中删除旧存储库之前将它们逐个转移到新存储库中 (https://help.github.com/en/github/managing-your-work-on-github/transferring-an-issue-to-another-repository)。我猜一个有决心的人每小时可以转移超过100个问题 - 这不是一件有趣的事情,但对于许多存储库来说是可行的。 - Suma

28

我遇到了类似的问题,最后使用了这个github帮助页面解决了问题。由于我的博客是使用另一个用户友好开发的主题,因此我并不关心wiki和问题跟踪器。

如果想要从forked repo分离出来,并在不失去整个历史记录的情况下将其用作自己的repo:

git clone --bare git@github.com:user/forked_repo.git

在github网站上创建一个新的空仓库new-repository,然后推送镜像版本:

cd user.github.com.git/

git push --mirror git@github.com:user/new-repository.git

可以在github上重命名forked_repository并保留备份以便需要时检查更新,或者直接删除它。

new-repository重命名为原始名称即可完成操作。作为副作用,现在您的提交记录将出现在您的历史记录中。


1
已经等待支持回复超过3个小时了。不过这个方法对我有用。保住了我的81天提交连续记录:)谢谢! - Wakeel

27

使用您的凭据登录GitHub。

前往https://support.github.com/contact?tags=rr-forks&subject=Detach%20Fork&flow=detach_fork

选择“分离”,然后输入分支的URL或repo名称作为your-user-name/repository-name,并回答虚拟助手的其他问题。

您将收到一封带有工单号码的电子邮件,您可以通过该号码检查请求的状态。 您还将通过电子邮件收到通知,一旦您的repo被 deforked。

大多数仓库设置将保持不变,包括用户权限,stargazers,问题,PR,讨论等。


2
这个解决方案完美地运行了,我能够在 Firefox (94.0.2) 中使用虚拟助手。 - merosss
非常好的答案,谢谢。顺便说一下,如果你还没有提交到分叉版本库,助手建议先删除分叉并克隆原始存储库。截图 - Nazım Gediz Aydındoğmuş

19

aurelienClayton提供的信息帮助下,我使用以下方法完成了此操作:

$ git clone --bare https://github.com/my/forked_repo.git
<delete forked_repo on GitHub>
<recreate repo on GitHub using same name>
$ cd forked_repo.git
$ git push --mirror

这里是关于 git clone --bare文档

创建一个裸的 Git 仓库。即,不再创建 <directory> 目录并将管理文件放在其中的 <directory>/.git 目录下,而是直接将 <directory> 作为 $GIT_DIR。因此必须使用 -n 参数,因为无处可用来检出工作树。此外,远程仓库上的分支头会被直接复制到相应的本地分支头,而不是映射到 refs/remotes/origin/。使用该选项时,不会创建 remote-tracking 分支和相关的配置变量。

这里是关于 git push --mirror文档

不指定要推送的每个 ref,而是将 refs/ 下(包括但不限于 refs/heads/refs/remotes/refs/tags/)的所有 ref 都镜像到远程仓库。新创建的本地 ref 会被推送到远程端,本地更新的 ref 会被强制更新到远程端,已删除的 ref 会从远程端删除。如果配置项 remote.<remote>.mirror 被设置,则这是默认操作。

注:与其他基于 git 的答案一样,这不会复制不属于 git 仓库的问题,例如 wiki 和 issues。根据 Tapio 的说法:

  • wiki 是一个单独的 git 仓库,可以使用类似的方法进行处理。其地址为:git@github.com:user/repo.wiki.git
  • 可以通过 GitHub API 导出 issues,但重新创建它们存在问题,因为它们只能由您的用户创建,所以导入将丢失信息。

2
这正是我想要的。谢谢!! - superdud

16

此操作仅适用于GitHub企业版,不适用于github.com。

以具有管理员特权的帐户登录:

  1. 前往需要分离的存储库:https://<ghe url>/<org>/<repo>
  2. 单击右上角的“网站管理”火箭
  3. 在顶部菜单栏中点击“协作”
  4. 在左侧窗格中点击“网络”
  5. 在网络结构窗格中单击“Make Root”
  6. 接受

此方法已在GitHub Enterprise 2.9上进行了测试。


3
根据您的使用情况,“分离”或“提取”可能更合适。我认为“使根节点”有点奇怪,因为它基本上会颠倒当前的根->子级方向。(Github Enterprise 2.17) - Kutzi

-1

如果您不需要任何过去的提交记录(在我的情况下是这样),您可以:

  • fork 该项目
  • 创建该 fork 的本地副本(我使用我的 IDE 完成此操作)
  • 从本地副本中删除 git 文件夹
  • 像通常一样提交该项目作为新项目。

您可以在 github 帐户中删除该 fork。只需花费一分钟即可,非常简单。


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