SVN服務器搭建小記

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

配置httpsvn關聯的文件(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驗證passhttp驗證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程序用的認證與密碼文件不要混用,特別是密碼文件passwdapache的是加密的,而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

#在備份機器上執行,initinitialize的簡寫。特別注意:提供給svnsyncURL必須是指向目標和源版本庫的根目錄,這個工具不支持對版本庫子樹的鏡像處理。

測試數據同步: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 commitstart-commit配置有問題

svnsync: E165006: Repository has not been enabled to accept revision propchanges;ask the administrator to create a pre-revprop-change hookpre-revprop-change配置有問題

關於UUID不匹配

svnlook uuid <repos_path> :查看原有的uuid

svnadmin setuuid <repos_path> <uuid> :更新新的uuid

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章