close
 

架設Subversion 系統

多年來,控制版本系統(CVS)一直是在Linux 上管理程式碼或者文件的標準。作為基於RCS 上建立但卻允許多使用者協作的系統而言,CVS 記錄所有檔案的修改資訊。這對於程式開發者、網路設計者和系統管理員而言,是非常有用的。

然而,CVS 逐漸顯示出它的衰老,出現了相似於源程式碼管理軟體的窘境。然而大多這種東西都是以牟利為主要目的。

Subversion 就是一種相對新鮮的源程式碼管理系統。雖然事實上它還在不斷的發展之中,但是Subversion 已經是一個非常穩定而且成熟的產品。它是一個全新的系統,其功能可以和CVS 媲美,同時,它要比CVS 更直觀,更容易操作。

本文就Subversion 的安裝和一些特殊功能作一個介紹。


安裝伺服器端

下載Apache SVN 源碼套件

從官方網站下載httpd-2.0.52.tar.gzsubversion-1.1.1.tar.gz
(因為 redhat 9 預設安裝的Apache 沒有並包含--enable-so 選項,所以無法產生 mod_dav_svn. 沒有這個模組,SVN 就無法採用http 方式執行,所以必須重新編譯新的Apache)

 

root 身份執行:

#tar zxvf httpd-2.0.52.tar.gz


#cd httpd-2.0.52


#./configure --enable-dav --enable-so --enable-maintainer-mode


#make


#make install

 

此時會產生 /usr/local/apache2 目錄,接著執行:

#tar zxvf subversion-1.1.1.tar.gz


#./configure --with-apxs=/usr/local/apache2/bin/apxs


# rm /usr/local/lib/libsvn*


# make clean && make && make install

此時會自動在 /usr/local/apache2/conf/httpd.conf 添加

LoadModule dav_svn_module modules/mod_dav_svn.so

安裝完成後,執行svnserver --version 確認版本為 1.1.1


SVN 伺服器安裝結束.

 


安裝客戶端

window 客戶端:

直接安裝 TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi,方法同一般軟體安裝相同。

 


Linux 客戶端:

方法與安裝伺服器相同。

(注意redhat 9 預設安裝的SVN 版本為 0.17.1,它的使用者端命令svn 無法與新的SVN 伺服器通訊,必須重新安裝)

 

建立倉庫Repository

Subversion 的檔案庫是個中央倉儲, 用來存放任意數量專案的受版本控管資料,

建立方法很簡單

#svnadmin create path/to/repos

舉個例子:

#svnadmin create /home/mysvn


#chown –R nobody /home/mysvn


執行伺服器

Subversion 伺服器有兩種執行方式,一是可以作為 Apache 2.0 的一個模組,以 WebDAV/DeltaV 協定與外界連通;另外,也可使用Subversion 自帶的小型伺服器程式 svnserve。該程式使用的是自帶的通訊協定,可以很容易地透過SSHhttp 方式執行。


http方式執行

/usr/local/apache2/conf/httpd.conf 中加入:


DAV svn


SVNPath /home/mysvn

在伺服器的瀏覽器中輸入網址:


http://localhost/svn/repository/


這時候,你會看到這樣的顯示:

這表明伺服器已經以http 方式正常執行了.

 


svnserve 方式執行

這種方式的執行又可以分為以下兩種(這和vsftp 有些相似)

1) standalone mode

直接執行 #svnserve d


執行 lsof -i :3690 可以看到SVN 伺服器已經在執行

2) xinetd mode

/etc/xinetd.d/下生成svnserve 文件,內容如下

service svnserve

{


disable = no


socket_type = stream


protocol = tcp


wait = no


user = apache


server = /usr/local/bin/svnserve


server_args = -i


}

編輯 /etc/services 檔案,加入底下兩行:

svnserve 3690/tcp # Subversion svnserve


svnserve 3690/udp # Subversion svnserve

重新啟動 xinetd 服務,執行 lsof -i :3690 可以看到SVN 伺服器已經在執行

 


客戶端訪問

客戶端的訪問方法與伺服器的執行方式有直接關係

window 客戶端:

1) 伺服器以http 方式執行

安裝完TortoiseSVN-1.1.1-UNICODE_svn-1.1.1.msi ,在你想工作的目錄下點擊右鍵,執行checkout,按上圖輸入即可。


2) 伺服器以svnserve 方式執行

同上的區別只是URL of repository 變為 svn://svn 伺服器ip/home/mysvn

或者 svn+ssh://svn 伺服器ip/home/mysvn


(注意不是//svn 伺服器ip//svn/repository)

 


linux 客戶端:

1) 伺服器以http 方式執行

執行 #svn checkout http: //svn 伺服器ip/svn/repository

2) 伺服器以svnserve 方式執行

執行 #svn checkout svn://svn 伺服器ip/home/mysvn


或者 #svn checkout svn+ssh://svn 伺服器ip/home/mysvn


客戶認證機制

這與伺服器的執行方式有關。

伺服器以http 方式執行

比如我們想給 Sally Harry 送交存取檔案庫的許可權. 首先, 我們必須把它


們加入到密碼檔案.

#### 第一次: -c 建立檔案

# htpasswd -c /etc/svn-auth-file harry


New password: *****


Re-type new password: *****


Adding password for user harry


# htpasswd /etc/svn-auth-file sally


New password: *******


Re-type new password: *******


Adding password for user sally


#

接著,/usr/local/apache2/conf/httpd.conf 的加入:

svn/repository >


DAV svn


SVNPath /home/mycvs


AuthType Basic


AuthName "Subversion repository"


AuthUserFile /etc/svn-auth-file


Require valid-user


重新啟動 Apache 後,如果有人要訪問SVN 伺服器,系統會要求他輸入使用者名和密碼。只有輸入Sally Harry 的使用者名和相應的密碼,才可以對檔案庫進行修改和訪問。

 

伺服器以svnserve 方式執行

預設下客戶可以以匿名方式通過svn://方式任意訪問檔案庫,為了限制其許可

權,比如只允許唯讀操作,可以通過修改檔案庫conf 子目錄中的svnseve.conf 文件來實現。

#vi /home/mysvn/conf/svnseve.conf

修改 [general] 欄位下內容為:

anon-access = read

如果設為 anon-access = none,則匿名使用者不可以通過svn://方式訪問檔案庫,為了實現使用者認證,我們一般採用svn+ssh://訪問機制。

首先在 svnseve.conf 檔案設置 anon-access = none 禁止匿名使用者通過svn://方式訪問檔案庫,然後在其後加入 auth-access = writeauth-access 是限制有授權的使用者(使用svn+ssh:// 來登入) 的存取許可權,我們設為是可以讀寫。當使用者通過 svn+ssh://訪問時,伺服器會自動啟動ssh認證機制,要求使用者輸入密碼,對於window使用者來說還需要安裝第三方軟體openssh,才可以採用這種機制。


Hook scripts

(hook) 是改動檔案庫時所觸發的程比如當你送交異動前,會先觸發

pre-commit,送交異動後,則會觸發post-commit,我們可以利用hook 來實現

一些自動控制。檔案庫的
hook 子目錄中, 預設是放置各個檔案庫子的範本:

post-commit.tmpl


pre-revprop-change.tmpl


post-revprop-change.tmpl


start-commit.tmpl


pre-commit.tmpl

如果要使用這些 hook,就必須把它的尾碼名.tmpl 去掉,拷貝為

post-commit


pre-revprop-change


post-revprop-change


start-commit


pre-commit

主要介紹pre-commit post-commit(事實上它們就是在特定的情況下被觸發的普通的shell 程式,至於shell 的內容由使用者自己隨意編寫,但是要保證名稱不能改動)

pre-commit

子執行的時間為異動完成之送交之檔案庫會傳遞兩個引數給


這個程檔案庫的路以及準備送交的異動名如果程式傳回一個


非零的結束
送交會被中而異動會被刪

 

如何應用pre-commit 我們不妨舉個例子:


假如有一個專案由
Mail TeamLogin Team PHP Team 三個 Team 共同通過SVN 系統開發完成。當專案準備發佈的時候,PM 人員發現Mail 功能方面存在一些 bug,需要Mail Team 去修改,為了防止其他Team 的人員修改系統,我們可以在任何改動檔案庫的企圖之前用 pre-commit 去檢查 log message 資訊(因為任何更動檔案庫的操作都必須提供 log message PM 可以事先與Mail Team 約定好一個 log message)如果與 pre-commit 中設定的 log message 不相符,則不能送交異動。

pre-commit 根源程式如下:

#!/bin/sh


REPOS="$1"


TXN="$2"


SVNLOOK=/usr/local/bin/svnlook


$SVNLOOK log -t "$TXN" "$REPOS" |


grep –w "bug1234" > /dev/null || exit 1


exit 0

本例中的 log message bug1234任何人想要送交異動就必須用 m


“bug1234”

 採用 -m “bug123-m “bug12345”都會送交失敗。



post-commit

子執行的時間是在異動送交, 新修訂版被建立之大多數的人用這


個鉤子來寄出關於本次送交的電子郵或是建立檔案庫的備檔案庫


會傳遞兩個引數給這個程
檔案庫的路以及新建立的修訂版


程式的結束碼會被忽


Subversion 源碼樹 tools/hook-script 目錄中包含了一個 commit-email.pl


命令,可以用來寄送包含描述指定送交的電子郵這個郵件包含了更動路徑列表該送交所對應的記錄訊使用送交的日以及一個以 GNU diff 樣式表示的本次更動差我們可以將這個程式與post-commit 這個hook 搭配起來使用來實現檔案庫更動後自動 mail 給相關人員的功能。

post-commit 根源程式如下:

#!/bin/sh


REPOS="$1"


REV="$2"


commit-email.pl "$REPOS" "$REV" PM@yourdomain.com


##

需要指明commit-email.pl的絕對路徑

 


特殊性質

除了對你的目錄與檔案進行版本控制之Subversion 還提供了一個介可用來新以及移除已納入版本控制的目錄與檔案的版本控制描述資

我們稱這個描述資料為「性質在這我主要介紹以下幾個比較重要的特殊性質

svn:mime-type

svn:mime-type 性質在 Subversion 中有很多作除了作為儲存檔案的多用網際網路郵件延伸語法 (MIME) 分類之這個性質的內容還會決定幾項Subversion 的行為特

舉個例如果 svn:mime-type 性質設為文字的 MIME 別,Subversion 會假設該檔的內容是二進位(也就是人類看不懂的資料)Subversion 提供的功能中其中一項是在從伺服器收到工作檔的更新依文字內容與文字列進行合

但是對含有二進位資料的檔根本就沒有“文字列”的概


Subversion 對這些檔案在更新不會試著進行內文合它改用另一種方式。一般來說Subversion 在執行 svn import svn add 子命令會使用二進位元,偵測運演算法的方式來協助使用但是如果 Subversion 猜錯或是你希望將 svn:mime-type 設定成更為明確的值(可能是 image/png)你都可以移除或是手動編輯這個性

 

舉個例子:
$ svn import -m"initial import" [your_project_directory] file:///[repository_dir]

svn:ignore

svn:ignore 性質包含了檔案樣式的列Subversion 處理時會忽它可以與執行時期設定的 global-ignores 選項一起工以便在類似 svn status 的命令中過濾掉未納入版本控制的目錄與檔。我們知道新增的文件和目錄必須透過 svn add 才會被納入 Subversion的管svn status 命令會將工作複本中未納入版控制目錄與檔案顯示出

$ svn status calc


M calc/button.c


calc/calculator


calc/data.c


calc/debug_log


calc/debug_log.1

在這個範例標注出來的檔就是未納入版控制的檔如果你不想每次執行 svn status 都看到這些檔案,那些 svn:ignore 性質就是解決方案。你可以透過 svn propedit svn:ignore calc calc 目錄加上一些忽略樣。舉個例將以下的值作為 svn:ignore 性質的新內

calculator


debug_log*

加上這個性質後再執行你的 svn status 輸出便會不同:

$ svn status


M calc


M calc/button.c


calc/data.c

所有不想看到的東西都從輸出中消失

svn:keywords

Subversion 具有取代關鍵字(有關納入版本控制檔案的有用資訊)進入檔案內容的功舉個例假設你有個想要在面顯示最近一次修改的日你可以把這個負擔加諸檔的作者身讓他們每一次送交更動之順便添加最近一次修改日期的部但是遲早有人會忘記這件換個方只要叫 Subversion LastChangedDate 關鍵字進行關鍵字取代即

 

Subversion 定義了可用來進行取代的關鍵字列這個列表包含了以下五個關鍵

LastChangedDate


LastChangedRevision


LastChangedBy


HeadURL


Id

如果只把關鍵字定位錨加進檔案什為事也不會發要告訴 Subversion是否該對某一個檔案進行關鍵字取得使用svn:keywords 這個性質。當它被設定它會控制該檔案哪關鍵字應該被取

舉個例假設你有一個納入版本控制的檔名為 weather.txt看起來像這


Here is the latest report from the front lines.


$LastChangedDate$


$Rev$


Cumulus clouds are appearing more frequently as summer approaches.

如果沒有設定該檔案的 svn:keywords Subversion 什麼事也不會讓我們開始關鍵字 LastChangedDate 的內容取

$ svn propset svn:keywords "LastChangedDate Author" weather.txt


property `svn:keywords' set on 'weather.txt'


$

在你送交了這個性質更動之Subversion 會顯示為:

Here is the latest report from the front lines.


$LastChangedDate: 2002-07-22 21:42:37 -0700 (Mon, 22 Jul 2002) $


$Rev$


Cumulus clouds are appearing more frequently as summer approaches.

這樣不管誰提交這個檔,都會在面顯示最近一次修改的日期。

svn:eol-style

除非另外指定版本控制檔案的 svn:mime-type Subversion 會假設檔案包含人類可讀的資對於列尾符號 (EOL) 是很不幸因為不同的作業系統會使用不同的符號來表示一列的結舉個例一般用在 Windows 的列尾符號是兩個 ASCII 控制字元:返回字元 (CR) 與換行字元 (LF)但是Unix 軟體就只使用 LF 字元來表示一列的結這樣以來window客戶提交的檔案中的CR 字元linux 使用者端會顯示成 ^Mlinux 客戶送交的檔案中CR字元Windows 使用者端會被忽略。結果將檔案裡的所有文字列合併成一個超長的文字這是因為 沒有返回CRLF 字元組合的存在來表示一個換行。解決的方法是 svn:eol-style 當這個性質設定為 native Subversion 會根據系統的類型來決定是否對該檔案的結尾進行自動處理。

svn:externals

有的時一個工作複本可能包含了數個不同來源的工作複舉個例你可能想要有數不同的目各來自不同的檔案我們可以通過 svn:externals 性質來宣告這一對對應關係。內容是子目錄對應至 Subversion 檔案庫 URL 的多行表

$ svn propget svn:externals calc


third-party/sounds http://sounds.red-bean.com/repos


third-party/skins http://skins.red-bean.com/repositories/skinproj


third-party/skins/toolkit http://svn.red-bean.com/repos/skin-maker

當有人取出 calc 目錄的工作複Subversion 還會繼續取出在外部定義裡的專

$ svn checkout http://svn.example.com/repos/calc


A calc


A calc/Makefile


A calc/integer.c


A calc/button.c


Checked out revision 148.


Fetching external item into calc/third-party/sounds


A calc/third-party/sounds/ding.ogg


A calc/third-party/sounds/dong.ogg


A calc/third-party/sounds/clang.ogg


Checked out revision 14.


Fetching external item into calc/third-party/skins


小結

Subversion 有一份很好的文檔 ——Version Control with Subversionhttp://freebsd.sinica.edu.tw/~plasma/svnbook/book.html。它提供了有關Subversion 的各方面內容,如使用、管理和開發等。


經過數年的開發,以替代CVS 為 目標的Subversion,相信以其強大的功能,對CVS 良好的繼承性,一定會有很好的發展。

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 Bluelove1968 的頭像
    Bluelove1968

    藍色情懷

    Bluelove1968 發表在 痞客邦 留言(0) 人氣()