近一個(gè)客戶聘請(qǐng)了一個(gè)網(wǎng)絡(luò)開發(fā)團(tuán)隊(duì)來幫助他的工作過度的網(wǎng)管。他們要求我安裝一個(gè)版本控制系統(tǒng),這個(gè)系統(tǒng)能夠保證團(tuán)隊(duì)中的任何成員避免無意中修改別人的文件,并且能夠給予管理員恢復(fù)文件到任何版本的機(jī)制。
我的第一個(gè)想法是Subversion。因?yàn)樗俏覍態(tài)SD Hacks 時(shí)和編輯器一起用的版本控制系統(tǒng)。在Ports Collection中搜索一下之后發(fā)現(xiàn),Subversion需要好幾個(gè)相關(guān)的port。比如,esvn看起來相當(dāng)適合客戶端,因?yàn)樗腉UI界面能夠運(yùn)行在Unix,Mac OS X以及Windows中。對(duì)于一個(gè)對(duì)Unix技術(shù)掌握不深的網(wǎng)絡(luò)開發(fā)團(tuán)隊(duì)而言,當(dāng)他們需要把數(shù)據(jù)存貯在FreeBSD服務(wù)器上而從非FreeBSD系統(tǒng)讀取時(shí),esvn是非常好的選擇。
前期準(zhǔn)備
在我的想法中,只允許開發(fā)團(tuán)隊(duì)的成員具有權(quán)限訪問倉庫是非常重要的。同時(shí),我們把倉庫放在和目前的web服務(wù)器分開的操作系統(tǒng)上,當(dāng)web管理員看到適合的文件時(shí),由他負(fù)責(zé)把文件從倉庫復(fù)制到web服務(wù)器上。
為了實(shí)現(xiàn)這個(gè)目的,先對(duì)已存在的你想放到版本控制系統(tǒng)下的目錄結(jié)構(gòu)做一個(gè)備份,然后把它安全發(fā)送到倉庫服務(wù)器。在我的例子中,我把web服務(wù)器上www目錄的數(shù)據(jù)備份到一臺(tái)內(nèi)網(wǎng)服務(wù)器
192.168.2.2上。
# tar czvf - /usr/local/etc/www/data | ssh dru@192.168.2.2 "cat > www.tar.gz"
下一步是在倉庫服務(wù)器上建立一個(gè)svn組,并把已存在的需要訪問倉庫的用戶加到這個(gè)組中。比如,當(dāng)我創(chuàng)建svn組后,我在/etc/group加入這句話把已存在的web管理員用戶加進(jìn)去:
# vi /etc/group
svn:*:3690:webadmin
然后,新建一個(gè)用戶svn。如果有必要,你還需創(chuàng)建所有要訪問倉庫系統(tǒng)的用戶帳號(hào)(如果他們還沒有創(chuàng)建)。要保證每個(gè)用戶是svn的成員并且有密碼和可用的shell。我使用sysinstall為新的網(wǎng)絡(luò)工程師建立用戶帳號(hào)。完成以后,我雙擊svn組的成員。大概像這樣:
# grep svn /etc/group
svn:*:3690:webadmin,devel1,devel2
處理 umask在安裝Subversion之前,我們先看看svn用戶的umask。在我的FreeBSD系統(tǒng)上,它是這樣的:
# su -l svn
% umask
022
在UNIX中,用戶umask值決定了新建目錄或文件的默認(rèn)權(quán)限。這是通過關(guān)閉某些權(quán)限達(dá)到的。如果你記得:
r = 4
w = 2
x = 1
你應(yīng)該看得出這個(gè)umask沒有對(duì)用戶(svn)關(guān)閉任何權(quán)限(0);它對(duì)組(svn)關(guān)閉了寫權(quán)限(2);它對(duì)其他組用戶關(guān)閉了寫權(quán)限(2)。
因?yàn)閟vn組的成員必須能夠?qū)懭雮}庫,所以把umask中關(guān)于組的 2 改為 0。甚至如果你不想讓其他組成員知道這個(gè)倉庫的存在,你可以把關(guān)于其他組成員的 2 改為 7。
修改用戶svn的shell配置比較簡(jiǎn)單。如果用戶使用 csh:
% vi ~svn/.cshrc
,那么找到umask那行并把它改為 002 或 007。如果你的svn用戶不用csh,修改你的shell配置文件。如果你把你的修改保存在 ~svn/.cshrc (或別的地方),別忘了告訴shell:
% source ~svn/.cshrc
再敲一次 umask 命令,以保證你的修改有效。
安裝Subversion ,并讓它擁有正確的umask
如果你選擇一個(gè)002的umask,那么當(dāng)你從ports collection生成Subversion的時(shí)候,你能把一個(gè)wrapper編譯進(jìn)去。如果你選擇一個(gè)007的umask或安裝已預(yù)編譯好的Subversion,那要?jiǎng)?chuàng)建一個(gè)wrapper腳本來保證你的Subversion二進(jìn)制文件使用你的umask值。
使用wrapper編譯,使其umask值為002:
# cd /usr/ports/devel/subversion
# make -DWITH_SVNSERVE_WRAPPER install clean
或者,你可以安裝已預(yù)編譯的二進(jìn)制代碼包
# pkg_add -r subversion
注意:無論使用何種方法,安裝之前都應(yīng)該把這篇文章看完!因?yàn)槟憧梢园l(fā)現(xiàn)一些額外的讓你感興趣的編譯選項(xiàng)!
如果你不在wrapper中編譯,請(qǐng)移動(dòng)你的代碼到相應(yīng)的位置,并創(chuàng)建你自己的wrapper腳本:
# mv /usr/local/bin/svn /usr/local/bin/svn.orig# vi /usr/local/bin/svn#!/bin/sh#wrapper script to set umask to 007 on subversion binariesumask 007/usr/local/bin/svn.orig "$@"
設(shè)置你的umask值為002或007,使它和syn用戶的umask值一樣。別忘了設(shè)置你的wrapper腳本為可執(zhí)行的:
# chmod +x /usr/local/bin/svn