#####官方網站#####
TortoiseSVN -- 常見的SVN Client 軟體
http://tortoisesvn.net/
Subversion線上電子書 -- 繁體中文
http://twpug.net/docs/Subversion/
Subversion線上電子書 -- 簡體中文
http://svnbook.red-bean.com/
#####教學討論#####
簡體中文SVN的技術論壇, 資源非常豐富
http://www.svn8.com/
國內Blog, 有著圖文並茂的介紹及教學, 值得前往
http://i.repeat.tw/blog/category/107765
國內邱茂森前輩的簡報
http://www.csie.ntut.edu.tw/sdrc/files/course/20061201/VersionControlWithSVN.pdf
#####常見問題#####
Total Commander也可以看到SVN的系統圖示唷!!
http://www.dotblogs.com.tw/chhuang/archive/2008/10/12/5662.aspx
在選定一目錄Show log時, 某些版本只顯示版本號碼與 no date, 看不見其訊息, 為什麼??
http://doc.iusesvn.com/show-33-1.html
SVN是否可以控制中文目錄的訪問權限
http://doc.iusesvn.com/show-31-1.html
Client端連線至檔案庫時, 出現右列錯誤訊息 " svnserve.conf : 12 : Option expected "
http://doc.iusesvn.com/show-28-1.html
在Redhat AS4 的安裝與設定
http://doc.iusesvn.com/show-15-1.html
svnserve的權限設定
http://doc.iusesvn.com/show-8-1.html
Redhat AS4 安裝 apache2.2.3 + svn1.4 + 郵件自動通知
http://doc.iusesvn.com/show-7-1.html
詳盡介紹多層次目錄權限控制設定
http://doc.iusesvn.com/show-1-1.html
2009年1月8日 星期四
2009年1月7日 星期三
使用SVN進行版本控制 - (五)TortoiseSVN 的基本操作與使用
TortoiseSVN是在Windows平台上使用的Subversion Client, 它是免費的, 重要的是它把Subversion Client具備的功能全部整合於右鍵的功能選單內, 使用起來相當便利, 省去了下達Command的麻煩。

以系統圖示表達目前檔案的狀態
提供不同的圖示, 各代表著不同的意義, 非常直覺化, 一目瞭然!!

瀏覽檔案庫的內容
任意地按下滑鼠右鍵, 點選『TortoiseSVN』-> 『Repo-browser』, 鍵入"svn://svnserver/repository", 瀏覽SVN Server的檔案庫內容。


導出檔案庫副本
為了取得檔案庫的副本, 必須進行Check Out的操作。
選擇欲存放檔案庫副本的資料夾, 按下滑鼠右鍵, 點選『TortoiseSVN』-> 『SVN Checkout..』, 指定欲導出(check out)檔案庫的來源路徑, 再指定存放檔案庫副本的目的路徑。在此, Head Revision表示導出最新版本, 隨即導出檔案庫副本。


提交異動至檔案庫
在提交異動之前, 必須確認目前檔案庫副本是否仍為最新版本(表示這期間無人進行修改), 選擇存放檔案庫副本的資料夾, 按下滑鼠右鍵, 點選『TortoiseSVN』-> 『SVN Update』。

若本機異動的檔案, 在這段期間沒有他人進行修改, 則點選 『TortoiseSVN』-> 『SVN Commit』, 鍵入詳細的異動資料, 異動檔案, 異動人員...等等, 以利往後回溯至需要的版本。

若本機異動的檔案, 在這段期間已有他人進行修改, 並且先行提交異動至SVN Server, 此時會蹦現出警告視窗, 提醒該檔案已提交較新的版本, 也顯示其較新版本的Log。遭遇此一情況時, 必須使用『TortoiseSVN』-> 『Diff』, 進行檔案內容的差異化比較, 待與他人協調並確認檔案內容之後, 再提交經確認異動的檔案至SVN Server。


以系統圖示表達目前檔案的狀態
提供不同的圖示, 各代表著不同的意義, 非常直覺化, 一目瞭然!!

瀏覽檔案庫的內容
任意地按下滑鼠右鍵, 點選『TortoiseSVN』-> 『Repo-browser』, 鍵入"svn://svnserver/repository", 瀏覽SVN Server的檔案庫內容。


導出檔案庫副本
為了取得檔案庫的副本, 必須進行Check Out的操作。
選擇欲存放檔案庫副本的資料夾, 按下滑鼠右鍵, 點選『TortoiseSVN』-> 『SVN Checkout..』, 指定欲導出(check out)檔案庫的來源路徑, 再指定存放檔案庫副本的目的路徑。在此, Head Revision表示導出最新版本, 隨即導出檔案庫副本。


提交異動至檔案庫
在提交異動之前, 必須確認目前檔案庫副本是否仍為最新版本(表示這期間無人進行修改), 選擇存放檔案庫副本的資料夾, 按下滑鼠右鍵, 點選『TortoiseSVN』-> 『SVN Update』。

若本機異動的檔案, 在這段期間沒有他人進行修改, 則點選 『TortoiseSVN』-> 『SVN Commit』, 鍵入詳細的異動資料, 異動檔案, 異動人員...等等, 以利往後回溯至需要的版本。

若本機異動的檔案, 在這段期間已有他人進行修改, 並且先行提交異動至SVN Server, 此時會蹦現出警告視窗, 提醒該檔案已提交較新的版本, 也顯示其較新版本的Log。遭遇此一情況時, 必須使用『TortoiseSVN』-> 『Diff』, 進行檔案內容的差異化比較, 待與他人協調並確認檔案內容之後, 再提交經確認異動的檔案至SVN Server。

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
小張是位在軟體公司任職的專案經理,某天,察覺到當成員愈多時,在版本控制上,更形困難,每每版本混亂造成的影響,總要花上些許多時間。因此,小張決定試著採用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 /svnImport Project (匯入專案)
$>chwon -R nobody /svn
$>svnadmin create /svn/test
$>ls /svn/test
#如果ls /repository/test/出現了下面的內容,就說明subversion安裝成功了
conf dav db format hooks locks README.txt
$>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, 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)
2. apache, a http server
apache是一種較為耗費資源的service, 建立於WebDav的基礎通訊協定上,client side可透過http://來進行溝通。
- svnserver
- svnserver + ssh
- apache
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(2) as daemon (/etc/xinetd.d)
# -d : 以daemon方式執行
# -r : 虛擬根目錄, 限制只能在此目錄底下的瀏覽
$> lsof -i :3690
# 可以查看svnserver是否已正常啟動
$> vi /etc/xinetd.d/svnserve1.1 svnserve.conf (配置設定)
##新增以下文字內容
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
[general]1.2 passwd (使用者帳號)
anon-access = none
auth-access = write
password-db = passwd
authz-db = authz
# realm = My First Repository
[users]1.3 authz (授權管理)
## username = password
admin = admin
yardmgr = yardmgr
[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??
Apache2 Installation
Version Control with Subversion (繁體中文) -- http://twpug.net/docs/Subversion/
Install Subversion at RedHat Linux AS4 -- http://www.svn8.com/svnpz/20080316/339.html
(引述官方文件的簡介)功能列表
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
##請至官網下載必備套件SVN 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
##請至官網下載必備套件Reference by follow website
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
Version Control with Subversion (繁體中文) -- http://twpug.net/docs/Subversion/
Install Subversion at RedHat Linux AS4 -- http://www.svn8.com/svnpz/20080316/339.html
2008年11月20日 星期四
System Log in Linux (openlog, syslog, closelog)
每當撰寫AP時, Log的工作是絕對馬虎不得, 但各個AP記錄著自己獨立的log file,
當發生問題時, AP彼此之間要對照時間及訊息時, 就是一件很麻煩的工程,
因為一個事件的引發, 其對應的作業流程卻是散佈於一連串的AP之中,
舉例來說:當客戶下訂單時, 訂單模組會建立訂單, 再通知倉儲模組,
若物料不足, 則須通知採購模組,
若物料充足, 則須通知生產製程模組, 以此類推...
有沒有什麼方法, 可以讓所有AP共同將log message記錄於同一個log file??
答案是: 有的!linux提供了syslog的 system call, 讓這類的工作變得非常簡單易用!

#include
int main(int argc, char **argv)
{
openlog("ident", LOG_CONS | LOG_PID, LOG_USER);
syslog(LOG_INFO,
"This is a syslog test message generated by program '%s'\n",
argv[0]);
closelog();
return 0;
}
## 連接至system logger
void openlog(const char *ident, int option, int facility);
## 產生log message
void syslog(int priority, const char *format, ...);
## 關閉連接
void closelog(void);
ident : 出現於每個log message, 通常是設為程式名稱
option :
LOG_CONS : 如果送到system logger時發生問題,直接寫入系統console
LOG_NDELAY : 立即開啟連接(通常,連接是在第一次寫入訊息時才打開的)
LOG_PERROR : 將訊息也同時送到stderr
LOG_PID : 將PID含入所有訊息中
facility : (指定程式的類型, 藉由syslog.conf決定不同的作業方式)
LOG_AUTH : 安全/授權訊息(別用這個,請改用LOG_AUTHPRIV)
LOG_AUTHPRIV : 安全/授權訊息
LOG_CRON : 時間守護神專用(cron及at)
LOG_DAEMON : 其它系統守護神
LOG_KERN : 核心訊息
LOG_LOCAL0到LOG_LOCAL7 : 保留
LOG_LPR : line printer次系統
LOG_MAIL : mail次系統
LOG_NEWS : USENET news次系統
LOG_SYSLOG : syslogd內部所產生的訊息
LOG_USER(default) : 一般使用者等級訊息
LOG_UUCP : UUCP次系統
level : (決定訊息的重要性, 以下的等級重要性逐次遞減)
LOG_EMERG : 系統無法使用
LOG_ALERT : 必須要立即採取反應行動
LOG_CRIT : 重要狀況發生
LOG_ERR : 錯誤狀況發生
LOG_WARNING : 警告狀況發生
LOG_NOTICE : 一般狀況,但也是重要狀況
LOG_INFO : 資訊訊息
LOG_DEBUG : 除錯訊息
priority : (facility | level)
當發生問題時, AP彼此之間要對照時間及訊息時, 就是一件很麻煩的工程,
因為一個事件的引發, 其對應的作業流程卻是散佈於一連串的AP之中,
舉例來說:當客戶下訂單時, 訂單模組會建立訂單, 再通知倉儲模組,
若物料不足, 則須通知採購模組,
若物料充足, 則須通知生產製程模組, 以此類推...
有沒有什麼方法, 可以讓所有AP共同將log message記錄於同一個log file??
答案是: 有的!linux提供了syslog的 system call, 讓這類的工作變得非常簡單易用!
( syslog protocol 運作圖)
#include
int main(int argc, char **argv)
{
openlog("ident", LOG_CONS | LOG_PID, LOG_USER);
syslog(LOG_INFO,
"This is a syslog test message generated by program '%s'\n",
argv[0]);
closelog();
return 0;
}
## 連接至system logger
void openlog(const char *ident, int option, int facility);
## 產生log message
void syslog(int priority, const char *format, ...);
## 關閉連接
void closelog(void);
ident : 出現於每個log message, 通常是設為程式名稱
option :
LOG_CONS : 如果送到system logger時發生問題,直接寫入系統console
LOG_NDELAY : 立即開啟連接(通常,連接是在第一次寫入訊息時才打開的)
LOG_PERROR : 將訊息也同時送到stderr
LOG_PID : 將PID含入所有訊息中
facility : (指定程式的類型, 藉由syslog.conf決定不同的作業方式)
LOG_AUTH : 安全/授權訊息(別用這個,請改用LOG_AUTHPRIV)
LOG_AUTHPRIV : 安全/授權訊息
LOG_CRON : 時間守護神專用(cron及at)
LOG_DAEMON : 其它系統守護神
LOG_KERN : 核心訊息
LOG_LOCAL0到LOG_LOCAL7 : 保留
LOG_LPR : line printer次系統
LOG_MAIL : mail次系統
LOG_NEWS : USENET news次系統
LOG_SYSLOG : syslogd內部所產生的訊息
LOG_USER(default) : 一般使用者等級訊息
LOG_UUCP : UUCP次系統
level : (決定訊息的重要性, 以下的等級重要性逐次遞減)
LOG_EMERG : 系統無法使用
LOG_ALERT : 必須要立即採取反應行動
LOG_CRIT : 重要狀況發生
LOG_ERR : 錯誤狀況發生
LOG_WARNING : 警告狀況發生
LOG_NOTICE : 一般狀況,但也是重要狀況
LOG_INFO : 資訊訊息
LOG_DEBUG : 除錯訊息
priority : (facility | level)
訂閱:
文章 (Atom)