GitHub:将Fork变成“自己的项目”

139

我发现了一个很好的GitHub项目,并对其进行了许多扩展。我相信我的更改是好的,因为它们能够正常运行。但似乎原作者没有时间审核这些更改并将它们包含进去。实际上,我的需求和实现的功能可能不在原作者的视野内,我们只是追求不同的目标。我不清楚,因为我从未得到过他的回复。

话虽如此,我发现我的贡献没有被计入我的提交地图。只要原始存储库不接受我的贡献,就会出现这种情况。此外,我的工作只被认为是工作,没有吸引到与我有相同愿景的其他人。这对我来说是更大的问题,因为我看到很多人正在寻求这些功能。

我仍然向原项目提供我的贡献,但我认为它们不太可能被接受。现在我想让我的分支成为一个“真正的项目”。虽然我计划在某些时候与原始项目同步,但我想重新命名它,并激励人们为我的项目做出贡献。此外,我希望GitHub显示该项目正在积极维护(指提交地图)。最后,我想发布一个适当的版本。

我应该如何做,使我的分支成为一个完整的项目呢?


我有些困惑,也许自2014年以来情况发生了变化,但我的 TightBlog 项目在左上角被列为 Apache Roller 的分支:https://github.com/gmazza/tightblog,尽管我的所有问题、PR 等都没有应用到Apache Roller 主项目中,而只是应用到了我的分支项目中(https://github.com/gmazza?tab=overview&period=monthly),但我仍然获得了全部的信用。我不确定将分支作为独立项目的好处是什么。 - Glen Mazza
6个回答

90

9
这样做可以保留观星者、关注者以及分支网络,而不像从头开始创建一个新版本库。 - Johnco
1
值得注意的是,GitHub支持让我选择重新设置子分支或将它们保留在我的存储库中。 - gmarmstrong
1
如果你写下“从父仓库分离fork”,你甚至可以将你的fork URL发送给一个聊天机器人,它会帮你打开一个工单。请注意,你无法指定子fork的重新父级。详见https://dev59.com/-10b5IYBdhLWcg3wUP0X#OrulEYcBWogLw_1bGkCL - pawamoy

43
为了实现这个目标,你需要复制该仓库。简短的步骤如下:
  1. 在 GitHub 上创建一个新的仓库。
  2. 克隆你想要与其父仓库分离的派生仓库。
  3. 将此克隆中的所有分支推送到你的新仓库中。

如果您想让您的存储库仍然具有相同的名称,您可以克隆您的存储库,删除GitHub上的存储库,创建一个具有相同名称的新项目,并将所有内容推送。 - Rory O'Kane
14
看起来 GitHub 的拉取请求只能在项目的 GitHub 分叉之间进行。因此,如果您复制您的存储库,您无法从新的存储库发出拉取请求。如果您删除并替换旧的存储库,所有现有的拉取请求可能会被关闭,因为 GitHub 认为代码已被删除,您将无法发出新的拉取请求。 - Rory O'Kane
9
不建议这样做,因为可能会误导人们采取不必要的行动。应该接受Oleh的回答:联系GitHub支持是正确的方法。我用了不到一个小时就将我的fork转换成了独立的仓库。 - Georgii Ivankin

12
  1. 打开Github支持

  2. 将主题输入为“分离一个派生项目”。提示出现了虚拟助手,点击进入。

enter image description here

  1. 按照指示操作!

enter image description here

结果

enter image description here


11

这很简单:

  1. 在某个地方克隆该存储库:git clone git@github.com:USERNAME/REPOSITORY.git(确保已克隆)
  2. 在 GitHub 中删除该存储库(Settings > Options > Delete this repository)
  3. 创建一个新的空存储库在 GitHub 中
  4. git remote set-url origin git@github.com:USERNAME/NEW_REPOSITORY.git(如果使用相同的名称,则 NEW_REPOSITORY == REPOSITORY
  5. git push

(我使用 ssh,但如果您使用 https,则 Github URL 将类似于 https://github.com/USERNAME/REPOSITORY.git


3

仅将源代码、git提交、标签和分支传输到远程存储库:

  1. git clone --bare [旧/源存储库的 git url]

    使用bare标志,只克隆工作目录的 .git 目录。

  2. cd [最近克隆的存储库]

  3. git push --mirror [新/目标存储库的 git url]

    使用mirror标志,它会覆盖目标存储库并推送所有基于 .git 目录的提交历史记录、标签和分支。

在这个阶段,虽然新的仓库已经在远程更新了,但是本地副本没有常规的git工作目录内容(源代码等),因为该仓库是裸仓库
要在本地获取新/目标仓库的工作目录,一种简单的方法是重新克隆新的远程git仓库,或者使用下面提到的现有的.git目录进行克隆。 git clone [第1步克隆的.git目录] [新/目标仓库的目录] 注意:
  • 这将不会保留仓库的描述、拉取请求、观察者、分叉、星标用户、分支配置(例如默认分支、受保护分支等)。如果需要转移这些数据,如其他答案所述,联系GitHub支持似乎是正确的方式。
  • 使用bare和mirror标志复制git repo的想法来自于此GitHub文档
  • 我知道这个问题已经有答案了,但我只是添加相关信息,希望能帮助其他用户。

我向 GitHub 支持发送了一张工单,他们很快就完成了我的要求,以便保留存储库的星标。 +1 - Benyamin Jafari
那真是天才啊,兄弟。 - undefined

1

首先,您应该检查许可证是否允许您这样做。一般来说,开源软件强制要求您这样做,因为这就是软件演进的本质,没有任何限制。如果是这样,请创建一个新仓库。不要忘记给原作者致谢,并开始您的项目。


4
这个软件是使用 MIT 许可证授权的,我会像往常一样表彰原作者。实际上,如果原作者能够接受我的代码(或者告诉我他为什么不接受),那就更好了。 - Christian
1
如果许可证不允许您创建一个不是原始GitHub分支的存储库,则该项目首先不应该是公共GitHub项目,因为公共项目应该在开源许可下发布。我想不出任何开源许可证禁止复制代码的情况。这就是开源的全部意义。(当然,可能会有归属要求——但是可以满足这些要求而无需将项目作为“适当的”GitHub分支。) - cdhowie
1
作者肯定应该将他们的项目设置为自由软件,但如果他们没有这样做(例如,如果没有许可证),那么该项目就是非自由软件。https://stackoverflow.com/a/16934573/6791398 - gmarmstrong

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