Linux 的版本控制

來源:互聯網
上載者:User
 

2006 年 11 月 06 日

版本控制系統或資源管理系統是現代軟體開發的一個重要方面。不使用版本控制 系統就如同超速駕駛一輛汽車:很刺激,也可能會更快抵達目的地,但事故卻在所難免。本文概述了軟體組態管理(SCM)系統及其優勢,內容涵蓋 CVS、Subversion、Arch 和 Git。本文還討論了最常見的 SCM 體繫結構。本文在最後給出了新出現的一些方法及這些方法與先前方法的區別。

什麼是軟體組態管理?

在學校學習的重要工具中,通常不會 包含 SCM。軟體(或資源)控制,正如其名字所暗示的那樣,是一種工具和一種相關的過程,而這種過程被用於維護原始碼及其演化。SCM 提供的主要功能如下:

  • 在存放庫(repository)中維護一個檔案。
  • 在存放庫中維護檔案的修訂。
  • 檢測源更改衝突並為多個開發人員的環境提供合并。
  • 跟蹤變更的發起方。
  • 為了實現一致、可重複的構建提供檔案(相關修訂)的組態管理。
SCM 的適用性
資源控制 主要是指原始碼和相關檔案的控制,而資源管理 則可應用於任何類型的資源。包含超文字標記語言 (HTML)(HTML)和二進位影像檔、一般文字文件或其他任何檔案的 Web 網站是 SCM 系統進行修訂控制的對象。

所以,SCM 允許您控制存放庫中的一組檔案並跟蹤這些檔案的修訂。其他開發人員更改了存放庫中的這些檔案後,SCM 會標識出這些變更與您所做的變更之間存在的衝突,然後自動將其合并或通知您存在衝突。這個功能非常重要,因為它允許多個開發人員修改同一組檔案。SCM 還能跟蹤出誰做了何種變更。SCM 還允許您將檔案按邏輯劃分為相關的檔案組,比如組成軟體映像或可執行檔的源檔案。

SCM 的術語

在深入研究 SCM 體繫結構的類型和細節之前,先要熟悉一下術語的含義。存放庫 是檔案儲存體和管理的中心位置(有時又被稱為)。從存放庫中取出檔案放到本地系統的工作資料夾的過程被稱作簽出。如果變更了本地檔案而又想同步變更存放庫,就需要執行更新。如果要將變更後的檔案簽入到存放庫,就需執行提交。如果所變更的檔案先前已經被變更並已由別人提交,則會發生合并,表明兩組變更集將會被合并在一起。若由於變更衝突的原因不能合并時,則必已發生了衝突。在此情況下,提交被拒絕,並要求開發人員手工合并變更。當提交了變更之後,就會建立此檔案的一個新的修訂

一個或多個開發人員可以對主樹(存放庫的當前頭)或位於主樹旁的單個的分支進行操作。這就讓開發人員可以操作分支而不會影響到主樹。當分支穩定後,再將分支與主樹進行合并。

要標記源樹演化過程中的重要階段,可以對一組檔案修訂應用標籤。這會將這組檔案組合成一個有用的集合(有時會用作針對於惟一構建的檔案的一個發布)。



回頁首

體繫結構

各種 SCM 間有許多的差異,其中有兩種最基本的區別很值得研究:

  • 集中式存放庫與分布式存放庫
  • 變更集模型與快照模型

集中式存放庫與分布式存放庫

現代 SCM 體繫結構的最為重要的差異之一是存放庫是集中式的還是分布式(分散的)。當前最為常見的體繫結構是集中式存放庫。這個星型 體繫結構由中心的源存放庫和工作於這個存放庫的多個開發人員組成(參見圖 1)。開發人員從中心存放庫簽出原始碼到本地的沙箱內,進行變更後,將它提交回中心存放庫。其他開發人員就可以再訪問這些變更。

圖 1. 在集中式體繫結構中,所有開發人員都通過同一個中心存放庫進行工作

中心存放庫也可以建立分支,允許多個開發人員協作於針對位於存放庫(但必須在 mainlinetip 之外)的資源的一組變更。

分布式體繫結構則允許開發人員為其變更建立其自己本地的存放庫。本地開發人員的存放庫與原始的存放庫(已被分布)很相似。主要的區別是:在集中化的 方式中,變更是在沙箱內完成的,而在分布式方法中則允許開發人員工作於分離的存放庫。開發人員進行變更、提交變更到其本地的存放庫,之後,在不影響主乾的 前提下,與其他開發人員的變更合并。這樣,本地開發人員就使得變更集對上線(upline)開發人員可用(參見圖 2)。

圖 2. 在分散體繫結構中,開發人員通過其各自的存放庫員同步工作

分散體繫結構很有意思,因為它允許不同的開發人員在對等網路內同步工作。當工作準備好(最好是穩定)後,開發人員可以分發變更集(或修補)以使他人也可以使用這些特性。這是當今許多開源系統的模型,包括 Linux 核心。

變更集模型與快照模型

早先的和現代的 SCM 的體繫結構的另一個有趣的區別是 delta 變更的儲存方式。它們理論上是相同的,且產生的結果也相同,但在修訂的儲存方式上二者卻大不相同。

在快照模型中,整個存放庫的每個修訂(帶最佳化以減少樹的大小)的全部檔案都被儲存。而在變更集模型中,只有 delta 被儲存於修訂之間,這樣就建立了一個精簡的存放庫(參見圖 3)。

圖 3. 快照模型和變更集模型各有所長

從圖 3 可以看出,模型不同但結果卻相同。在快照模型中,可以快速獲得修訂,但需要更多的空間來儲存它們。而變更集模型需要的空間少,但需要更多時間來獲得某個修 訂,原因是 delta 必須應用於基本修訂。在本文後面的部分將介紹如何建立最佳化來最小化必須要應用的 delta 的數量。



回頁首

樣本 SCM

讓我們來看一下按體繫結構(集中或分布)劃分的一些 SCM。您很快就會看到,其中一些 SCM 支援兩種模型。

CVS

並發版本系統(Concurrent Versions System,CVS)是當今最為常用的 SCM。它是一種集中式的解決方案,採用了快照模型,開發人員使用集中式的存放庫來進行軟體的協作開發。CVS 十分常見而且是 Linux 發布版的一部分。其簡單和方便的文法(對大多數人而言)使其迅速成為了多個或單個開發人員 SCM 的一種理想選擇。

清單 1 給出了一組 CVS 命令樣本和簡短的相關描述。要獲得關於 CVS 的更多資訊,請參閱 參考資料 部分。

清單 1. CVS 命令樣本

# Create a new repository
cvs -d /home/user/new_repository init

# Connect to the central repository
export CVSROOT=:pserver:user@example.com:/cvs_root

# Check out a sandbox for module project from the central repository
cvs checkout project

# Update a local sandbox from the central repository
cvs update

# Check in changes from the local sandbox to the central repository
cvs commit

# Add new files to the local sandbox (need to be committed)
cvs add <file/subdirectory>

# Show changes made in the local sandbox
cvs diff

對於喜歡用指向-單擊方式操作的使用者,CVS 提供了許多開源的圖形化前端以供使用,包括 WinCVS 和 TortoiseCVS(整合了 Microsoft Windows Explorer)。

儘管 CVS 被廣泛採用,但它仍然有一些不足之處。CVS 不允許重新命名檔案,而且對一些特殊檔案(如 symlink)的支援不是很好。變更可以按檔案跟蹤,而非按變更本身,這點十分討厭。合并有時也會出現問題(CVS 內部會為此使用 diff3)。

然而,CVS 總體而言還是很有用的,能夠實現其需要實現的任務,而且所有主流的平台都支援 CVS。如果喜歡用 CVS 而又想迴避其缺點,則可以考慮使用 Subversion。

Subversion

Subversion(SVN)是為了替代 CVS 而設計的,消除了 CVS 原有的問題和缺點。與 CVS 一樣,Subversion 也是一種集中化的解決方案,採用的是快照模型。它的命令也模仿了 CVS 的,但增加了一些對諸如刪除檔案、重新命名檔案或恢複為原始檔案等的處理功能。

Subversion 還允許遠端存取,可以採用很多協議,比如超文字傳輸通訊協定 (HTTP) (HTTP)、安全 HTTP或定製的 SVN 協議,此協議還支援通過 Secure Shell (SSH)的隧道技術。

清單 2 給出了 Subversion 所支援的一些命令及 CVS 中所沒有的一些擴充。要獲得關於 Subversion 的更多資訊,請參閱 參考資料 部分。很明顯,Subversion 的命令集和 CVS 的很相似,這使它極受 CVS 使用者的歡迎。

清單 2. Subversion 的命令樣本

# Create a new repository
svnadmin create /home/user/new_repository

# Check out a sandbox from the central repository
svn checkout file:///server/svn/existing_repository new_repository

# Update a local sandbox from the central repository
svn update

# Check in changes from the local sandbox to the central repository
svn commit

# Add new files to the local sandbox (need to be committed)
svn add <file/subdirectory>

# Show changes made in the local sandbox
svn diff

# Rename a file in the local sandbox (requires commit to the repository)
svn rename <old_file> <new_file>

# Remove files (also removed from repository, requires commit)
svn delete <file/subdirectory>

與 CVS 一樣,Subversion 整合了一些圖形化的前端如 ViewCVS 和 TortoiseSVN。另外也有一些工具可以把 CVS 存放庫轉化為 Subversion(例如 cvs2svn.py),但這些工具並不能處理複雜版本的分支和標記。和許多開源項目一樣,隨著時間的推移,這種情況會有所改變。Subversion 還整合了 TortoiseMerge 作為一個單獨的查看器和Hotfix。

Subversion 解決了許多讓 CVS 使用者困擾的問題,比如特殊檔案的版本化和自動的提交和簽出。如果您喜歡用 CVS 和集中式存放庫的方式,那麼 Subversion 就是您所需的 SCM。

現在讓我們先放下對集中方式的討論,看看被人們視為 SCM 未來的協作式分散存放庫。

Arch

Arch 是分散 SCM 的規範,它提供許多不同的實現,包括 ArX、Bazaar、GNU arch 和 Larch。Arch 不僅可以作為一種分散 SCM 運作,如 圖 2 所示,還可使用變更集模型(參見 圖 3)。 Arch SCM 是開源開發的一種很流行的方法,因為開發人員可在單獨的存放庫上進行開發,同時又能夠控制全部資源。這是因為分布式存放庫就是具有修訂控制的實際存放庫。 可以在本機存放區庫利用變更建立一個修補來供上遊的開發人員使用。這就是分散模型的真正的強勢所在。

與 Subversion 相似,Arch 解決了 CVS 中所存在的許多問題,包括中繼資料的變更,例如修訂檔案許可、處理檔案刪除和重新命名以及自動的簽入(將簽入組在一起而非作為單獨的檔案)。

清單 3 中顯示了 Arch SCM 中的一些常見命令,還給出了 GNU arch,因為它是由 Arch 的 設計者 Tom Lord 開發的。GNU arch 提供了 SCM 應有的一些準系統,包括 Subversion 中的一些新特性。

清單 3. GNU arch (tla) 的命令樣本

# Register a public archive
tla register-archive http://www.mtjones.com/arch

# Check out a local repository from the upstream repository
tla get project@mtjones.com--dev/project--stable myproject

# Update from the local repository
tla update

# Check in changes to the local repository
tla commit

# Add new files to the local repository (need to be committed)
tla add <file>

# Show changes made in the local repository (patch format)
tla what-changed

# Rename a file in the local repository (requires commit to the repository)
tla mv <old_file> <new_file>

# Remove files (also removed from repository, requires commit)
tla rm <file>

Arch 還允許用 star-merge 合并來自上遊存放庫的變更。為了最小化必須應用到基本修訂的修補的數量(根據變更集模型), cacherev 命令將會在存放庫中建立基本修訂的一個新的快照。

建立基本修訂的一個新快照

Arch 的優勢之一是雖然它是為分散操作所設計的,但也可以用於集中存放庫範例。

tla 使用者對其不滿之處是它太過複雜。其他的 Arch 實現,例如 baz 則非常簡單。如果 tla 不能滿足要求,可以嘗試使用後者。

現在讓我們來看一下最後一個分散式的 SCM,它由 Linux 核心的維護者 Linus Torvalds 本人編寫。

Git

Git SCM 由 Linus Torvalds 開發,用來替代 Bitkeeper SCM(參閱 參考資料 部分)。 它非常簡單,是一種分散式的基於變更集的 SCM 且用作 Linux 核心的 SCM。它使用檔案組模型而非跟蹤單個的檔案。使用 SHA1 壓縮並混編變更集以驗證其完整性(參見清單 4)。

清單 4. Git 的命令樣本

# Get a Git repository (first time)
git clone /
rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git /
linux-2.6

rsync -a /
--progress rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git/ /
.git/

# Update a Git repository from the defined upstream Git repository
git pull rsync://rsync.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git

# Checkout from the Git repository into the local working repository
git checkout

# Update from the local Git repositor3
git-update-cache

# Commit changes to the local Git repository
git commit

# Add new files to the local repository
git-update-cache --add <file>

# Show changes made to the local working directory
git diff

# Remove files (requires commit)
git-update-cache --remove <file>

Git SCM 在其自己的 Git 存放庫內是自託管的,這意味著您必須引導 Git 來將其安裝到本機。Git 的命令集與您到目前為止看到的那些命令十分類似,而且相對簡單。

您可能會問:“為什麼不使用現有的 SCM 中的一種呢?” 問得很好。 Git 非常有趣,吸引著許多 Linux 核心駭客,所以它很可能成為下一個主流的 SCM。Linus 將 Git 描述為一個高速的目錄內容組合管理,雖然它所做的工作不多但完成得十分高效。



回頁首

收益

無論您使用何種 SCM,都會獲得一些普遍的收益。使用 SCM,可以追蹤檔案中的變更來判斷變更對軟體的影響程度。當發生不正確的變更時,可以發現這些變更並將它們恢複回原始資源中。可以組合檔案修訂集並標記 它們來製作發布,而發布又可以在任何時間簽出以供重複構建代碼的特定發布(SCM 的要求)。

不管使用集中式存放庫還是分布式存放庫,使用快照模型還是變更集模型,所帶來的收益都是相同的。因為任何現代軟體開發項目都必須要有 SCM,所以越早越多地使用它們就會受益越多。



回頁首

前景展望

本文只討論了現在最為常用的 SCM 的一些最基礎的知識。還有許多其他的開源 SCM 可以使用,例如 Aegis、Bazaar-NG、DARCS 和 Monotone。當然,SCM 也引起了一些爭論,而這些爭論通常很難有正確的答案。如果使用一種工具後效率極高,那就使用這種工具吧!SCM 大多時候都用在團隊開發的情況下,而很少用於孤立的個人開發的環境中(除非您是個獨斷專行的老闆,喜歡自己做所有決定)。所以,您盡可以嘗試所有的可能性 來熟悉一些不同的風格。SCM 是軟體開發中的必需工具,也是您的開發工具箱中的必備部分。

參考資料

學習

  • 您可以參閱本文在 developerWorks 全球網站上的 英文原文 。

  • 在 LinuxMafia,瀏覽大量的 Linux SCM 。
  • 閱讀 David Wheeler 關於開源 SCM 的 有趣論文,內容涵蓋 CVS、Subversion、Arch 和 Monotone。
  • Nick Moffitt 在 Revision Control with Arch: Introduction to Arch(Linux Journal,2004 年 11 月)中為我們介紹了 Arch 的一個十分有趣的方面。
  • Tom Copeland 在 “StatCVS 提供了對 CVS 儲存庫活動的深入觀察”(developerWorks,2005 年 2 月)一文中展示了如何用 StatCVS 從 CVS 曆史資料中建立圖表。
  • 在 “Torvalds Gives Inside Skinny on Git”(eWeek,2005 年 4 月)一文中向 Linus 本人學習 Git 的更多知識。
  • 在 Kernel Hackers' Guide 中瞭解 Git。
  • 這裡的 版本控制系統比較 提供了多種 SCM 間的對比。
  • 通過本文作者編著的 GNU/Linux Application Programming 一書(Charles River Media,2005 年 1 月)全面學習 Linux 編程,從工具到 API 等等。
  • 要獲得關於 CVS 的更詳盡的資訊,請參閱 開發人員和愛好者的 CVS(developerWorks,2001 年 3 月)。
  • 在 developerWorks Linux 專區可以找到為 Linux 開發人員準備的更多資源。
  • 隨時關注 developerWorks 技術事件和網路廣播。

獲得產品和技術

  • CVS 是應用最早和最廣泛的 SCM 之一。

  • Subversion 是 CVS 的一個強有力的替代品。
  • GNU arch 是由 Tom Lord 完成的 Arch SCM 規範的一個實現。
  • 參閱 sourceforge 的 Aegis,這是一個基於事務的 SCM。
  • 關於 IBM 的 SCM,請訪問 Rational change and configuration management 頁面。
  • 訂購 SEK for Linux,這有兩張 DVD,含最新的 IBM for Linux 的試用軟體,包括 DB2、Lotus、Rational、Tivoli 和 WebSphere。
  • 使用 IBM 試用軟體 構建您的下一個 Linux 開發項目,這些軟體可以從 developerWorks 直接下載。

討論

  • 通過參與 developerWorks blogs 加入 developerWorks 社區。

關於作者

 

M. Tim Jones 是一名嵌入式軟體工程師,他是 GNU/Linux Application ProgrammingAI Application ProgrammingBSD Sockets Programming from a Multilanguage Perspective 等書籍的作者。他的工程背景非常廣泛,從同步宇宙飛船的核心開發到嵌入式架構設計,再到網路通訊協定的開發。Tim 是 Emulex Corp. 的一名顧問工程師。

註:以上內容來自網路,本人不承擔任何連帶責任
文章轉自:http://www.ibm.com/developerworks/cn/linux/l-vercon/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.