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