SVN可以配置多種方式進行訪問,但在公司內部搭建的svn服務器,如果僅僅在局域網里訪問的話,總感覺用svn協議要比http協議來得效率高些,所以,一般總是用svnserve來啟動svn的服務。一般而言,如果是從svn 1.2或1.3的版本開始使用的人,總以為svn協議只能配置到倉庫的權限控制,而不能針對目錄進行權限控制,即使看到其authz示例文件中有如下的內容:
#?
[
repository:/baz/fuz
]
#?@harry_and_sally?
=
?rw
#?*?
=
?r
但謹守其自帶文檔Chapter 6中關于svnserve一節的教導:
Notice that svnserve only understands “blanket” access control. A user either has universal read/write access , universal read access, or no access. There is no detailed control over access to specific paths within the repository. For many projects and sites , this level of access control is more than adequate. However , if you need per-directory access control , you'll need to use either use Apache with mod_authz_svn (see the section called “Per-Directory Access Control”) or use a pre-commit hook script to control write access (see the section called “Hook Scripts”).
一般還是不會多去研究,只當作是結合Apache來進行面向目錄的權限控制文件示例。
其實,心里一直對這種方式有個小疙瘩,最近又要開一個新項目的代碼庫,雖然實際上對代碼的訪問控制也沒有特別的要求,但心想既然authz文件里有關于目錄的設置,是不是能嘗試一下,用svnserve也能進行目錄權限的控制呢。于是到網上搜了一下,omg,這個功能竟然早在1.3的時候就已經實現了,對其詳盡而完整的描述來自Michael的這篇Subversion之路--實現精細的目錄訪問權限控制?,其中的幾個要點包括:
??? 1. svnserve支持面向目錄的訪問控制了;
??? 2. 權限具備繼承性,所以需要用"* = "的形式來禁止未授權的用戶訪問特定子目錄;
??? 3. svn 1.3.2及以后的版本允許對子目錄進行操作而無需父目錄的讀權限;
??? 4. 如果是中文目錄的話,authz必須以utf-8的格式保存,且不能帶BOM,而windows自帶的記事本按utf-8保存的文件則會加上BOM,所以,如果你以utf-8格式保存好后,提交代碼時,svn報"section header expected"的錯時,則多半是帶BOM的。當然現在很多編輯器都能很方便的轉換了,如ultraedit的保存為U8-DOS,editplus保存為utf-8,以及開源的Notepad++的格式轉換中的“轉換為utf-8碼(無BOM)”等都可以完成這個工作。
無論如何,這總算解開了我心中的一個小疑團,所以,即使軟件自帶的文檔,往往也不是絕對的權威(叫我還能相信誰:-( ,在svn 1.4.2版本中帶的文檔,還是針對1.3的)。不過Subversion Book網站上提供的針對svn 1.4的nightly版本已經很明確的講解了這一部分的內容了。