簡介
在過去幾年,對于分布式版本控制可以給開發過程提供的益處有許多争論。最近,分布式工具已經很成熟了。盡管分布式工具的一些優點最初可能不明顯,但是從長期來看,它們提供的靈活性是非常有意義的。閱讀完本文之後,您應該能夠開始使用分布式版本控制系統,基本了解分布式模型能夠提供的優點。
圍繞分布式版本控制的争論主要集中在不再需要的中心伺服器。這是一個非常獨特的特性,對于一些開發人員組很重要,但是它的真正價值在于,它允許開發人員組實作他們選擇的幾乎任何工作流。它能夠完成很多事情,比如傳統的集中式模型,或兩個開發人員在咖啡館通過無線連接配接協同工作,等等。
允許開發人員以各種新的方式工作,這是分布式版本控制真正令人興奮的特點。實際上,在本文末尾會介紹如何實作這樣的“咖啡館”工作流。這對于作家、學校教師和 Linux® 核心開發人員都有益處。
什麼是分布式版本控制?
分布式版本控制 (DVCS) 是一種不需要中心伺服器的管理檔案版本的方法,但是它也可以使用中心伺服器。更改可以被合并到 DVCS 的任何其他使用者的系統中,是以可以實作非常靈活的工作流。
DVCS 的兩個主要優點是:它比集中的版本控制更靈活,因為它除了支援傳統的(集中式)工作流,還支援其他各種工作流;它比集中式伺服器快得多,因為大多數操作在客戶機本地進行,而不需要網絡操作。
什麼是鈎子?
鈎子是在版本控制操作的生命周期中通過程式執行操作的方法。例如,通過使用鈎子,可以在代碼簽入(check in)存儲庫時自動發送電子郵件。另外,還可以在簽入代碼之前,檢查使用者是否滿足一組條件,比如包含一個測試檔案。
另一種擴充版本控制系統功能的方法是編寫插件。如果打算編寫自己的插件,在 參考資料 中可以找到描述 Bazaar、Git 和 Mercurial 的插件系統的文章連結。
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
- 安裝:下載下傳最新的 tar 檔案
回頁首
轉換工具和與 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 建立一個存儲庫:
|
然後,通過 Web 作為隻讀共享共享它:
|
第二個使用者使用以下指令克隆這個存儲庫:
|
注意:這是另一台機器的 IP 位址或本地主機名。在 OS X 上,可以通過對 your-machine-name.local 使用 Bonjour 獲得這一資訊。
第二個使用者進行他需要的更改,然後作為隻讀的 HTTP 共享提供他的存儲庫:
|
第一個使用者對第二個使用者的存儲庫拷貝執行 hg 拖操作:
|
每個開發人員都是安全的,因為他們隻在需要更新自己的本地檔案系統時才對對方的存儲庫進行拖操作。
回頁首
結束語
本文讨論了分布式版本控制能夠提供的價值,比較了三種主流工具 Git、Mercurial 和 Bazaar 之間的差異。如果您不太熟悉版本控制,那麼應該繼續學習版本控制、鈎子和插件以及它們能夠提供的功能。
如果您是老手,那麼應該試試這些工具,尋找最适合自己的工具。請通過 參考資料 中的連結詳細了解各種分布式版本控制系統以及别人的使用經驗。
轉載于:https://www.cnblogs.com/ryanlaw/archive/2011/10/11/2207967.html