2008年12月28日 星期日

使用SVN進行版本控制 - (四) 如何使用SVN??

SVN應用實例
小張是位在軟體公司任職的專案經理,某天,察覺到當成員愈多時,在版本控制上,更形困難,每每版本混亂造成的影響,總要花上些許多時間。因此,小張決定試著採用Subversion來做版本管理。

首先,將原有的程式碼及相關文件,利用svn import匯入檔案庫(repository)。
svn import porject_directory file:///svn/proj

接著,將兩個模組分別交給小李及小陳兩位工程師進行開發,分別利用svn checkout下載最新的程式碼

svn checkout file:///svn/proj /local_project

小李的任務是撰寫一個math模組,於是新增一個math目錄,有著math.h及math.cpp兩個檔案,利用svn add將整個math目錄列入提交清單

svn add math

當math模組開發完成後,使利用svn commit提交math目錄

svn commit

而小陳必須引用math函式進行另項模組修改,所以必須利用svn update將更新至最新的程式碼

svn update file:///svn/proj

當程式碼修正完畢後,也利用svn commit進行提交

svn commit

這時,小李又針對math模組進行修改測試,卻發現無法正常編譯,但上一版是正常的,因此小李利用svn diff比對,找出程式錯誤的地方,再次修正即可正常編譯

svn diff -r01:02

終於要釋出完整版本,於是利用svn export輸出一份不含任何版本控制資訊的程式碼

svn export file:///svn/proj /projR1



2008年12月25日 星期四

使用SVN進行版本控制 - (三) 建立檔案庫及導入

Create Reposiroty (建立版本庫)
$>mkdir /svn
$>chwon -R nobody /svn
$>svnadmin create /svn/test
$>ls /svn/test
 #如果ls /repository/test/出現了下面的內容,就說明subversion安裝成功了
 conf dav db format hooks locks README.txt

Import Project (匯入專案)
$>svn import gt;svn import gt;svn import gt;svn import gt;svn import gt;svn import projectdir file:///svn/test/ -m "initial import"
 ##出現下列訊息, 即表示成功匯入專案
 Adding projectdir/foo.c
 Adding projectdir/bar.c
 Adding projectdir/subdir
 Adding projectdir/subdir/quux.h
 Committed revision 1.


於IE的網址列, 鍵入http://localhost/svn/test/, 如下圖結果

2008年12月24日 星期三

使用SVN進行版本控制 - (二) 設定配置

啟動Subversion服務提供下列三種方式:
  1. svnserver
  2. svnserver + ssh
  3. apache
 在此只針對上述 第1, 3點作細詳說明,第2點就有請大家自行google一下

1. svnserver, a custom server
svnserver是一種較為不耗費資源的service, 建立於TCP/IP的基礎通訊協定上,client side可透過svn://來進行溝通。

 常見的有兩種模式啟動svnserver:(1) as stand alone, (2) as daemon

  (1) as stand alone (/etc/init.d)

$> svnserver -d -r /svn
# -d : 以daemon方式執行
# -r : 虛擬根目錄, 限制只能在此目錄底下的瀏覽

$> lsof -i :3690
# 可以查看svnserver是否已正常啟動
  (2) as daemon (/etc/xinetd.d)
$> vi /etc/xinetd.d/svnserve
##新增以下文字內容
service svnserve
{
 disable = no
 socket_type = stream
 wait = no
 user = apache
 server = /usr/local/subversion/bin/svnserve
 server_args = -i
}

$> vi /etc/services
##確認有無以下文字內容, 若不存在, 請新增於檔案內容中
svnserve    3690/tcp    #Subversion svnserve
svnserve    3690/udp    #Subversion svnserve
1.1 svnserve.conf (配置設定)
[general]
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
# realm = My First Repository
1.2 passwd (使用者帳號)
[users]
##
username = password
admin = admin
yardmgr = yardmgr
1.3 authz (授權管理)
[groups]
administrators = admin
developer_team = mills

[/]
* =
@administrators = rw

[/svn/yard:/]
@developer_team = rw

[/svn/test:/]
@developer_team = rw

2. apache, a http server
apache是一種較為耗費資源的service, 建立於WebDav的基礎通訊協定上,client side可透過http://來進行溝通。
(1) Apache2 Config (I) -- Add SVN Modules
 $>vi /usr/local/apache2/conf/httpd.conf
 ##確認有無以下內容, 若不存在, 請新增貼上
 ##若沒有mod_dav_svn模組, SVN則無法以http方式運作
 LoadModule dav_svn_module modules/mod_dav_svn.so
 LoadModule authz_svn_module modles/mod_authz_svn.so

(2) Apache2 Config (I) -- Add SVN Path
 $>vi /usr/local/apache2/conf/httpd.conf
 ##確認有無以下內容, 若不存在, 請新增貼上
 <Location>
  DAV svn
  SVNPath /svn/test
  # our access control policy, below (4)
  AuthzSVNAccessFile /svn/svn-authz
  AuthType Basic
  AuthName "Version Control System"
  # how to authenticate a user, below (3)
  AuthUserFile /svn/svn-auth-file
  # only authenticated users may access the repository
  Require valid-user
 </Location>

(3) Setting up http authentication (建立認證帳號)
 $>htpasswd -c -m /svn/svn-auth-file admin
 # 輸入第1個使用者帳號, 第1次建立才加 -c
 # -c : 建立新檔
 # -m : 採以MD5編碼

 $>htpasswd -m /svn/svn-auth-file yardmgr
 # 輸入第2個使用者帳號

(4) Setting up svn authorization (建立授權管理)

 $> vi
/svn/svn-authz
 # 新增以下文字內容
 [groups]
 administrators = admin
 developer_team = yardmgr

 [/]
 * =
 @administrators = rw

 [/svn/test:/]
 @developer_team = rw

2008年12月20日 星期六

使用SVN 進行版本控制 - (一) 安裝

what is SVN??
(引述官方文件的簡介)
Subversion 是一個自由/開
放源碼的版本控制系統, 也就是說 Subversion 管理著隨時間改變的檔案. 這些檔案放置在一個中央 檔案庫 (repository) 中. 這個檔案庫 很像一個尋常的檔案伺服器, 不過它會記住每一次檔案的變動. 這樣你就可以把檔案回復到舊的版本, 或是瀏覽檔案的變動歷程. 許多人會把版本控制系統想像成某種 “時光機器”.

某些版本控制系統也是 software configuration management (SCM) 系統. 這些系統是特別設計來管理大量程式碼的, 而且具有許多功能, 專門用在軟體發展之用 — 像是可完全了解程式語言, 或是提供編譯軟體的工作. 不過 Subversion 並不是這樣的系統; 它是一個泛用系統, 可用來管理任何 類型的檔案, 其中包括了程式源碼.
功能列表
目錄版本控制
CVS 只能追蹤單獨檔案的歷史, 不過 Subversion 實作了一個 “虛擬” 的版本控管檔案系統, 能夠依時間追蹤整個目錄的更動. 目錄檔案都被納入版本控管. 最後, 用戶端有真正可用的 move (移動) 與 copy 指令.

不可分割的送交
一個送交動作, 不是導致所有更動都送入檔案庫, 就是完全不會送入. 這讓發展人員以邏輯區段建立更動, 並送交更動.

納入版本控管的描述資料 (Meta-data)
每一個檔案與目錄都附有一組隱形 “性質 (property)”. 你可以自己發明, 並儲存任何你想要的鍵值對. 性質是隨著時間來作版本控管的, 就像檔案內容一樣.

選擇不同的網路層
Subversion 有抽象的檔案庫存取概念, 可以讓人很容易地實作新的網路機制. Subversion “先進” 的網路伺服器, 是 Apache 網頁伺服器的一個模組, 它以稱為 WebDAV/DeltaV 的 HTTP 變體協定與外界溝通. 這對 Subversion 的穩定性與互通性有很大的幫助, 而且額外提供了許多重要功能: 舉例來說, 有身份認證, 授權, 線上壓縮, 以及檔案庫瀏覽. 另外也有小而獨立的 Subversion 伺服器程式, 使用的是自訂的通訊協定, 可以很容易地透過 ssh 以 tunnel 方式使用.

一致的資料處理方式
Subversion 使用二進制差異運算法, 來表示檔案的差異, 它對文字 (人類可理解的) 與二進制檔案 (人類無法理解) 兩類的檔案都一視同仁. 這兩類的檔案都同樣地以壓縮形態儲存在檔案庫中, 而且檔案差異是以兩個方向在網路上傳送的.

更有效率的分支 (branch) 與標記 (tag)
分支與標記的花費並不必一定要與計畫大小成正比. Subversion 建立分支與標記的方法, 就只是複製該計畫, 使用的方法就像 hard-link 一樣. 所以這些動作只會花費很小, 而且是固定的時間.

Hackability
Subversion 沒有任何的歷史包袱; 它主要是一群共用的 C 程式庫, 具有定義完善的 API. 這使得 Subversion 便於維護, 並且可被其它應用程式與程式語言使用.
伺服器配置
SVN提供了三種Server配置的方式,(1) svnserver (2) svnserver+ ssh (3) apache + mod_dav_svn
(1) svnserver : 一個更小,輕型的服務器程序,同客戶端使用自定義的協議。因為協議是為Subversion專門設計的,並且是有狀態的(不像HTTP),它提供了更快的 網絡操作—但也有一些代價。它只理解CRAM-MD5的認證,然而它非常易於配置,是開始使用Subversion的小團隊的最佳選擇。
(2) svnserver + ssh : 儘管依然使用svnserve,它與傳統的svnserve部署非常不同,SSH在多所有的通訊中使用加密方式,SSH也使用排他的認證,所以在服務器主機(svnserve與之不同,它包含了自己的私有用戶帳號)上必須要有真實的系統帳戶。最後,因為這些配置需要每個用戶發起一個私有的臨時svnserve進程,這與允許一組本地用戶通過file://協議訪問等同(從訪問許可的視點)。因此路徑為基礎的訪問控制變得沒有意義,因為每個用戶都可以直接訪問版本庫。

(3) apache : Apache是最流行的web服務器,通過使用mod_dav_svn模塊,Apache可以訪問版本庫,並且可以使客戶端使用HTTP的擴展協議WebDAV/DeltaV進行訪問,因為Apache是一個非常易於擴展的web服務器,它提供了許多「易於獲取的」特性,例如加密的SSL通訊,日誌和與第三方工具的集成,以及內置的版本庫web瀏覽功能


註: 參考官方說明文件第6章

Apache2 Installation
##請至官網下載必備套件
Apache官網:http://httpd.apache.org/
Apache 套件:http://ftp.tcc.edu.tw/pub/Apache/httpd/httpd-2.0.63.tar.gz

##解壓縮 httpd-2.x.x.xxtar.gz

$>mv httpd-2.x.x.xxtar.gz /usr/src/
$>tar -xvzf httd-2.x.xx.tar.gz
$>cd httpd-2.x.xx

##安裝apr (Apache Portable Runtime) & apr-util (APR Utility)

$>cd httpd-2.x.xx/srclib/apr
$>./buildconf
$>./configure --prefix=/usr/local/apr
$>make
$>make install
$>cd httpd-2.x.xx/srclib/apr-util
$>./buildconf
$>./configure --prefix=/usr/local/apr --with-apr=/usr/local/apr
$>make
$>make install

##安裝apache2
$>cd httpd-2.x.xx
$>./configure --enable-dav --prefix=/usr/local/apache2 --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --enable-cgi --enable-modules=so --enable-rewrite
$>make && make install
SVN Installation
##請至官網下載必備套件
SVN官網:http://subversion.tigris.org/
SVN套件:http://subversion.tigris.org/downloads/subversion-1.5.4.tar.gz

$>./configure --prefix=/usr/local/subversion --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr --with-apxs=/usr/local/apache2/bin/apxs --with-ssl
$>make
$>make install
Reference by follow website
Version Control with Subversion (繁體中文) -- http://twpug.net/docs/Subversion/
Install Subversion at RedHat Linux AS4 -- http://www.svn8.com/svnpz/20080316/339.html