最近 Hacker News 上的一个标题引起了轰动 (原始推文链接)

标题Google forked Swift,既准确又令人困惑。为什么会引起如此轩然大波?因为在自由和开源软件中,“fork”一词有两种含义。让我们进一步深入探讨。
Fork
Fork 项目的概念在自由和开源软件中已经存在了几十年。“Fork”意味着复制一个项目,重命名它,并围绕该副本启动一个新的项目和社区。Fork 项目的人很少甚至从不再次为父项目做出贡献。这相当于 Robert Frost 的诗: 代码库中有两条路径分叉,我,我选择了人迹罕至的那条……这造成了巨大的差异。
项目 fork 可能有很多原因。也许项目已经搁置了一段时间,有人想重新启动它。也许资助该项目的公司已被收购,社区担心新的母公司可能会关闭该项目。或者,也许社区内部存在分裂,部分社区已决定在该项目中朝着不同的方向发展。通常,项目 fork 伴随着大量的讨论,甚至可能还有社区冲突。无论原因是什么,项目 fork 都是复制一个项目,目的是围绕它创建一个新的、独立的社区。虽然 fork 确实需要一些技术工作,但它主要是一种社会行为。
在自由和开源软件的历史中,出现过很多 fork。一些著名的例子是 MariaDB 从 MySQL fork 出来,NextCloud 从 OwnCloud fork 出来,以及 Jenkins 从 Hudson fork 出来。
Clone
在过去,我们这些想在代码库上工作的人会启动我们的 CVS 或 Subversion,并 check out 代码,以便在我们的沙箱中创建工作副本。
然后 git 出现了(Mercurial 也是,但它与这个问题没有直接关系)。作为一种 分布式版本控制系统(又名 DVCS),您不再“check out 工作副本”主存储库。相反,存储库的每个副本本身都可以对某人来说是主要的。要在 DVCS 中工作,您仍然必须获取代码的副本,但复制的代码与原始代码一样有效,并且可能与原始代码一样主要。因此,与其对代码执行 checkout,不如 clone 它。就像 "Orphan Black" 或任何其他优秀的科幻节目一样,clone 与原始来源相同,并且有可能成为主存储库,尽管这种情况很少发生(在 FOSS 中,如果不是在科幻中)。
如果您希望为使用 git
作为其版本控制系统的项目做出贡献,则需要创建它的 clone。例如,要为 Public_Speaking 存储库做出贡献,您首先需要使用以下 git 命令创建一个 clone
git clone https://github.com/vmbrasseur/Public_Speaking.git
这将创建存储库的本地 clone,您可以对其进行任何您喜欢的更改。如果您希望将更改贡献回原始存储库,则必须发送 pull request。除非原始存储库的维护者授予您直接访问权限,否则如果没有它的 clone 和针对它的 pull request,您将无法为该存储库做出贡献。
Clone 与 fork 不同,是技术行为,不需要涉及社区或任何社会变革。
复杂之处
在自由和开源软件中,没有什么事情是真正简单的,因此自然而然地,整个过程存在复杂之处。
当 GitHub 在 2008 年推出时,它选择 fork 这个词来表示 git clone
命令的操作。当您在 GitHub 上 fork 一个项目时,您实际上只是创建了它的一个 clone——您可以在其上执行工作的副本。完全有可能从这里您可能会选择以原始意义 fork 该项目:创建一个单独的项目和相关的社区,而不是简单地将 pull request 发送回原始项目。然而,几乎所有 fork GitHub 项目的人都只想创建一个个人工作副本,即 clone。fork 这个词的这种过载用法在自由和开源软件社区中引起了不小的混乱,最近引起了人们的恐慌,即 Google 可能已经 fork(在原始意义上)了 Swift 编程语言(暗示它正在创建一个新的、单独的项目),而不是它实际所做的:clone 该项目以便为其做出贡献,就像任何优秀的自由和开源公民都会做的那样。

所以您看,通常您的 fork 是一个 clone,但有时它是一个 fork。这一切都取决于您是仅仅为原始社区做出贡献 (clone) 还是试图组建一个新的社区 (fork)...或者如果您使用的是 GitHub,在这种情况下,您的 fork 是一个 clone,反之亦然。
6 条评论