跳至內容

分叉 (軟體開發)

本頁使用了標題或全文手工轉換
維基百科,自由的百科全書
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

外部連結

[編輯]