?
Git 是 Linux Torvalds 為了幫助管理 Linux? 內(nèi)核開發(fā)而開發(fā)的一個(gè)開放源碼的版本控制軟件。我們可以自己下載這個(gè)軟件用于對內(nèi)核的 hack 分析,或者用來管理自己的軟件開發(fā)項(xiàng)目。本文將向您展示如何使用 Git 工具開始分析 Linux 。
在現(xiàn)代軟件開發(fā)項(xiàng)目中,要成為一個(gè)有效的軟件開發(fā)人員,我們必須能夠與其他項(xiàng)目貢獻(xiàn)者并行進(jìn)行開發(fā)。源代碼管理(SCM)系統(tǒng)不是什么新思想。為了編寫一些能夠更快速、簡單地開發(fā)以后軟件項(xiàng)目的軟件,已經(jīng)進(jìn)行了很多嘗試。最新的源代碼解決方案都包含了版本控制系統(tǒng),它可以對源代碼的修改進(jìn)行回滾,從而將有害的代碼剔除出項(xiàng)目之外,或者簡單地跟蹤哪些人修改了代碼的哪些行的內(nèi)容。版本控制系統(tǒng)試圖解決開發(fā)人員在試圖同時(shí)對某個(gè)文件進(jìn)行修改時(shí)所出現(xiàn)的沖突問題,可以防止用戶覆蓋其他人所作的修改。源代碼管理使用的很多流行解決方案都試圖解決以前 SCM 解決方案中的失效問題。
集中化的版本控制系統(tǒng)通常采用兩種方式:
有些提供了文件鎖來防止多個(gè)用戶的并行訪問。這些系統(tǒng)對文件進(jìn)行加鎖,這樣在某個(gè)時(shí)間只有一個(gè)開發(fā)人員對中心倉庫具有寫入權(quán)限。
另外一些工具,例如 CVS,允許多個(gè)開發(fā)人員同時(shí)對相同的文件進(jìn)行編輯,并提供了一些機(jī)制稍后合并這些修改。
流行的版本控制系統(tǒng)包括:
CVS
Subversion
Arch
Bazaar
BitKeeper
什么是 Git?
非常簡單地說,Git 是 Linus Torvalds 最近實(shí)現(xiàn)的源代碼管理軟件。正如所提供的文檔中說的一樣,“Git 是一個(gè)快速、可擴(kuò)展的分布式版本控制系統(tǒng),它具有極為豐富的命令集,對內(nèi)部系統(tǒng)提供了高級操作和完全訪問?!?/p>
Torvalds 開始著手開發(fā) Git 是為了作為一種過渡方案來替代 BitKeeper,后者之前一直是 Linux 內(nèi)核開發(fā)人員在全球使用的主要源代碼工具。開放源碼社區(qū)中的有些人覺得 BitKeeper 的許可證并不適合開放源碼社區(qū)的工作,因此 Torvalds 決定著手研究許可證更為靈活的版本控制系統(tǒng)。盡管最初 Git 的開發(fā)是為了輔助 Linux 內(nèi)核開發(fā)的過程,但是我們已經(jīng)發(fā)現(xiàn)在很多其他自由軟件項(xiàng)目中也使用了 Git。例如,X.org 最近就遷移到 Git 上來了,很多 Freedesktop.org 的項(xiàng)目也遷移到了 Git 上。
Git 目前主要由尋找 CVS 或?qū)S写a管理解決方案替代物的軟件開發(fā)人員所使用。Git 與 CVS 有很多區(qū)別:
分支更快、更容易。
支持離線工作;本地提交可以稍后提交到服務(wù)器上。
Git 提交都是原子的,且是整個(gè)項(xiàng)目范圍的,而不像 CVS 中一樣是對每個(gè)文件的。
Git 中的每個(gè)工作樹都包含一個(gè)具有完整項(xiàng)目歷史的倉庫。
沒有哪一個(gè) Git 倉庫會(huì)天生比其他倉庫更重要。
安裝
要安裝當(dāng)前版本的 Git,我們可以使用供應(yīng)商在 Linux 發(fā)行版中提供的包,或者從最新的穩(wěn)定快照開始手工進(jìn)行編譯。我建議下載包含最新 Git 源代碼穩(wěn)定快照的 tarball;截止到撰寫本文時(shí)這個(gè)版本是 v1.4.0。我們可以在下面的 參考資料 一節(jié)中找到鏈接。
有了這個(gè) tarball 之后,請確保初始安裝所依賴的包都已經(jīng)安裝了。系統(tǒng)中必須包含以下包,以及相應(yīng)的開發(fā)頭文件:
zlib
libcurl
libcrypto(OpenSSL)
rsync(2.6.0 或更高版本)
這些條件滿足之后,我們就可以開始編譯初始的 Git 安裝系統(tǒng)了。這個(gè)過程對于大部分一直使用 Linux 的開發(fā)人員來說應(yīng)該非常熟悉了。首先使用對應(yīng)下載的包格式的命令將包展開:
$ tar -jxvf git-1.4.0.tar.bz2
或
$ tar -zxvf git-1.4.0.tar.gz
然后切換到適當(dāng)?shù)哪夸浿?,并?zhí)行 make 命令。(注意目錄名取決于我們下載的快照的日期。)
$ cd git-1.4.0/
$ make prefix=/usr/local install
$ sudo make prefix=/usr/local install
您會(huì)被提示輸入 sudo 密碼才能繼續(xù)安裝。現(xiàn)在就已經(jīng)準(zhǔn)備好使用 Git 工具了。
獲得最新的內(nèi)核源代碼樹
在使用 Git 管理源代碼倉庫時(shí),我們可以使用兩種方法開始我們的工作。我們可以使用現(xiàn)有代碼的一個(gè)本地目錄,然后從中生成一個(gè)倉庫;也可以映射其他人發(fā)布的倉庫。
對于本文的目的來說,我們將獲得 Torvalds 發(fā)布的 Git 倉庫的一個(gè)鏡像。下面的命令將創(chuàng)建一個(gè)名為 linux-2.6 的 Git 倉庫。這個(gè)目錄包含了一個(gè)隱藏目錄 .git/ 。
$ git-clone
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
linux-2.6
這個(gè)步驟會(huì)執(zhí)行很長時(shí)間,因?yàn)?Git 正在將內(nèi)核源代碼(這有數(shù)百兆大)從 kernel.org 傳輸?shù)奖镜貦C(jī)器上。輸出結(jié)果可能有些晦澀難懂,但是如果您有一個(gè)快速的 Internet 鏈接,卷屏的速度應(yīng)該相當(dāng)快。輸出結(jié)果應(yīng)該類似于圖 1 所示。
圖 1. 在下載內(nèi)核源代碼樹過程中產(chǎn)生的輸出
[ 相關(guān)貼圖 ]
?
現(xiàn)在切換到包含新下載的內(nèi)核的目錄中:
$ cd linux-2.6
現(xiàn)在,我們應(yīng)該在本地機(jī)器上有一個(gè)可以工作的 Linux 2.6 倉庫了!此時(shí)我們就可以對這個(gè)倉庫進(jìn)行一些基本的操作了。
更新本地 Git 倉庫
在使用 Git 時(shí),我們通??梢约僭O(shè)自己的倉庫可能比 kernel.org 的倉庫有些滯后。因此我們通常都是首先將自己的倉庫更新成最新的上游內(nèi)核樹。這個(gè)過程有時(shí)稱為快速合并(fast-forward merge)。嚴(yán)格來說,我們現(xiàn)在并不需要執(zhí)行這個(gè)過程,因?yàn)槲覀儎倓偘惭b了自己的倉庫,它應(yīng)該還沒有過期。但是檢查一下畢竟沒有壞處:
$ cd linux-2.6
$ git-pull git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git
...
如果成功,我們就應(yīng)該會(huì)看到類似于下面的輸出結(jié)果:
receiving file list ... done
sent 130 bytes received 21677 bytes 14538.00 bytes/sec
total size is 127865858 speedup is 5863.52
Already up-to-date.
$>
如果我們的倉庫不是最新的,就會(huì)看到有些內(nèi)容通過網(wǎng)絡(luò)傳輸?shù)奖镜貦C(jī)器上了。
從倉庫中導(dǎo)出文件
我們需要將文件從 Git 倉庫(隱藏目錄中的那些文件)中導(dǎo)出到工作目錄中才能開始自己的 hack 過程。下面的命令會(huì)在當(dāng)前目錄中寫入沒有隱藏的目錄,其中包含了 Linux 的源代碼:
$ git-checkout
如果您希望覆蓋本地修改,可以使用 -f 選項(xiàng)導(dǎo)出文件,這樣就可以將您帶回到一個(gè)干凈的狀態(tài):
$ git-checkout -f
現(xiàn)在在當(dāng)前工作目錄中,我們應(yīng)該就可以看到熟悉的 Linux 源代碼目錄結(jié)構(gòu)了,然后我們可以對這些源代碼任意進(jìn)行修改。
修改現(xiàn)有文件
我們現(xiàn)在可以修改所選擇的任何文件。舉一個(gè)簡單的例子來說,我們將修改 docs 目錄中的一些內(nèi)容:添加一條以后可以很容易識別的信息。為了讓我的例子更容易試驗(yàn),我沒有選擇修改源代碼;不過只要您希望,歡迎繼續(xù)重寫整個(gè)內(nèi)核的子系統(tǒng)。
首先,讓我們在編輯器中打開一個(gè)文件:
$ vi ./document.tion/ManagementStyle
顯然,我使用的是 vi;不過您當(dāng)然可以使用自己喜歡的任何編輯器來完成這項(xiàng)工作。在編輯文件時(shí),我在第一段前面添加了一行:“Eli shall be in charge of managing sandwich consumption. See document.tion/Sandwiches for more.”
如果您對自己所做的修改非常滿意,并且覺得自己已經(jīng)準(zhǔn)備好將其作為倉庫的一個(gè)永久部分了,就需要使用下面的命令導(dǎo)入您的修改:
$ git-commit document.tion/ManagementStyle
您會(huì)被提示說要求提供一個(gè)提交消息,它是一個(gè)用戶生成的注釋,用來幫助其他開發(fā)人員(也可能是您自己以后)理解剛才的實(shí)現(xiàn)到底進(jìn)行了哪些修改。在我們的例子中,提交消息是一個(gè)描述剛才對文檔所做修改的短句。
如果您希望檢查一下到目前為止工作的狀態(tài),可以執(zhí)行 git-log 來查看本地倉庫的歷史(它繼承了所克隆的倉庫的信息)。您的提交消息應(yīng)該在日志的最上面。
添加或刪除文件
但是請等一下!我們還沒有添加 document.tion/Sandwiches 文件呢,因此我們需要將其添加到工作目錄中,并告訴 Git 何時(shí)這個(gè)文件已經(jīng)準(zhǔn)備好了。我使用 echo 命令創(chuàng)建了想要添加的文件,因?yàn)檫@只是一個(gè)簡單的例子而已。同樣,您也可以使用自己喜歡的工具。
$ echo "Turkey is superior" > document.tion/Sandwiches
現(xiàn)在我們已經(jīng)添加了一個(gè)文件,接下來需要將這個(gè)文件添加到 Git 中,從而讓 Git 了解這種變化,然后才能提交這個(gè)版本。我們可以通過執(zhí)行下面的命令來完成這些任務(wù):
$ git-add document.tion/Sandwiches
$ git-commit document.tion/Sandwiches
如果您添加了多個(gè)文件,可以在同一行中的 git-add 命令后面列出這些文件,不過您也不必一次將它們?nèi)刻砑拥絺}庫中去。如果要?jiǎng)h除某個(gè)文件,并且沒有 git-add 之類的特殊命令;您只需要?jiǎng)h除這個(gè)文件,然后提交就可以了。
現(xiàn)在應(yīng)該查看一下 git-log,從而確保到現(xiàn)在為止所做的事情都是正確的。這一次,我們將使用 -p 選項(xiàng)來以單獨(dú)的補(bǔ)丁格式查看日志。
$git-log -p
創(chuàng)建 diff 文件
最后,我們希望生成一個(gè)包含您修改后的文件和原文件之間區(qū)別的文本文件。這個(gè)文件通常是使用 diff 工具創(chuàng)建的,因此就稱為 diff 文件。diff 可以幫助我們創(chuàng)建補(bǔ)丁文件(patch file),后者是我們向很多開放源碼軟件項(xiàng)目發(fā)送代碼提交時(shí)通常使用的方法。有關(guān) diff 的更多內(nèi)容,請參看下面 參考資料 部分中有關(guān) Kernel.org 的鏈接。
Git 還可以干什么?
我們可以使用 Git 來管理本地倉庫,而不用鏡像其他人的工作。例如,如果我們喜歡使用 Git 來管理自己個(gè)人對某個(gè)開放源碼項(xiàng)目貢獻(xiàn)的文件,就可以從項(xiàng)目快照中生成一個(gè) Git 倉庫。
假設(shè)我們已經(jīng)有了一個(gè)名為 release.tar.gz 的標(biāo)準(zhǔn) release tarball,可以執(zhí)行下面的命令來創(chuàng)建一個(gè)本地的 Git 倉庫:
$ tar -zxvf release.tar.gz
$ cd release
$ git init-db
我們可以看到消息說 Git 是 “默認(rèn)于本地存儲區(qū)域的”。這些消息都是正常的,說明我們有一個(gè) Git 倉庫。
現(xiàn)在我們已經(jīng)對工作目錄進(jìn)行了初始化,接下來在項(xiàng)目目錄中應(yīng)該會(huì)看到一個(gè)新目錄 .git。為了告訴 Git 我們希望對這個(gè)項(xiàng)目中的每個(gè)文件都進(jìn)行跟蹤,請執(zhí)行下面的命令:
$ git add .
最后,使用下面的命令將所監(jiān)視的文件提交到倉庫中:
$ git commit -a
同樣,系統(tǒng)會(huì)提示我們輸入提交消息。從現(xiàn)在開始,我們就可以在自己的 Git 倉庫中使用 Git 所提供的完整功能了,例如對實(shí)驗(yàn)特性進(jìn)行分支,為了追蹤回歸測試問題而將代碼一分為二,并使用常見的版本歷史功能。
有關(guān) Git 的分支管理和其他有趣特性的更多信息,請參看 Kernel.org 上給出的 Git 的優(yōu)秀教程(參見 參考資料 中的鏈接)。
結(jié)束語
現(xiàn)在我們已經(jīng)知道如何使用 Git 來獲取 Linux 內(nèi)核源代碼和其他 Git 管理的項(xiàng)目了,接下來可以選擇使用 Git 來管理下一個(gè)開發(fā)項(xiàng)目。 Git 仍然相對較新,仍然處于不斷開發(fā)中。
評論