跳转到内容

分叉 (软件开发)

本页使用了标题或全文手工转换
维基百科,自由的百科全书
(重定向自复刻 (软件工程)
Linux发行版 演化的时间线图,图上每个分支的起始端都称为一次“分叉”

分叉(英语:fork,又译作派生分支)是一个软件工程名词,表示开发者从一个软件包中获取了源代码的拷贝,并开始独立开发,建立了另一个独立的软件。[比如?] 这个术语不只意味着版本控制上的新开发分支,往往还表示开发人员社区的分裂,是一种意识形式的分裂。[1] 分叉的原因一般是用户偏好不同或原始软件的开发已经停滞或停止。

根据自由及开放源代码软件的定义,这些软件可以在未经事先许可的情况下,从原始开发团队分叉,并且不会违反著作权法律。但是,专有软件(例如 UNIX)的分叉在许可之下也会发生。

词源

[编辑]

早在14世纪,“fork”一词就被用来表示“分成分支,分道扬镳”。[2] 在软件领域,该词让人联想到 fork 系统调用,运行中的进程创建一个与自身(几乎)相同的副本,这两个进程(通常)会分别执行不同的任务。[3]

在软件开发中,早在 1980 年,艾瑞克·奥尔曼 就在版本控制系统里使用“fork”来表示创建一个新的修订“分支”:[4]

创建分支会 "fork off" (分叉)出程序的一个版本。

1983 年,Usenet 开始使用该术语来表示创建子讨论组来细分讨论主题。[5]

在 Lucid Emacs(现为 XEmacs)(1991年)和 BSD(1993-1994年)派生出来时,“Fork” 一词还没有用来表示社区的分裂。当时(1993年) Russ Nelson 使用 “shattering” 一词来表示这种分叉,并将其归因于 John Gilmore[6] 到了1995年,“fork” 开始有了现在的意思,用来描述 XEmacs 的分裂,[7] 1996年该用法成为 GNU 项目中一种公认的用法。[8]

自由和开源软件的分叉

[编辑]

根据自由软件定义开源定义,自由软件和开源软件可以合法地分叉,无需经过当前开发、管理或分发软件的人员的批准。:[9]

将你修改过后的版本散布给他人的自由(自由之三)。如此你就有机会让你的改善惠及社群整体。能访问源始码是这项自由的先决条件。
— 自由软件定义[10]
3. 派生作品:许可证必须允许修改和派生作品,需要像原来的许可证那样发布。
— 开源定义[11]

在自由软件中,分叉通常是因为目标不同或个性冲突,进而导致的分裂。在分叉中,双方的代码库几乎相同,但通常只有团队更大或控制网站的的一方保留完整的原始名称和对应的用户社区。因此,分叉会带来声誉损失。[9] 双方团队间的关系可能很融洽,也可能非常紧张。另外,友好分叉软分叉是指不打算竞争,且希望最终并入原分支的分叉。

Eric S. Raymond 在他的文章《Homesteading the Noosphere》[12] 中指出:“分叉最重要的特征是它会产生竞争项目,这些项目以后无法交换代码,从而分裂了潜在的开发者社区”。他在 Jargon File 中指出

埃里克·雷蒙 在他的文章 Homesteading the Noosphere,[12] 中指出:“分叉最重要的特征是,它会产生竞争项目,这些项目以后无法交换代码,从而分裂了潜在的开发者社区”。他在 新黑客词典中指出:[13]

分叉被认为是一件坏事——不仅因为它意味着未来会浪费大量精力,还因为分叉往往伴随各后继团队在合法性、继承权和设计方向上的大量冲突和争吵。分叉往往会面临巨大的社会压力。因此,大型软件的分叉(例如 Gnu-Emacs/XEmacs 分裂、386BSD 项目分裂为三个子项目以及短暂的 GCC/EGCS 分裂)非常罕见,在黑客历史中这些事件都值得单独讲述。

David A. Wheeler 指出了[9] 四种可能的分叉结果,并给出了例子:

  1. 分叉消亡。这是目前最常见的情况,宣布分叉很容易,但继续独立开发和支持则要付出巨大努力。
  2. 分叉被重新合并。(例如 EGCS克隆 作为 GCC 的新版本被“扶正”。)
  3. 原始版本消亡。(例如 X.Org Server 完全继承,而 XFree86 消亡。)
  4. 两者共存,通常各有所长。(例如 OpenBSDNetBSD。)

GitHub、Bitbucket 和 Launchpad 等网站提供免费的 DVCS 托管,明确支持独立分支,这样大大降低了分叉源代码存储库的技术、社会和财务障碍,GitHub 使用“fork”作为这种为项目做贡献的方法的术语。

分布式版本控制 (DVCS) 工具普及了“fork”一词的另一种用法,该用法不带感情色彩,与“branch”几乎没有区别。[14] 在类似 MercurialGit 的 DVCS 系统中为项目做贡献的常规方式是,首先创建存储库的个人分支,与主存储库独立,然后设法将更改合并入主存储库。GitHubBitbucketLaunchpad 等免费 DVCS 托管网站都明确支持个人分支,从技术、社会和经济方面降低了分叉源代码的难度,GitHub 使用“fork”作为术语来描述这种为项目做贡献的方式。

Fork 的版本编号通常从头开始(如 0.0.1、0.1 或 1.0),即使原始软件已经发展到例如 3.0、4.0 或 5.0 的版本了。但是如果分叉软件被设计为原始项目的直接替代品时,也会有例外,例如 MariaDB 作为 MySQL 的替代[15]LibreOffice 作为 OpenOffice.org 的替代。

BSD许可证 允许分叉变成专有软件,而 Copyleft (公共著作权)的支持者认为,商业激励使得专有化几乎不可避免。(因为公共著作权许可证本身可以通过双重许可被规避掉,即额外以贡献者许可协议的形式授予专有权。)例子包括 macOS (基于专有的 NeXTSTEP 和开源的 FreeBSD), CedegaCrossOverWine 的专有分叉,尽管 CrossOver 紧跟 Wine 的进度并做出了相当大的贡献),EnterpriseDB (PostgreSQL 的分叉,增加了 Oracle 兼容性功能[16]),受支持的 PostgreSQL(带有专有 ESM 存储系统)[17] 和 Netezza 的[18] 专有且高度可扩展的 PostgreSQL 派生产品。部分厂商会将更改回馈给社区项目,也有厂商将他们的更改留作自己的竞争优势。

专有软件的分叉

[编辑]

专有软件 中,著作权方通常是公司实体,而不是单个软件开发人员。因此,当所有者需要开发不同版本时(窗口版和命令行版,或者不同操作系统的版本,例如一个 文字处理器 分别用于 IBM PC 兼容机和 Mac 计算机),专有的代码往往在这种情况下被分叉。这种内部分叉通常致力于在不同平台上保持相同的外观、感觉、数据格式和行为,让熟悉一个平台的用户也可以跨平台高效工作,或跨平台共享文档。这一决策通常出于财政考虑,占据更大的市场份额来弥补分叉产生的额外开发成本。

还有一次特别的专有软件分叉不是这种类型,那就是专有 UNIX 分叉出了许多变种——几乎都是在许可下从 AT&T Unix 派生而来的,都被称为 “Unix”,但相互之间越来越不兼容。[19] 参见 Unix战争英语Unix wars

参见

[编辑]

参考文献

[编辑]
  1. ^ 意识分裂往往用"Schism"这个词,例如:
  2. ^ Entry 'fork' in Online Etymology Dictionary 互联网档案馆存档,存档日期25 May 2012.
  3. ^ "The term fork is derived from the POSIX standard for operating systems: the system call used so that a process generates a copy of itself is called fork()." Robles, Gregorio; González-Barahona, Jesús M. A Comprehensive Study of Software Forks: Dates, Reasons and Outcomes (PDF). OSS 2012 The Eighth International Conference on Open Source Systems. 2012 [20 October 2012]. doi:10.1007/978-3-642-33442-9_1可免费查阅. (原始内容存档 (PDF)于2 December 2013). 
  4. ^ Allman, Eric. "An Introduction to the Source Code Control System." 互联网档案馆存档,存档日期6 November 2014. Project Ingres, University of California at Berkeley, 1980.
  5. ^ Can somebody fork off a "net.philosophy"? (John Gilmore, net.misc, 18 January 1983)
  6. ^ Shattering — good or bad? (Russell Nelson, gnu.misc.discuss, 1 October 1993)
  7. ^ Re: Hey Franz: 32K Windows SUCK!!!!! (Bill Dubuque, cu.cs.macl.info, 21 September 1995)
  8. ^ Lignux? (Marcus G. Daniels, gnu.misc.discuss, 7 June 1996)
  9. ^ 9.0 9.1 9.2 Why Open Source Software / Free Software (OSS/FS, FLOSS, or FOSS)? Look at the Numbers!: Forking 互联网档案馆存档,存档日期5 April 2006. (David A. Wheeler)
  10. ^ Stallman, Richard. The Free Software Definition. Free Software Foundation. [2013-10-15]. (原始内容存档于14 October 2013). 
  11. ^ The Open Source Definition. The Open Source Initiative. 7 July 2006 [15 October 2013]. (原始内容存档于15 October 2013). 
  12. ^ Raymond, Eric S. Promiscuous Theory, Puritan Practice. catb.org. 15 August 2002. (原始内容存档于6 October 2006). 
  13. ^ Forked 互联网档案馆存档,存档日期8 November 2011. (Jargon File), first added to v4.2.2 互联网档案馆存档,存档日期14 January 2012., 20 August 2000)
  14. ^ e.g. Willis, Nathan. An "open governance" fork of Node.js. LWN.net. 15 January 2015 [15 January 2015]. (原始内容存档于21 April 2015). Forks are a natural part of the open development model—so much so that GitHub famously plasters a "fork your own copy" button on almost every page.  参见 Nyman, Linus. Understanding Code Forking in Open Source Software (学位论文). Hanken School of Economics: 57. 2015. hdl:10138/153135. Where practitioners have previously had rather narrow definitions of a fork, [...] the term now appears to be used much more broadly. Actions that would traditionally have been called a branch, a new distribution, code fragmentation, a pseudo-fork, etc. may all now be called forks by some developers. This appears to be in no insignificant part due to the broad definition and use of the term fork by GitHub. 
  15. ^ Forked a project, where do my version numbers start? 互联网档案馆存档,存档日期26 August 2011.
  16. ^ EnterpriseDB 互联网档案馆存档,存档日期13 November 2006.
  17. ^ Fujitsu Supported PostgreSQL 互联网档案馆存档,存档日期20 August 2006.
  18. ^ Netezza 互联网档案馆存档,存档日期13 November 2006.
  19. ^ Fear of forking 互联网档案馆存档,存档日期17 December 2012. – An essay about forking in free software projects, by Rick Moen

外部链接

[编辑]