$ svnadmin create /path/to/repos
在 Subversion 1.2中,版本庫默認(rèn)使用FSFS后端存儲方式來創(chuàng)建(見“版本庫數(shù)據(jù)存儲”一節(jié))。不管怎樣,存儲類型可以使用--fs-type
參數(shù)明確說明:
$ svnadmin create --fs-type fsfs /path/to/repos
$ svnadmin create --fs-type bdb /path/to/other/repos
不要在網(wǎng)絡(luò)共享上創(chuàng)建Berkeley DB版本庫—它不能存在于諸如NFS, AFS或Windows SMB的遠(yuǎn)程文件系統(tǒng)中,Berkeley數(shù)據(jù)要求底層文件系統(tǒng)實(shí)現(xiàn)嚴(yán)格的POSIX鎖定語義,幾乎沒有任何網(wǎng)絡(luò)文件系統(tǒng)提供這些特性,假如你在網(wǎng)絡(luò)共享上使用BerkeleyDB,結(jié)果是不可預(yù)知的——許多錯(cuò)誤可能會立刻發(fā)現(xiàn),也有可能在幾個(gè)月之后才能發(fā)現(xiàn)
假如你需要多臺計(jì)算機(jī)來訪問,你需要在網(wǎng)絡(luò)共享上創(chuàng)建FSFS版本庫,而不是Berkeley DB的版本庫?;蛘吒玫霓k法,你建立一個(gè)真正的服務(wù)進(jìn)程(例如Apache或svnserve),把版本庫放在服務(wù)器能訪問到的本地文件系統(tǒng)中,以便能通過網(wǎng)絡(luò)訪問。詳情請參看linkend="svn.serverconfig"/>。
你可能已經(jīng)注意到了,svnadmin命令的路徑參數(shù)只是一個(gè)普通的文件系統(tǒng)路徑,而不是一個(gè)svn客戶端程序訪問版本庫時(shí)使用的URL。svnadmin和svnlook都被認(rèn)為是服務(wù)器端工具—它們在版本庫所在的機(jī)器上使用,用來檢查或修改版本庫,不能通過網(wǎng)絡(luò)來執(zhí)行任務(wù)。一個(gè)Subversion的新手通常會犯的錯(cuò)誤,就是試圖將URL(甚至“本地”file:
路徑)傳給這兩個(gè)程序。
所以,當(dāng)你運(yùn)行svnadmin create命令后,就會在運(yùn)行目錄創(chuàng)建一個(gè)嶄新的Subversion版本庫,讓我們看一下在這個(gè)目錄創(chuàng)建中創(chuàng)建了什么。
$ ls repos
conf/ dav/ db/ format hooks/ locks/ README.txt
除了README.txt
和format
文件,版本庫目錄就是一些子目錄了。就像Subversion其它部分的設(shè)計(jì)一樣,模塊化是一個(gè)很重要的原則,而且層次化的組織要比雜亂無章好。下面是對新的版本庫目錄中各個(gè)項(xiàng)目的簡要介紹:
一個(gè)存儲版本庫配置文件的目錄。
提供給Apache和mod_dav_svn的目錄,讓它們存儲自己的數(shù)據(jù)。
你所有的受版本控制數(shù)據(jù)的所在之處。這個(gè)目錄或者是個(gè)Berkeley DB環(huán)境(滿是數(shù)據(jù)表和其他東西),或者是一個(gè)包含修訂版本文件的FSFS環(huán)境。
包含了用來表示版本庫布局版本號的整數(shù)。
一個(gè)存儲鉤子腳本模版的目錄(還有鉤子腳本本身, 如果你安裝了的話)。
一個(gè)存儲Subversion版本庫鎖定數(shù)據(jù)的目錄,被用來追蹤對版本庫的訪問。
這個(gè)文件只是用來告訴它的閱讀者,他現(xiàn)在看的是 Subversion 的版本庫。
一般來說,你不需要手動干預(yù)版本庫。svnadmin工具應(yīng)該足以用來處理對版本庫的任何修改,或者你也可以使用第三方工具(比如Berkeley DB的工具包)來調(diào)整部分版本庫。不過還是會有些例外情況,我們會在這里提到。
默認(rèn)情況下,鉤子的子目錄中包含各種版本庫鉤子模板。
$ ls repos/hooks/
post-commit.tmpl post-unlock.tmpl pre-revprop-change.tmpl
post-lock.tmpl pre-commit.tmpl pre-unlock.tmpl
post-revprop-change.tmpl pre-lock.tmpl start-commit.tmpl
目前Subversion有已實(shí)現(xiàn)了九種鉤子:
start-commit
pre-commit
Subversion的分發(fā)版本包括了一些訪問控制腳本(在Subversion源文件目錄樹的tools/hook-scripts
目錄),可以用來被pre-commit調(diào)用來實(shí)現(xiàn)精密的寫訪問控制。另一個(gè)選擇是使用Apache的httpd模塊mod_authz_svn,可以對單個(gè)目錄進(jìn)行讀寫訪問控制(見“每目錄訪問控制”一節(jié))。在未來的Subversion版本中,我們計(jì)劃直接在文件系統(tǒng)中實(shí)現(xiàn)訪問控制列表(ACLs)。
post-commit
它在事務(wù)完成后運(yùn)行,創(chuàng)建一個(gè)新的修訂版本。大多數(shù)人用這個(gè)鉤子來發(fā)送關(guān)于提交的描述性電子郵件,或者作為版本庫的備份。版本庫傳給程序兩個(gè)參數(shù):到版本庫的路徑和被創(chuàng)建的新的修訂版本號。退出程序會被忽略。
Subversion分發(fā)版本中包括mailer.py和commit-email.pl腳本(存于Subversion源代碼樹中的tools/hook-scripts/
目錄中)可以用來發(fā)送描述給定提交的email(并且或只是追加到一個(gè)日志文件),這個(gè)mail包含變化的路徑清單,提交的日志信息、日期和作者以及修改文件的GNU區(qū)別樣式輸出。
Subversion提供的另一個(gè)有用的工具是hot-backup.py腳本(在Subversion源代碼樹中的tools/backup/目錄中)。這個(gè)腳本可以為Subversion版本庫進(jìn)行熱備份(Berkeley DB數(shù)據(jù)庫后端支持的一種特性),可以制作版本庫每次提交的快照作為歸檔和緊急情況的備份。
pre-revprop-change
因?yàn)镾ubversion的修訂版本屬性不是版本化的,對這類屬性的修改(例如提交日志屬性svn:log
)將會永久覆蓋以前的屬性值。因?yàn)閿?shù)據(jù)在此可能丟失,所以Subversion提供了這種鉤子(及與之對應(yīng)的post-revprop-change
),因此版本庫管理員可用一些外部方法記錄變化。作為對丟失未版本化屬性數(shù)據(jù)的防范,Subversion客戶端不能遠(yuǎn)程修改修訂版本屬性,除非為你的版本庫實(shí)現(xiàn)這個(gè)鉤子。
這個(gè)鉤子在對版本庫進(jìn)行這種修改時(shí)才會運(yùn)行,版本庫給鉤子傳遞四個(gè)參數(shù):到版本庫的路徑,要修改屬性的修訂版本,經(jīng)過認(rèn)證的用戶名和屬性自身的名字。
post-revprop-change
我們在前面提到過,這個(gè)鉤子與pre-revprop-change
對應(yīng)。事實(shí)上,因?yàn)槎嘁傻脑?,只有存?code class="filename">pre-revprop-change時(shí)這個(gè)腳本才會執(zhí)行。當(dāng)這兩個(gè)鉤子都存在時(shí),post-revprop-change
在修訂版本屬性被改變之后運(yùn)行,通常用來發(fā)送包含新屬性的email。版本庫傳遞四個(gè)參數(shù)給該鉤子:到版本庫的路徑,屬性存在的修訂版本,經(jīng)過校驗(yàn)的產(chǎn)生變化的用戶名,和屬性自身的名字。
Subversion分發(fā)版本中包含propchange-email.pl腳本(在Subversion源代碼樹中的tools/hook-scripts/
目錄中),可以用來發(fā)送修訂版本屬性修改細(xì)節(jié)的email(并且或只是追加到一個(gè)日志文件)。這個(gè)email包含修訂版本和發(fā)生變化的屬性名,作出修改的用戶和新屬性值。
pre-lock
這個(gè)鉤子會在每次有人嘗試鎖定文件時(shí)執(zhí)行,可以防止完全的鎖定,或者用來制定控制哪些用戶可以鎖定特定路徑的復(fù)雜策略,如果鉤子發(fā)現(xiàn)已存在的鉤子,也可以決定是否“竊取”這個(gè)鉤子。版本庫傳遞三個(gè)參數(shù)到鉤子:到版本庫的路徑、鎖定的路徑和企圖執(zhí)行鎖定的用戶。如果程序返回非零值,鎖定動作會退出,并且所有的標(biāo)準(zhǔn)輸出返回到客戶端。
post-lock
這個(gè)鉤子在一個(gè)路徑被鎖定后執(zhí)行,鎖定的路徑傳遞給鉤子的標(biāo)準(zhǔn)輸入,這個(gè)鉤子也接受兩個(gè)參數(shù):到版本庫的路徑和企圖執(zhí)行鎖定的用戶??梢杂眠@個(gè)鉤子發(fā)送通知郵件來記錄這種鎖定事件,因?yàn)殒i定已經(jīng)發(fā)生,輸出會被鉤子忽略。
pre-unlock
這個(gè)鉤子在某人企圖刪除一個(gè)文件上的鉤子時(shí)發(fā)生,可以用來制定哪些用戶可以解除文件鎖定的策略。制定破壞鎖定的策略非常重要,如果一個(gè)用戶A鎖定了一個(gè)文件,允許用戶B打開這個(gè)鎖?如果這個(gè)鎖已經(jīng)一周了呢?這種事情可以通過鉤子決定并執(zhí)行。版本庫傳遞三個(gè)參數(shù)到鉤子:到版本庫的路徑、將要解鎖的路徑和企圖解鎖的用戶。如果程序返回非零值,解鎖操作退出并會將標(biāo)準(zhǔn)錯(cuò)誤傳輸?shù)娇蛻舳恕?
post-unlock
鉤子在一個(gè)路徑被解鎖后執(zhí)行,被解鎖的路徑會傳遞到鉤子的標(biāo)準(zhǔn)輸入,鉤子也會得到兩個(gè)參數(shù):到版本庫的路徑和刪除鎖定的用戶。可以用鉤子發(fā)送記錄這些事件的郵件。因?yàn)閯h除已經(jīng)發(fā)生,鉤子的輸出被忽略。
不要嘗試用鉤子腳本修改事務(wù)。一個(gè)常見的例子就是在提交時(shí)自動設(shè)置svn:eol-style
或svn:mime-type
這類屬性。這看起來是個(gè)好主意,但它會引起問題。主要的問題是客戶并不知道由鉤子腳本進(jìn)行的修改,同時(shí)沒有辦法通告客戶它的數(shù)據(jù)是過時(shí)的,這種矛盾會導(dǎo)致出人意料和不能預(yù)測的行為。
作為嘗試修改事務(wù)的替代,我們通過檢查pre-commit
鉤子的事務(wù),在不滿足要求時(shí)拒絕提交。
Subversion會試圖以當(dāng)前訪問版本庫的用戶身份執(zhí)行鉤子。通常,對版本庫的訪問總是通過ApacheHTTP服務(wù)器和mod_dav_svn進(jìn)行,因此,執(zhí)行鉤子的用戶就是運(yùn)行Apache的用戶。鉤子本身需要具有操作系統(tǒng)級的訪問許可,用戶可以運(yùn)行它。另外,其它被鉤子直接或間接使用的文件或程序(包括Subversion版本庫本身)也要被同一個(gè)用戶訪問。換句話說,要注意潛在的訪問控制問題,它可能會讓你的鉤子無法按照你的目的順利執(zhí)行。