最近 Hacker News 上的一则标题引起了轰动 (原始推文在此)

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

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