在 CentOS 計劃我們以 Git 作為首選的版本控制軟件。假若你是新手,http://git-scm.com/ 收錄了很多好的資源,當中包括入門指南。
CentOS-6 及 -7 預設已包含了 Git,而 CentOS-5 則由 EPEL 提供。
CentOS 計劃把源碼收錄於 git.centos.org,而我們視該處為本計劃的權威性上游。不同的項目,作為計劃的一部份,也許會選擇把他們的內容映射到其他地方,例如 Github。然而所有發行的內容必須建立自 git.centos.org,並在該處測試和保管。
Git.CentOS.Org
1. 計劃
git.centos.org 上的源碼以個別 rpm 或角色組織成獨立的 git 源碼庫。這些源碼庫再組成「計劃」。最主要的「計劃」名為 rpms/ ,它涵蓋我們建立和發行的所有 rpms 的源碼庫。你可以在 https://git.centos.org/project/rpms 檢視這個計劃。
一般來說,每個 SIG 都會擁有個別的計劃。此做法容許他們在自己的範圍內加入非 rpm 的內容(例如:測試工具、管理介面、腳本、等等);SIG 多數都擁有這些計劃的管理權限。
2. Git 的組織
Git 源碼庫,特別是那些含有 rpm 內容的,都以對應 CentOS 發行名稱的分支作為組織。例如:你可以在 c7 這個分支內找到 CentOS Linux 7 所發行的內容。同樣地 c5 及 c6 分支名稱對應 CentOS-5 及 CentOS-6。在正常情況下,MASTER 或 HEAD 分支內不會藏有任何內容,唯獨是一個文檔顯示在哪裡可找到實際源碼。當改動 SIG 的專用元件時,我們建議把源碼提交到一個以該 SIG 的名稱(或該 SIG 在 git.centos.org 上的計劃名稱)而命名的分支。這樣不單止容許別人檢視及追蹤他們所關注的源碼歷史,更能讓別人在不污染發行目錄的情況下建立獨立的 fork 和分支。
3. 非文字來源檔
我們只將文字源碼提交給 git。所有非文字來源檔皆被抽起,計算散列碼(sha256sum)並上載至 https://git.centos.org/sources/ 的專用緩存區內。它們被編進對應 git 分支的組別,然後再以所屬的 git 源碼庫分組。因此這些非文字來源檔的完整路徑是 https://git.centos.org/sources/<git 源碼庫名稱>/<分支名稱>/。
請留意零長度的檔案以特別形式處理,它們不會被提交給 git,也不會被推進緩存區。然而這些檔案同樣會被追蹤,並透過非文字來源檔的中繼檔獲得建立。
每個 git 源碼庫都擁有一個中繼檔,名為 .<git 源碼庫名稱>.metadata,並收錄在該 git 分支的根目錄裡。這個檔案對應 sha256sum 散列碼至他們的整全檔名,而 get_sources.sh 腳本便以它作為輸入。
4. get_sources.sh
有意運用 git.centos.org 及對它作出貢獻的用戶必須複製及設置 centos-common 源碼;它收錄在 https://git.centos.org/summary/?r=centos-git-common.git 。
複製它的 git 指令是:
[user@host]$ git clone https://git.centos.org/git/centos-git-common.git
此 git 源碼庫所收錄的東西,包括 get_sources.sh 腳本。當你在一個從 git 檢出的 rpm 源碼庫下執行該腳本時,它會分析非文字來源檔的中繼檔,下載相關檔案,並建立 SOURCES/ 目錄。你或許會想在 ~/bin 建立連結到該腳本(見以下工作範例)。
5. 範例流程
假設我們想修改 CentOS 的內核源碼。
[user@host]$ git clone https://git.centos.org/git/rpms/kernel.git [user@host]$ cd kernel # 舉例說我們要修改 centos7 的內核 [user@host]$ git checkout c7 [user@host]$ ~/bin/get_sources.sh # 切換至本地目錄樹作編輯之用 [user@host]$ git checkout -b my-kernel # 修改 SPEC 檔……等 [user@host]$ git commit -m'my local changes' -a # 確保我們能建立一個 srpm [user@host]$ rpmbuild --nodeps --define "%_topdir `pwd`" -bs SPECS/kernel.spec # 要是成功的話, [user@host]$ rpmbuild --define "%_topdir `pwd`" -ba SPECS/kernel.spec
6. 提交程式碼至現有的 git 源碼庫
我們較喜歡以 git format-patch 建立並發送至 centos-devel 郵件列表(http://lists.centos.org/mailman/listinfo/centos-devel )的修正檔。就以上文修改的內核源碼為例:
[user@host]$ git clone https://git.centos.org/git/rpms/kernel.git cd kernel # 舉例說我們要修改 centos7 的內核 [user@host]$ git checkout c7 [user@host]$ ~/bin/get_sources.sh # 切換至本地目錄樹作編輯之用 [user@host]$ git checkout -b my-kernel # 修改 SPEC 檔……等 [user@host]$ git commit -m 'my local change' -a
請為你想遞交的所有 commit 重覆這個步驟,最理想是每個 commit 只包含一項功能或改動 —— 並將多項功能分拆至個別的 commit。在你的 commit 信息內利用動詞來形容你做了甚麼亦是個好主意。要是改動是針對某個錯誤報告,請把它包含在內,並以 #<編號> 作參考。加入所有 commit 後,你可以如此建立修正檔:
[user@host]$ git format-patch c7
現在你的工作目錄內應該含有名為 0001-<commit>.patch、0002-<commit>.patch、等……的檔案;你應該把這些檔案以附件(即不是內嵌)形式發送到 centos-devel 郵件列表。請提供資訊關於你想改動甚麼,有必要的話請也提供 bugs.centos.org 內指向 http://lists.centos.org/mailman/listinfo/centos-devel 並擁有你的電郵地址的存檔郵件。
Translation of revision 13