使用過 github 的人大多知道它上面有個“fork”的功能,用來将某個倉庫克隆到你的賬戶之下,進而可以對其進行修改、衍生,也可以比較友善的将你的修改推回到原來的倉庫(所謂的上遊)。
随着 github 的流行,我們經常能在各種文章中見到,“fork 某某項目”等說法,是的,“fork”這個一直沒有一個正式的譯名。
其實這個問題不獨出現在 github 中,fork 這個詞更早的出現在 unix/linux 中的 c 語言程式設計之中。在 unix/linux 的程序模型中,fork 是指程序建立自身副本的操作,它通常是一個在核心中實作的系統調用。fork 是 unix 類系統中程序建立的主要方式(曆史上曾經是唯一的方式)。從那個時候起,fork 就一直沒有一個确定的譯名。
不過,我們認為,對于這樣的一個經常使用的專業名詞,有一個明确的譯名比較适合,雖然大家都習慣了直接用 fork 一詞。
fork 一詞在英文中的原意是“叉子”, 雖然翻譯成“分叉”、“分支”似乎也可以,但是前者較少用做動詞,後者則和 branch 的譯名重複混淆。
據 linux 中國翻譯組(lctt)的譯者 dongfengweixiao 提議,可譯作“複刻”,我們認為這是一個可取的譯法,一方面照顧到了音譯,另一方面其釋義也形象直覺。
既然說到這裡,順便我們對複刻fork做一個技術方面的簡介吧。
在 github 上評價一個項目(倉庫)是否流行,其中一個重要名額就是其複刻fork數。
在 github 上參與一個開源項目的程度有三個階段: star(點贊),如果你覺得某個項目不錯,可以為其點贊(star) watch(關注),如果你希望進一步關注這個項目的進展,可以關注(watch)它 fork(複刻),如果你還想進一步為這個項目做一些貢獻,可以複刻(fork)它到你自己的賬戶下,做出了修改之後通過 pull-request(pr)方式将你的改動推回給原倉庫(上遊),如果被接納就會進入到原倉庫之中
顯然,一個項目的複刻數越高,代表着貢獻者越多。
通過複刻fork + pr 的方式對開源項目進行貢獻的流程類似下圖:

<a target="_blank"></a>
在 unix 下的 c 語言程式設計中,通過 fork() 系統調用來對程序本身進行複制,然後被複制出來的子程序就可以執行不同于父程序的操作,或通過 exec() 運作其它程序。典型的 c 代碼如下:
<code>fpid = fork();</code>
<code></code>
<code>if (fpid < 0)</code>
<code>printf("error in fork!");</code>
<code>else if (fpid == 0) {</code>
<code>printf("i am the child process, my process id is %d/n",getpid());</code>
<code>} else {</code>
<code>printf("i am the parent process, my process id is %d/n",getpid());</code>
<code>}</code>
其實,不隻是 c 語言裡面有複刻fork的功能,在 shell 裡面也有,想必大家可能都聽說過 “fork 炸彈”,這就是利用函數的疊代執行,無限複刻fork出許多子程序,進而耗盡系統資源,導緻系統崩潰的一個惡意(玩笑)用法。
原文釋出時間為:2016-10-20
本文來自雲栖社群合作夥伴“linux中國”