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

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

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