SVN安裝:
Yum install subversion
Mkdir /Path/Svnrepors/Projet1
創建svn倉庫 Svnadmin create /Path/Svnrepors
svn倉庫目錄結構 |--conf
|--format
|--hooks
|--locks
svn配置文件:Projet/conf/svnserver.conf
[general]配置段中配置行格式如下:
<配置項> = <值>
anon-access :控制非鑑權用戶訪問版本庫的權限。取值範圍爲"write"、"read"和"none","none"表示無訪問權限。缺省值:read
auth-access: 控制鑑權用戶訪問版本庫的權限。取值範圍爲"write"、"read"和"none"。缺省值:write
password-db 指定用戶名口令文件名。除非指定絕對路徑,否則文件位置爲相對conf目錄的相對路徑。缺省值:passwd
authz-db 指定權限配置文件名,通過該文件可以實現以路徑爲基礎的訪問控制。除非指定絕對路徑,否則文件位置爲相對conf目錄的相對路徑。缺省值:authz
realm 指定版本庫的認證域,即在登錄時提示的認證域名稱。若兩個版本庫的認證域相同,建議使用相同的用戶名口令數據文件。缺省值:一個UUID(Universal Unique IDentifier,全局唯一標示)。
[sasl]]配置段中配置行格式如下:
svn密碼文件:Projet/conf/pass
[users]配置段的配置行格式如下:
<用戶名> = <口令>
注:配置行中的口令爲未經過任何處理的明文。
例: [users]
admin = admin
thinker = 123456
svn權限文件:Projet/conf/auth
[groups]配置段中配置行格式如下:
<用戶組> = <用戶列表>
用戶列表由若干個用戶組或用戶名構成,用戶組或用戶名之間用逗號","分隔,引用用戶組時要使用前綴"@"(如:引用用戶組"all"要使用字符 串"@all")。
版本庫路徑權限段的段名格式如下:
[<版本庫名>:<路徑>]
如版本庫abc路徑/tmp的版本庫路徑權限段的段名爲"[abc:/tmp]"。
可省略段名中的版本庫名。若省略版本庫名,則該版本庫路徑權限段對所有版本庫中相同路徑的訪問控制都有效。如:段名爲"[/tmp]"的版本庫路徑權限段 設置了所有引用該權限配置文件的版本庫中目錄"/tmp"的訪問權限。
版本庫路徑權限段中配置行格式有如下三種:
<用戶名> = <權限>
<用戶組> = <權限>
* = <權限>
其中,"*"表示任何用戶;權限的取值範圍爲' '、'r'和'rw',' '表示對該版本庫路徑無任何權限,'r'表示具有隻讀權限,'rw'表示有讀寫權 限。
注:每行配置只能配置單個用戶或用戶組。
例: [groups]
g_admin = admin,thinker
[admintools:/]
@g_admin = rw
* =
[test:/home/thinker]
thinker = rw
* = r
以上配置文件保存後就立即生效,不需要重啓svnserve服務,且只對svnserve服務有效,即客戶端通過前綴爲svn://或svn+ssh://的URL訪問版本庫有效。
啓動svn :svnserve -d -r /Path/Svnrepors/ --config-file /Path/svnserve.conf --log-file /Path/svn.log
SVN+HTTP安裝:
Yum install httpd httpd-devel mod_dav_svn
確保httpd/modules 下有mod_authz_svn.so mod_dav_svn.so
配置http與svn關聯的文件(http/conf.d/下):subversion.conf
加載svn需要的兩個模塊
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so
配置svn訪問的虛擬目錄:(/svn只是個虛目錄,用於區別普通的網站訪問)
<Location /svn>
Dav svn
#----開啓DAV模塊支持
SVNListParentPath on
#----允許在網頁上顯示svn父目錄list --記住,註釋不要和配置項寫到同一行,否則會出錯..
SVNPath "/Path/Svnrepors/Projet1"
#----SVN倉庫目錄
SVNParentPath "/Path/Svnrepors"
#----SVN倉庫父目錄,用於多項目管理時(SVNPath和 SVNParentPath只能選擇一個不能共存)
AuthType Basic
#----連接類型設置
AuthName "Subversion Repository"
#----連接框提示
AuthUserFile /etc/svn/passwd
#----用戶密碼文件(svn驗證pass和http驗證pass的文件格式不同,不能通用)
AuthzSVNAccessFile /etc/svn/authz
#----用戶權限文件
Require valid-user
</Location>
創建用戶:htpasswd -c AuthUserFile_PATH <username> //如果文件存在則不需要-c參數
權限設置:chown -R apache:apache REPOS_PATH
selinux的設置:chcon -R -h -t httpd_sys_content_t REPOS_PATH
特別注意:apache的用的認證與密碼文件和svn程序用的認證與密碼文件不要混用,特別是密碼文件passwd,apache的是加密的,而svn的是明文的,搞錯了都不能成功訪問。apache的認證和密碼文件搞對了,就可以成功訪問到svn,但是還不能自動更新,svn程序用的認證和密碼文件搞對了才能自動更新,且apache用的認證用戶與密碼必須與svn程序用的用戶名和密碼一致,否則無法實現自動更新。
SVN遷移、備份與恢復:
1、通過dump
備份:svnadmin dump REPOS_PATH [-r LOWER[:UPPER] [--incremental]] > dumpfile
還原:svnadmin load REPOS_PATH < dumpfile
2、通過hotcopy
備份:svnadmin hotcopy REPOS_PATH NEW_REPOS_PATH –clean-logs (完全備份,包括鉤子文件等;如果傳遞-clean-logs選項,svnadmin會執行熱拷貝操作,然後刪除不用Berkeley DB日誌文件。可以在任何時候運行這個命令得到一個版本庫的安全拷貝,不管其它進程是否使用這個版本庫。)
還原:svnadmin hotcopyNEW_REPOS_PATH REPOS_PATH
3、通過svnsync
svnsync進程只需要對源版本庫有讀權限;它不會嘗試修改它。但是,svnsync可以讀寫訪問鏡像版本庫。
svnsync對於不能作爲鏡像操作一部分的修改非常敏感,爲了防止發生這個情況,最好保證svnsync是唯一可以修改鏡像版本庫的進程。
配置來源、備份SVN,創建用戶:SVNUSER 請確認SVNUSER用戶對備份SVN有寫入權限。對來源SVN有讀取權限,且密碼相同。
初始化:svnsync init SVN_REPOS_SOURCE SVN_REPOS_DEST--username USERNAME --password USERPASS
#在備份機器上執行,init爲initialize的簡寫。特別注意:提供給svnsync的URL必須是指向目標和源版本庫的根目錄,這個工具不支持對版本庫子樹的鏡像處理。
測試數據同步:svnsync synchronize SVN_REPOS_DEST--username USERNAME --password USERPASS
# 注意
# svnsync的最初版本(在Subversion 1.4)有一些缺陷—-用來認證的--username和--password命令行參數同時作用於源和目標版本庫。
# 顯然,我們無法保證同步的用戶認證信息是相同的,如果不一樣,用戶使用非交互模式(--non-interactive選項)來運行svnsync時會遇到這個問題(PS:也就是認證無法通過)。
# 現在有趣的部分開始了,通過一個單獨的子命令,我們可以告訴svnsync將所有鏡像的修訂版本從源版本庫拷貝到目標版本庫。
# [35]svnsync synchronize子命令會查看目標版本庫特定修訂版本的屬性,並且檢測同步的版本庫是哪一個,以及最新鏡像的修訂版本是0。然後它會查詢源版本庫,檢測其最新的修訂版本。
# 最後,它會詢問源版本庫服務器來開始重演從修訂版本0到最新修訂版本。svnsync從源版本庫服務器得到返回的結果,然後將其作爲新的提交轉發到目標版本庫服務器。
# [35] 要預先警告一下,儘管對於普通讀者只需要幾秒鐘就可以理解下面的輸出,而對於整個鏡像過程花費的時間可能會非常長。
啓用實時同步:svnsync synchronize --non-interactive SVN_REPOS_DEST --username USERNAME --password USERPASS
#在源機器上執行,一般寫在hook下的post-commit文件中
# --non-interactive 非交互模式,如果程序需要參數,讓程序自行處理
同步時異常終止:svn propdel svn:sync-lock --revprop -r HEAD SVN_REPOS_DEST
#比如出現Failed to get lock on destination repos, currently held by 'localhost.localdomain:d1dfeaac-b028-4484-a1ec-ae455ba090e1'錯誤
#使用 svnsync synchronize 同步時異常終止。如:機器停電,斷網等。
需要配置的hook文件:
備份機器:
pre-revprop-change:
# 限制只有syncuser用戶才能提交版本屬性修改到此版本庫
$USER = $3
if [ "$USER" = "syncuser" ]; then exit 0; fi
echo "Only the syncuser user may change revision properties" >&2
exit 1
# svnsync的通訊議對於源和目標版本庫版本歷史的不一致非常敏感,因此,雖然svnsync無法要求目標版本庫是隻讀的,[34]最好的辦法就是隻允許鏡像進程修改目標版本庫內容。(PS:鏡像==來源SVN 目錄==備份SVN)
# [34] 實際上,它不是真的完全只讀,或者svnsync本身有時間將版本庫歷史拷入。
start-commit(可選,但建議配上)
# 限制只用syncuser用戶才能提交版本修改到版本庫
$USER = $3
if [ "$USER" = "syncuser" ]; then exit 0; fi
echo "Only the syncuser user may commit new revisions" >&2
exit 1
源機器:
post-commit
svnsync synchronize --non-interactiveSVN_REPOS_DEST --username USERNAME --password USERPASS
# --non-interactive 非交互模式,如果程序需要參數,讓程序自行處理
svnsync的幾個參數選項:
--config-dir DIR:指導Subversion從指定目錄而不是默認位置(用戶主目錄的.subversion)讀取配置信息。
--no-auth-cache:阻止在Subversion管理區緩存認證信息(如用戶名密碼)。
--non-interactive:如果認證失敗,或者是不充分的憑證時,防止出現要求憑證的提示(例如用戶名和密碼)。這在運行自動腳本時非常有用,只是讓Subversion失敗而不是提示更多的信息。
--password PASS:指出在命令行中提供你的密碼—另外,如果它是需要的,Subversion會提示你輸入。
--username NAME:表示你要在命令行提供認證的用戶名—否則如果需要,Subversion會提示你這一點。
可能出現的錯誤:
Transmitting file data ............svnsync: Error while replaying commit:start-commit配置有問題
svnsync: E165006: Repository has not been enabled to accept revision propchanges;ask the administrator to create a pre-revprop-change hook:pre-revprop-change配置有問題
關於UUID不匹配
svnlook uuid <repos_path> :查看原有的uuid
svnadmin setuuid <repos_path> <uuid> :更新新的uuid