簡介:您是否對分布式版本控制感興趣,但是又被一大堆行話弄糊塗了?本文介紹三種主要的系統 (Git、Mercurial 和 Bazaar),討論采用分布式工作流的一些優點,比較分布式版本控制的常用操作。
簡介
在過去幾年,對於分布式版本控制可以給開發過程提供的益處有許多爭論。最近,分布式 工具已經很成熟了。盡管分布式工具的一些優點最初可能不明顯,但是從長期來看,它們提供的靈活性是 非常有意義的。閱讀完本文之後,您應該能夠開始使用分布式版本控制系統,基本了解分布式模型能夠提 供的優點。
圍繞分布式版本控制的爭論主要集中在不再需要的中心服務器。這是一個非常獨特的 特性,對於一些開發人員組很重要,但是它的真正價值在於,它允許開發人員組實現他們選擇的幾乎任何 工作流。它能夠完成很多事情,比如傳統的集中式模型,或兩個開發人員在咖啡館通過無線連接協同工作 ,等等。
允許開發人員以各種新的方式工作,這是分布式版本控制真正令人興奮的特點。實際上 ,在本文末尾會介紹如何實現這樣的“咖啡館”工作流。這對於作家、學校教師和 Linux® 內核開發人員都有益處。
什麼是分布式版本控制?
分布式版本控制 (DVCS) 是一種不需要中心服務器的管理文件版本的方法,但是它也可以使用中心服務器。更改可以被合並到 DVCS 的任何其他用戶的系統中,因此可以實現非常靈活的工作流。
DVCS 的兩個主要優點是:它 比集中的版本控制更靈活,因為它除了支持傳統的(集中式)工作流,還支持其他各種工作流;它比集中 式服務器快得多,因為大多數操作在客戶機本地進行,而不需要網絡操作。
DVCS 和集中式版本控 制系統的主要差異
在 DVCS 和集中式版本控制系統之間有三個關鍵差異。第一個差異是,DVCS 通 過本地提交支持離線工作,這是由 DVCS 的操作方式決定的。這與集中式版本控制完全不同,集中式版本 控制要求通過到中心服務器的連接執行所有操作。這種靈活性讓開發人員在飛機上也能夠像在辦公室中一 樣輕松地工作,可以一次又一次地進行提交。
第二個差異是 DVCS 比集中式系統更靈活,因為 DVCS 支持許多不同類型的工作流,從傳統的集中式工作流到純粹的特殊工作流,再到特殊工作流和集中 式工作流的組合。這種靈活性允許通過電子郵件、對等網絡和開發團隊喜歡的任何方式進行開發。
第三個差異是 DVCS 比集中式版本控制系統快得多,因為大多數操作在客戶機上進行,速度非常 快。另外,在需要進行推(push )操作(與另一個節點通信)時,速度也更快,因為兩個客戶機機器上 都有完整的元數據。速度差異相當顯著,根據使用本地存儲庫還是網絡存儲庫,DVCS 比 Subversion 快 大約 3-10 倍。
分布式版本控制工作流
因為 DVCS 非常靈活,可以實現各種各樣的工作流 ,但是由於篇幅有限,本文只討論兩種工作流。首先討論最常用的工作流之一 Partner 工作流。按照 Partner 工作流,一個開發人員啟動一個項目,然後進行分支。然後,在不同開發人員工作的分支之間來 回合並更改。
第二種常用的工作流是通過本地提交使用集中式服務器。在這種工作流中,開發人 員的工作方式與使用集中式 subversion 存儲庫時非常相似,但是他們進行本地提交,然後把最終更改推 到集中式服務器。這種工作流有許多變體,包括與 Partner 工作流結合使用。重要的是,可以采用許多 種工作方式,通過使用 DVCS,可以靈活地選擇最適合自己的工作方式。
快速入門指南
了 解一種新技術的最好方法之一是實際使用它。在本節中,簡要介紹 Mercurial、Bazaar 和 Git 中的常用 操作,您可以試試這些操作:
Mercurial
安裝:sudo easy_install-2.5 mercurial
建立項目目錄:mkdir hgrepo; cd hgrepo
初始化項目:hg init
添加文 件:touch foo.txt; hg add foo.txt
提交:hg commit -m "added foo.txt" commit
抓取共享的存儲庫:hg clone ssh://example.com//projects/hgrepo
本地提交更 改:hg -ci -m "adding a change"
把更改推到服務器:hg push
以補丁形式查 看未處理的更新:hg incoming -p
從服務器下載更新:hg pull
應用更改:hg update
合並沖突:hg merge
合並兩個不相關的遠程存儲庫:hg pull -f ssh://example2.com//projects/hgrepo
Bazaar
安裝:sudo easy_install-2.5 bzr
建立項目目錄:mkdir bzrrepo; cd bzrrepo
初始化項目:bzr init
添加文件 :touch foo.txt; bzr add foo.txt
提交:bzr commit -m "added foo.txt" commit
抓取共享的存儲庫:bzr branch bzr+ssh://example.com/projects/gitrepo
本地 提交更改:bzr -ci -m "adding a change"
把更改推到服務器:bzr push
從服 務器下載更新:bzr pull
應用更改:bzr update
合並沖突:bzr merge
Git
安裝:下載最新的 tar 文件 http://kernel.org/pub/software/scm/
建立項目目錄:mkdir gitrepo; cd gitrepo
初始化項目:git init
添加文件:touch foo.txt; git add foo.txt
提交:git commit -m "added foo.txt" commit
抓取共享的存儲庫: git clone ssh://example.com/projects/bzrrepo
本地提交更改:bzr -ci -m "adding a change" commit
把更改推到服務器:bzr push
從服務器下載更新:bzr pull
應用更改:bzr update
合並沖突:bzr merge
轉換工具和與 subversion 的集成
這 三種 DVCS 都能夠把現有的 subversion 存儲庫輕松地轉換為各自的格式,甚至可以在不同的 DVCS 之間 進行轉換。這使開發人員能夠方便地試用 DVCS 或從一種 DVCS 轉移到另一種 DVCS。
例如,對於 Mercurial,可以使用工具 hgimportsvn 和 hgpullsvn 與現有的 subversion 存儲庫通信,創建新的 hg 存儲庫和歷史。tailor 工具是一種通用的存儲庫轉換工具。
另一種有意思的試用方法是集成 DVCS 與現有的 subversion 存儲庫。對這種方法的詳細討論超出了本文的范圍,但是 參考資料 給出了 一些工具的鏈接,這些工具可以在 subversion 分支與 Git、Bazaar 和 Mercurial 之間進行雙向操作。
第三方托管選項
如果開放源碼或商業開發人員不希望或不需要管理自己的集中式 “ 集線器”,那麼可以選用流行的托管站點托管自己的 Git、Bazaar 或 Mercurial 項目。對於 Mercurial,流行的免費和付費托管站點是 Bitbucket。對於 Git,可以使用 Github;對於 Bazaar,可 以使用由 Canonical 發起的 Launchpad。
提示:“咖啡館” Mercurial 工作流
圖 1. 咖啡館工作流
如果希望實現安全的 特殊版本控制工作流,讓兩個開發人員可以在咖啡館中通過無線網絡一起工作,那麼可以試試下面的方法 。
第一個用戶使用 Mercurial 創建一個存儲庫:
mkdir /tmp/myhgrepo
cd /tmp/myhgrepo
hg init
然後,通過 Web 作為只讀共享共享它:
hg serve
第二個用戶使用以下命令克隆這個存儲庫:
hg clone http://example.com:8000
注意:這是另一台機器的 IP 地址或本地主機名。在 OS X 上,可以通過對 your-machine-name.local 使用 Bonjour 獲得這一信息。
第二個用戶進行 他需要的更改,然後作為只讀的 HTTP 共享提供他的存儲庫:
http://example.com:8000
第一個用戶對第二個用戶的存儲庫拷貝執行 hg 拖 操作:
hg clone http://example2.com:8000
每個開發人員都是安全的, 因為他們只在需要更新自己的本地文件系統時才對對方的存儲庫進行拖操作。
結束語
本文 討論了分布式版本控制能夠提供的價值,比較了三種主流工具 Git、Mercurial 和 Bazaar 之間的差異。 如果您不太熟悉版本控制,那麼應該繼續學習版本控制、鉤子和插件以及它們能夠提供的功能。
如果您是老手,那麼應該試試這些工具,尋找最適合自己的工具。請通過 參考資料 中的鏈接詳細了解各 種分布式版本控制系統以及別人的使用經驗。