廈門(mén)央瞬公司是一家電子元器件設備供應商,其中有個(gè)ARM部門(mén),專(zhuān)門(mén)負責ARM芯片的方案設計、銷(xiāo)售,并在北京、上海各設立了一個(gè)辦事處。對于工作日志,原先采用郵件方式發(fā)給經(jīng)理,但是這種方式有個(gè)缺點(diǎn),那就是不具備連續性,要看以前的日志必須一封一封郵件去查看,很麻煩。于是就想到利用 Subversion, 讓員工在自己電腦上編輯日志,然后利用svn傳送回來(lái),既方便員工自己編寫(xiě)日志,又方便對日志的歸檔處理,而且提交日志的時(shí)候只需要執行一下 svn update 即可,比發(fā)送郵件還要簡(jiǎn)單的多。
svn服務(wù)器相關(guān)信息
arm部門(mén)文檔的目錄結構如下:
arm 部門(mén)名稱(chēng)
├─diary 工作日志目錄
│ ├─headquarters 總部工作日志目錄
│ ├─beijing 北京辦日志目錄
│ └─shanghai 上海辦日志目錄
├─ref 公司公共文件參考目錄
└─temp 臨時(shí)文件目錄
人員情況
訪(fǎng)問(wèn)權限需求分析
在服務(wù)器 D:\svn 目錄下,建立 arm 代碼庫,命令如下:
D:\svn>svnadmin create arm
在客戶(hù)機 F:\temp 目錄下,建立好上述目錄結構
用命令 F:\temp>svnimportarmsvn://192.168.0.1/arm 導入結構
【注意點(diǎn):關(guān)于導入時(shí)候的細微差別】
編輯代碼庫 arm\conf\svnserve.conf 文件,如下:
[general] password-db = passwd.conf anon-access = none auth-access = write authz-db = authz.conf
新建代碼庫 arm\conf\passwd.conf 文件,如下:
[users] morson = ShowMeTheMoney michael = mysecretpassword scofield = hellolittilekiller lincon = asyouknows111 rory = 8809117 linda = IlikeWorldCup2006
新建代碼庫 arm\conf\authz.conf 文件,內容如下:
[groups] g_vip = morson g_manager = michael g_beijing = scofield g_shanghai = lincon g_headquarters = rory, linda g_docs = linda [arm:/] @g_manager = rw * = r [arm:/diary/headquarters] @g_manager = rw @g_headquarters = rw @g_vip = r * = [arm:/diary/beijing] @g_manager = rw @g_beijing = rw @g_vip = r * = [arm:/diary/shanghai] @g_manager = rw @g_shanghai = rw @g_vip = r * = [arm:/ref] @g_manager = rw @g_docs = rw * = r [arm:/temp] * = rw
在服務(wù)器上,打開(kāi)一個(gè) DOS Prompt 窗口,輸入如下指令:
svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117
我們應該得到如下目錄結構:
arm ├─diary │ └─headquarters ├─ref └─temp
然后修改ref目錄下任意文件并提交,服務(wù)器將會(huì )報錯“Access deni”
本章將詳細介紹前一章所涉及的兩個(gè)配置文件, svnserve.conf 和 authz.conf,通過(guò)對配置逐行的描述,來(lái)闡明其中的一些細節含義。
這里首先要注意一點(diǎn),任何配置文件的有效配置行,都不允許存在前置空格,否則程序會(huì )無(wú)法識別。也就是說(shuō),如果你直接從本文的純文本格式中拷貝了相關(guān)的配置行過(guò)去,需要手動(dòng)將前置的4個(gè)空格全部刪除。當然了,如果你覺(jué)得一下子要刪除好多行的同樣數目的前置空格是一件苦差使,那么也許 UltraEdit 的“Column Mode”編輯模式,可以給你很大幫助呢。
arm\conf\svnserve.conf 文件,是 svnserve.exe 這個(gè)服務(wù)器進(jìn)程的配置文件,我們逐行解釋如下。
首先,我們告訴 svnserve.exe,用戶(hù)名與密碼放在 passwd.conf 文件下。當然,你可以改成任意的有效文件名,比如默認的就是 passwd:
password-db = passwd.conf
接下來(lái)這兩行的意思,是說(shuō)只允許經(jīng)過(guò)驗證的用戶(hù),方可訪(fǎng)問(wèn)代碼庫。 那么哪些是“經(jīng)過(guò)驗證的”用戶(hù)呢?噢,當然,就是前面說(shuō)那些在 passwd.conf 文件里面持有用戶(hù)名密碼的家伙。這兩行的等號后面,目前只允許 read write none 三種值,你如果想實(shí)現一些特殊的值,比如說(shuō)“read-once”之類(lèi)的,建議你自己動(dòng)手改源代碼,反正它也是自由軟件:
anon-access = none auth-access = write
接下來(lái)就是最關(guān)鍵的一句呢,它告訴 svnserve.exe,項目目錄訪(fǎng)問(wèn)權限的相關(guān)配置是放在 authz.conf 文件里:
authz-db = authz.conf
當然,svn 1.3.2 引入本功能的時(shí)候,系統默認使用 authz 而不是 authz.conf 作為配置文件。不過(guò)由于鄙人是處女座的,有著(zhù)強烈的完美主義情結,看著(zhù) svnserve.conf 有后綴而 passwd 和 authz 沒(méi)有就是不爽,硬是要改了。
arm\conf\authz.conf 文件的配置段,可以分為兩類(lèi),``[group]`` 是一類(lèi),里面放置著(zhù)所有用戶(hù)分組信息。其余以 [arm:/] 開(kāi)頭的是另外一類(lèi),每一段就是對應著(zhù)項目的一個(gè)目錄,其目錄相關(guān)權限,就在此段內設置。
首先,我們將人員分組管理,以便以后由于人員變動(dòng)而需要重新設置權限時(shí)候,盡量少改動(dòng)東西。我們一共設置了5個(gè)用戶(hù)分組,分組名稱(chēng)統一采用 g_ 前綴,以方便識別。當然了,分組成員之間采用逗號隔開(kāi):
[groups] # 任何想要查看所有文檔的非本部門(mén)人士 g_vip = morson # 經(jīng)理 g_manager = michael # 北京辦人員 g_beijing = scofield # 上海辦人員 g_shanghai = lincon # 總部一般員工 g_headquarters = rory, linda # 小秘,撰寫(xiě)文檔 g_docs = linda
注意到?jīng)]有, linda 這個(gè)賬號同時(shí)存在“總部”和“文檔員”兩個(gè)分組里面,這可不是我老眼昏花寫(xiě)錯了,是因為 svnserve.exe 允許我這樣設置。它意味著(zhù),這個(gè)家伙所擁有的權限,將會(huì )比他的同事 rory 要多一些,這樣的確很方便。具體多了哪些呢?請往下看!
接著(zhù),我們對項目根目錄做了限制,該目錄只允許arm事業(yè)部的經(jīng)理才能修改,其他人都只能眼巴巴的看著(zhù):
[arm:/] @g_manager = rw * = r
然后,我們要給總部人員開(kāi)放日志目錄的讀寫(xiě)權限:
[arm:/diary/headquarters] @g_manager = rw @g_headquarters = rw @g_vip = r * =
現在來(lái)看看
好了,我們現在掌握了“繼承”的威力,它讓我們節省了不少敲鍵盤(pán)的時(shí)間??墒乾F在又有一個(gè)問(wèn)題了,
屬性具備覆蓋性質(zhì)子目錄若設置了屬性,則完全覆蓋父目錄。
把這個(gè)問(wèn)題專(zhuān)門(mén)提出來(lái),是因為在1.3.1及其以前的版本里面,有個(gè)bug,即為了子目錄的寫(xiě)權限,項目首目錄必須具備讀權限。因此現在使用了1.3.2版本,就方便了那些想在一個(gè)代碼庫存放多個(gè)相互獨立的項目的管理員,來(lái)分配權限了。比如說(shuō)央舜公司建立一個(gè)大的代碼庫用于存放所有員工日志,叫做 diary,而arm事業(yè)部只是其中一個(gè)部門(mén),則可以這樣做:
[diary:/] @g_chief_manager = rw [diary:/arm] @g_arm_manager = rw @g_arm = r
這樣,對于所有arm事業(yè)部的人員來(lái)說(shuō),就可以將 svn://192.168.0.1/diary/arm 這個(gè)URL當作根目錄來(lái)進(jìn)行日常操作,而完全不管它其實(shí)只是一個(gè)子目錄,并且當有少數好奇心比較強的人想試著(zhù) checkout 一下 svn://192.168.0.1/diary 的時(shí)候,馬上就會(huì )得到一個(gè)警告“Access deni”,哇,太酷了。
如果說(shuō)我對某個(gè)目錄不設置任何權限,會(huì )怎樣?馬上動(dòng)手做個(gè)試驗,將:
[diary:/] @g_chief_manager = rw
改成:
[diary:/] # @g_chief_manager = rw
這樣就相當于什么都沒(méi)有設置。在我的 svn 1.3.2 版本上,此時(shí)是禁止任何訪(fǎng)問(wèn)。也就是說(shuō),如果你想要讓某人訪(fǎng)問(wèn)某目錄,你一定要顯式指明這一點(diǎn)。這個(gè)策略,看起來(lái)與防火墻的策略是一致的。
若設置了:
[arm:/diary] * = r
則svnserve認為,任何人,都不允許改動(dòng)diary目錄,包括刪除和改名,和新增。
也就是說(shuō),如果你在項目初期創(chuàng )建目錄時(shí)候,一不小心寫(xiě)錯目錄名稱(chēng),比如因拼寫(xiě)錯誤寫(xiě)成 dairy,以后除非你改動(dòng) authz.conf 里面的這行設置,否則無(wú)法利用 svn mv 命令將錯誤的目錄更正。
上午上班的時(shí)候,Morson 來(lái)到 Michael 的桌子前面,說(shuō)道:“你是否可以將我們的北京辦、上海辦目錄,改成用中文的,看著(zhù)那些拼音我覺(jué)得很難受?” Michael 心想,還好這兩天剛了解了一些與 unicode 編碼相關(guān)的知識,于是微笑地回答:“當然可以,你明天下午就可以看到中文目錄名稱(chēng)了。”
使用 svn mv 指令,將原來(lái)的一些目錄改名并 commit 入代碼庫,改名后的目錄結構如下:
arm
├─工作日志
│ ├─總部人員
│ ├─北京辦
│ └─上海辦
├─公司公共文件參考目錄
└─臨時(shí)文件存放處
修改代碼庫的 authz.conf 文件,將相應目錄逐一改名
使用 UltraEdit 將 authz.conf 文件轉換成不帶 BOM 的 UTF-8 格式
將配置文件轉換成 UTF-8 格式之后,Subversion 就能夠正確識別中文字符了。但是這里需要注意一點(diǎn),即必須保證 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的縮寫(xiě),指 UNICODE 文件頭部用于指明高低字節排列順序的幾個(gè)字符,通常是 FFFE ,而將之用 UTF-8 編碼之后,就是 EFBBBF 。由于 UTF-8 文件本身不存在字節序問(wèn)題,所以對 UTF-16 等編碼方式有重大意義的 BOM,對于 UTF-8 來(lái)說(shuō),只有一個(gè)作用——表明這個(gè)文件是 UTF-8 格式。由于 BOM 會(huì )給文本處理帶來(lái)很多難題,所以現在很多軟件都要求使用不帶 BOM 的 UTF-8 文件,特別是一些處理文本的軟件,如 PHP、 UNIX 腳本文件等,svn 也是如此。
目前常用的一些文本編輯工具中,MS Windows 自帶的“記事本”里面,“另存為”菜單保存出來(lái)的 UTF-8 格式文件,會(huì )自動(dòng)帶上 BOM 。新版本 UltraEdit 提供了選項,允許用戶(hù)選擇是否需要 BOM,而老版本的不會(huì )添加 BOM。請各位查看一下自己常用的編輯器的說(shuō)明文件,看看它是否支持這個(gè)功能。
利用 UltraEdit ,我們可以將 BOM 去掉。方法是,首先利用“UTF-8 TO ASCII”菜單將文件轉換成本地編碼,通常是GB2312碼,然后再使用“ASCII TO UTF-8(UNICODE Editing)”來(lái)轉換到 UTF-8 即可。
作者:鄭新星
聯(lián)系客服