Subversion使用扎記
一直以來對於自己的專案都是使用CVS進行管理,聽說Subversion很久了,但是都沒有時間去嘗試。想想時間都是省出來的,於是決定,一天學一點,不多,積累成河嘛。
Subversion和CVS相比,除了包含了CVS的全部特性之外,也加入了新的理念:
1、路徑、改名、以及檔meta-data也可進入版本控制範圍。缺少這些特性是CVS被抱怨最多的方面之一,subversion不止對檔內容和檔存放位置加入 控制,也對目錄,拷貝,重命名操作加入版本控制。它也允許檔/目錄的相關元資料 meta-data和檔/目錄本身一起被版本控制起來,並提供一種機制對檔的執行許可權進行控制。
2、Commit動作真正成為原子級的操作了,直到整個commit動作都成功前不會有任何部分的commit會生效。版本修訂號只是預確認,而不是對檔預確認。(翻譯不出來 -_-;)日誌資訊將綁定到修訂資訊,而不是象CVS那樣冗餘的存儲下來。
3、提供Apache網路服務器選項,支援WebDAV/DeltaV協定。Subversion可以使用基於http協定的WebDAV/DeltaV協定進行網路通訊,並由Apache伺服器 提供源碼倉庫方的網路流覽服務。這為Subversion提供了比CVS更好的協同工作能力,並提供了各式各樣的自由的關鍵特性:授權,基於路徑的授權,線性壓縮,以及基本源碼倉庫流覽。
4、獨立伺服器選項
Subversion也能提供獨立伺服器選項,使用自定的協定(不是每個人都想運行Apache2.x)獨立伺服器可以作為系統的inetd服務運行,並提供基本的授權。它也能使用ssh進行加密。
5、建立分支和標籤操作成為不耗時的操作。這些動作沒理由耗時,所以我們不再讓它們耗時。
6、分支與標籤的實現都是基於底層的拷貝操作,一個拷貝佔用一塊固定大小的空間。任何拷貝都 可以作為一份標籤;假如你開始對某個版本的拷貝進行commit動作,那它也就成為一個分支。(這與CVS的"分支節點做標籤"方式不同)
7、天然的client/server結構,層次化庫設計。Subversion從設計之初即採用client/server機構;因此避免了困擾CVS了許久的一些維護性難題。代碼被構建為一組帶有詳細介面說明的模組,用以方便的由其他應用程式進行調用。
8、Client/server協議向雙方發送對比差異。網路協定利用寬頻有效地發送對比差異給用戶端和伺服器端雙方。( CVS只是 server->client, 沒有client->server )
9、資源消耗與資料改變的大小成正比,而不是與資料本身大小成正比
一般來說,一項Subversion操作所需時間與操作最終變化的大小成正比。而不是與操作所觸 及的整個項目的大小成正比,這是Subversion源代碼倉庫模型的一個特性。
10、有效的處理二進位檔
Subversion對於二進位檔和文字檔案的處理同樣有效,因為subversion使用一種二進位差異比較演算法來增量存儲那些連續的修訂本。
11、易於語法分析的輸出。所有Subversion命令行用戶端的輸出都是仔細設計的,可輕鬆為人所理解,也適於程式自動 解析。可進行腳本語言處理將是下一步優先考慮的特性。
好了,開始使用吧。
Subversion到目前的安裝已經非常簡單了。到Subversion網站下載Windows下的安裝檔,簡單的步驟就可以完成安裝,而且安裝程式已經自動註冊Path,直接在命令行模式就可以使用了。
首先初始化Repository,輸入命令:
svnadmin create D:TestRepository
然後,把現有的專案的目錄結構以及檔導入到Repository中:
svn import D:ProjectsProject1 file:///D:TestRepositoryProject1
-m “初始化“
用啟動服務
svnserve -d -r D:TestRepository
用戶端Checkout
svn checkout svn://主機名/Project1
(即獲取Project1的項目)
以上都是很簡單的命令。而且上面只用到了一種服務模式,Apache的還在嘗試中。
目前只用到了Subversion的基本功能,就已經感覺不錯了,覺得入門很輕鬆,幫助文檔也比CVS要好的多。
Subversion也有圖形的用戶端,可以在 TortoiseSVN 找到。
Subversion也VS.Net的插件,可以在AnkhSVN 找到。
TortoiseSVN相信不錯,因為以前用過它的另一個For CVS的工具,可以和流覽器結合在一起,非常方便和美觀。
Subversion使用手記(二)——服務
Subversion具有兩種服務模式,一個是作為Apache的模組,另一個是自定義協定的Subserve服務。
作為Apache的模組,用戶端可以通過WebDAV/DeltaV協定訪問Repository,而使用Subserve則使用
Subversion的自定義協議。
下表是兩種服務模式的比較:
功能 |
Apache
+ mod_dav_sub |
Svnserve |
驗證方式 |
基於HTTPS的X.509、LDAP、NTLM或其他Apache支持的驗證 |
CRAM-MD5或者SSH |
用戶帳戶管理 |
私有的用戶檔 |
私有的用戶檔或已有的系統帳戶 |
授權管理 |
blanket
read/write access或單一目錄的訪問控制 |
blanket
read/write access |
加密 |
可選的SSL |
可選的SSH隧道 |
交互性 |
可通過支持WebDAV的用戶端訪問 |
無交互性 |
Web訪問 |
有限的內置支持,或通過第三方的工具,例如ViewCVS |
通過第三方的支持,如ViewCVS |
速度 |
稍慢 |
稍快 |
初始安裝 |
稍複雜 |
相當簡單 |
Subversion 使用手記(三)-啟動svnserve服務
svnserve
是一個羽量級的服務, 使用自定義的協定通過TCP/IP與用戶端通訊。
用戶端通過由 svn:// 或者
svn+ssh:// 開始的URL訪問svnserve伺服器。
啟動伺服器
埠監控(inetd)模式
如果你打算用埠監控來啟動處理客戶的訪問請求的進程,你可以通過傳入參數-i來啟動:
svnserve -i
當使用-i參數啟動服務的時候,svnserve通過stdin和stdout用自定義協議和用戶端
通訊。同時服務偵聽3690埠。
獨立埠監控進程
使用參數-d啟動服務作為一個獨立的埠監控進程。
svnserve -d
當運行svnserve在獨立埠監控模式時,你可以使用--listen-port=和--listen-host=參數來自定義需要的埠和主機名稱。當前模式默認的埠是3690。
當然,也有第三種方法啟動svnserve,也就是使用“隧道模式”,使用-t參數啟動 服務。這個模式要求遠端服務程式,如RSH或SSH,已經成功驗證用戶,並且使用已經校驗的用戶啟動一個屬於該用戶的svnserve進程。當使用該模式 提供服務時,要確認啟動的用戶帳戶具備對Repository的讀/寫許可權。
設置專案目錄
當svnserve開始運行時,它將會暴露所有的Repository到網路上。不過,當用戶端需要獲取一個Repository的內容時,需要指定Reopsitory的絕對路徑。例如:一個Repository放在檔路徑
C:/Project Repository/Project1
那麼當用戶端訪問時,需要指定絕對路徑:
svn://host/C:/Project Repository/Project1
所以,為了增加保密性,你可以使用參數-r指定需要暴露的Repository的路徑,當用戶訪問時,只需指定Repository的名稱即可。例如上面的Repository,當啟動服務時,使用如下的方法:
svn -d -r C:/Project Repository
那麼當用戶端訪問時,則使用
svn://host/Project1
就可以獲取資料了。
內置的驗證和授權
當用戶端連接到一個svnserve進程時,下面的流程就會觸發:
1、客戶選擇一個指定的Repository;
2、服務處理Repository的配置檔 conf/svnserve.conf檔,並且開始執行在其中定義的所有驗證和授權策略;
3、依賴與情形和授權策略:
a)用戶端也許允許匿名訪問而不需要驗證,或者
b)客戶但也許需要在任何時候被要求驗證,或者
c)假如處於"隧道模式"中,用戶端將聲明自己已經可以被外部驗證。
很顯然,如上所說,用戶檔是一個名為svnserve.conf的,放在conf目錄下的檔。
現在我們來看看如何配置這個檔:
這個配置檔放置在Repository的目錄中的conf目錄下,它有兩個節點:
[general]
[users]
其中,[general]的配置資訊有:
anon-access = read
auth-access = write
其中表示對於驗證有效的以及沒通過驗證的用戶可以做什麼事情。分別有read, write和none
[users]的標籤的配置內容有:
USERNAME = PASSWORD
password-db = passwd
realm = My First Repository
其 中表示,用戶名對應的密碼是什麼,或者指定一個存儲用戶名和密碼的檔的相對或絕對路徑以及指定了Repository的驗證領域。如果兩個
Repository有相同的驗證領域,那麼它們應該有相同的密碼資料庫,反之亦然。默認的領域就是指向當前的Repository的路徑,與伺服器的
Repository的根目錄相關。