【SVN】svn操作及權限設置

 

1、svnserve.conf
``SVN\conf\svnserve.conf`` 文件,是 svnserve.exe 這個服務器進程的配置文件。

首先,我們告訴 svnserve.exe,用戶名與密碼放在passwd.conf 文件下。當然,你可以改成任意的有效文件名,比如默認的就是

passwd::
password-db = passwd.conf

只允許經過驗證的用戶,方可訪問代碼庫。

anon-access = none
auth-access = write

告訴 svnserve.exe,項目目錄訪問權限的相關配置是放在 authz.conf 文件裏:

authz-db = authz.conf

svn 1.3.2 引入本功能的時候,系統默認使用 authz 而不是 authz.conf 作爲配置文件。

passwd.conf 和 authz.conf 兩個文件也可以作爲多個代碼庫共享使用,我們只要將它們放在公共目錄下,比如說放在 ``D:\svn`` 目錄下,然後在每個代碼庫的 svnserve.conf 文件中,使用如下語句::

password-db = ..\..\passwd.conf
authz-db = ..\..\authz.conf

或者::

password-db = ../../passwd.conf
authz-db = ../../authz.conf

這樣就可以讓多個代碼庫共享同一個用戶密碼、目錄控制配置文件,這在有些情況下是非常方便的。

2、authz.conf 之用戶分組

``SVN\conf\authz.conf``文件的配置段,可以分爲兩類

``[group]`` 是一類,裏面放置着所有用戶分組信息。

其餘以 ``[SVN:/]`` 開頭的是另外一類,每一段就是對應着項目的一個目錄,其目錄相關權限,就在此段內設置。

首先,我們將人員分組管理,以便以後由於人員變動而需要重新設置權限時候,儘量少改動東西。我們一共設置了5個用戶分組,分組名稱統一採用 ``g_`` 前綴,以方便識別。當然了,分組成員之間採用逗號隔開:

[groups]
# 任何想要查看所有文檔的非本部門人士
g_vip = morson

# 經理
g_manager = michael

# 北京辦人員
g_beijing = scofield

# 上海辦人員
g_shanghai = lincon

# 總部一般員工
g_headquarters = rory, linda

# 小祕,撰寫文檔
g_docs = linda

注意到沒有, linda 這個帳號同時存在“總部”和“文檔員”兩個分組裏面,這可不是我老眼昏花寫錯了,是因爲 Subversion 允許我這樣設置。它意味着,這個傢伙所擁有的權限,將會比他的同事rory 要多一些,這樣的確很方便。具體多了哪些呢?

3、authz.conf 之項目根目錄
接着,我們對項目根目錄做了限制,該目錄只允許SVN事業部的經理才能修改,其他人都只能眼巴巴的看着:

[SVN:/]
@g_manager = rw
* = r

- ``[SVN:/]`` 表示這個目錄結構的相對根節點,或者說是 SVN 項目的根目錄。其中的SVN 字樣,其實就是代碼庫的名稱,即前面用 svnadmin create命令創建出來的那個 SVN。
- 這裏的 ``@`` 表示接下來的是一個組名,不是用戶名。因爲目前 g_manager 組裏面只有一個 michael,你當然也可以將 ``@g_manager = rw`` 這一行替換成 ``michael = rw``,而表達的意義完全一樣。
- ``*`` 表示“除了上面提到的那些人之外的其餘所有人”,也就是“除了部門經理外的其他所有人”,當然也包括總經理那個怪老頭
- ``* = r`` 則表示“那些人只能讀,不能寫”

4、authz.conf 之項目子目錄
然後,我們要給總部人員開放日誌目錄的讀寫權限:

[SVN:/diary/headquarters]
@g_manager = rw
@g_headquarters = rw
@g_vip = r
* =

這個子目錄的設置有些特色,因爲從需求分析中我們知道,這個子目錄的權限範圍要比其父目錄小,它不允許除指定了的之外其他任何人訪問。

注意:

使用 ``/`` 來標識子目錄,爲了表示``diary\headquarters`` 這個目錄,我們必須使用 ``[SVN:/diary/headquarters]``這樣的格式。當然如果你一定要用 ``\`` ,那麼唯一的結果就是,Subversion 會將你的這部分設置置之不理,全當沒看到。

最後一行的 ``* =`` 表示,除了經理、總部人員、特別人士之外,任何人都被禁止訪問本目錄。這一行是否可以省略呢?不行,因爲 **權限具備繼承性** ,子目錄會自動擁有父目錄的權限。若沒有這一行,則所有帳號都可以讀取 ``/diary/headquarters`` 目錄下的文件。因爲雖然我們並沒有設置這個目錄的父目錄權限,可是默認的規則使得 ``/diary`` 目錄的權限與根目錄完全一樣,從而讓其餘帳號獲得對``/diary/headquarters`` 目錄的 r 權限。所以簡單來說, ``* =`` 這一句的目的,就是割斷權限繼承性,使得管理員可以定製某個目錄及其子目錄的權限,從而完全避開其父目錄權限設置的影響。

之所以這兒需要將 ``@g_vip = r`` 一句加上,就是因爲存在上述這個解釋。如果說你沒有明確地給總經理授予讀的權力,則他會和其他人一樣,被 ``* =`` 給排除在外。

各個配置行之間,沒有 **先後順序** 一說。也就是說,如果我將本段配置的 ``* =`` 這一行挪到最前面,完全不影響整個配置的最終效果。

[SVN:/ref]
@g_manager = rw
@g_docs = rw
* = r

這裏的主要看點,就是 g_docs 組裏麪包含了一個 linda 帳號,她也同時在 g_headquarters 組裏面出現,這就意味着, linda 將具備對 ``/ref`` 和 ``diary\headquarters`` 兩個目錄的讀寫權限。

6、authz.conf 之目錄表示法

在前面的描述中,我們都採用 ``[repos:/some/dir]`` 這樣的格式來表示項目的某個目錄,比如上一小節中的 ``[SVN:/diary/headquarters]`` 。而實際上,Subversion允許你採用 ```[/some/dir]`` 這樣的格式,即不指定代碼庫的方式來表示目錄,此時的目錄就匹配所有項目。
對於使用 svnserve 的用戶來說,只有當 svnserve 運行的時候使用了 ``-r`` 參數,並且讓多個代碼庫共享同一個目錄權限文件(即 authz.conf 或 authz)時,不指明代碼庫名稱纔有可能惹麻煩。一般情況下,我們對每個代碼庫都會獨立使用配置文件,畢竟每個項目的目錄結構,都有很大不同,混在一起意義不大。因此一般來說,爲簡潔起見,都可以不指明代碼庫名稱。本文全都指明瞭代碼庫名稱,主要是爲了將來擴展成同一個配置文件,以方便配合 Apache 服務器。
對於使用 Apache 的用戶來說,它們二者可有着很大的不同,因爲此時往往習慣於使用一個公共的目錄權限配置文件。如果你使用了 SVNParentPath 指令,則指定版本庫的名字是很重要的,因爲假若你使用後者,那麼 ``[/some/dir]`` 部分就會與所有代碼庫項目的``[/some/dir]`` 目錄匹配。如果你使用 SVNPath 指令,則這兩種表示方式就沒有什麼區別了,畢竟只有一個版本庫。

7、authz.conf 的其他注意點

7.1. 父目錄的 ``r`` 權限,對子目錄 ``w`` 權限的影響

把這個問題專門提出來,是因爲在1.3.1及其以前的版本里面,有個bug,即某個帳號爲了對某個子目錄具備寫權限,則必須對其父目錄具備讀權限。因此現在使用了1.3.2及其更高的版本,就方便了那些想在一個代碼庫存放多個相互獨立的項目的管理員,來分配權限了。比如說央舜公司建立一個大的代碼庫用於存放所有員工日誌,叫做 diary,而SVN事業部只是其中一個部門,則可以這樣做:

[diary:/]
@g_chief_manager = rw

[diary:/SVN]
@g_SVN_manager = rw
@g_SVN = r

這樣,對於所有SVN事業部的人員來說,就可以將svn://192.168.0.1/diary/SVN 這個URL當作根目錄來進行日常操作,而完全不管它其實只是一個子目錄,並且當有少數好奇心比較強的人想試着 checkout 一下 svn://192.168.0.1/diary 的時候,馬上就會得到一個警告“Access denied”,哇,太酷了。

7.2. 默認權限

如果說我對某個目錄不設置任何權限,會怎樣?馬上動手做個試驗,將::

[diary:/]
@g_chief_manager = rw

改成::

[diary:/]
# @g_chief_manager = rw

這樣就相當於什麼都沒有設置。在我的 svn 1.3.2 版本上,此時是禁止任何訪問。也就是說,如果你想要讓某人訪問某目錄,你一定要顯式指明這一點。這個策略,看起來與防火牆的策略是一致的。

7.3. 只讀權限帶來的一個小副作用

若設置了::

[SVN:/diary]
* = r

則 Subversion 會認爲,任何人都不允許改動diary 目錄,包括刪除、 **改名** ,和 **新增** 。

也就是說,如果你在項目初期創建目錄時候,一不小心寫錯目錄名稱,比如因拼寫錯誤寫成 dairy,以後除非你改動 authz.conf 裏面的這行設置,否則無法利用 svn mv 命令將錯誤的目錄更正。

7.4. anon-access 屬性對目錄權限的影響

       你想將你的代碼庫開放給所有人訪問,於是你就開放了匿名訪問權限,在 svnserve.conf 文件中添加一行: ``anon-access=read``。可是對於部分目錄,你又不希望別人看到,於是針對那些特別目錄,你在 authz.conf 裏面進行配置,添加了授權訪問的人,並添加了 ``* =`` 標記。你認爲一切OK了,可是你缺發現,那個特別目錄卻無法訪問了,總是提示 ``Not authorized to open root of edit operation`` 或者 ``未授權打開根進行編輯操作`` 。你再三檢查你配置的用戶名與密碼,確認一切正確,還是無法解決問題。

       原來,Subversion 有個小 bug ,當 ``anon-access=read`` 並且某個目錄有被設置上 ``* =`` 標記,則會出現上述問題。這個 bug 在當前最新版本上(v1.4)還存在,也許在下一版本內可以被改正吧。

解決的辦法是,在 svnserve.conf 中,將anon-access 設置成 none 。


8、改進,對中文目錄的支持
       上午上班的時候,Morson 來到 Michael 的桌子前面,說道:“你是否可以將我們的北京辦、上海辦目錄,改成用中文的,看着那些拼音我覺得很難受?”Michael 心想,還好這兩天剛瞭解了一些與 unicode 編碼相關的知識,於是微笑地回答:“當然可以,你明天下午就可以看到中文目錄名稱了。”

8.1. 使用 svn mv 指令,將原來的一些目錄改名並commit 入代碼庫,改名後的目錄結構如下::

SVN
├─工作日誌
│ ├─總部人員
│ ├─北京辦
│ └─上海辦
├─公司公共文件參考目錄
└─臨時文件存放處

8.2. 修改代碼庫的 authz.conf 文件,將相應目錄逐一改名

8.3. UTF-8 格式的 authz.conf 文件,以及BOM

將配置文件轉換成 UTF-8 格式之後,Subversion 就能夠正確識別中文字符了。但是這裏需要注意一點,即必須保證 UTF-8 文件不包含 BOM 。BOM是 Byte Order Mark 的縮寫,指 UNICODE文件頭部用於指明高低字節排列順序的幾個字符,通常是 ``FF FE`` ,而將之用 UTF-8 編碼之後,就是 ``EF BB BF`` 。由於 UTF-8 文件本身不存在字節序問題,所以對 UTF-16 等編碼方式有重大意義的 BOM,對於 UTF-8 來說,只有一個作用——表明這個文件是 UTF-8 格式。由於 BOM 會給文本處理帶來很多難題,所以現在很多軟件都要求使用不帶 BOM 的 UTF-8 文件,特別是一些處理文本的軟件,如 PHP、 UNIX 腳本文件等,svn 也是如此。

目前常用的一些文本編輯工具中,MS Windows 自帶的“記事本”裏面,“另存爲”菜單保存出來的 UTF-8 格式文件,會自動帶上 BOM 。新版本 UltraEdit 提供了選項,允許用戶選擇是否需要 BOM,而老版本的不會添加 BOM。請各位查看一下自己常用的編輯器的說明文件,看看它是否支持這個功能。

對於已經存在 BOM 的 UTF-8 文件,比如說就是微軟“記事本”弄出來的,我們可以利用UltraEdit 來將 BOM 去掉。方法是,首先利用“UTF-8TO ASCII”菜單將文件轉換成本地編碼,通常是GB2312碼,然後再使用“ASCII TO UTF-8(UNICODE Editing)”來轉換到 UTF-8 即可。當然,這麼操作之前,你肯定得先保證,你的 UltraEdit 保存出來的 UTF-8 文件的確是不帶 BOM 的。

補充:在實際使用過程中,上訴賦權存在一些問題。解決辦法:直接給每個用戶賦權

[groups]

[/]
# 表示admin有讀寫的權限
admin=rw
# 用*=r表示其他人只能讀或用*=表示其他人沒有權限
*=
# 此處注意是/BHPP/BHPPB,和創建的文件結構對應,如果不對應會造成只有根目錄中
# 的配置有效,其他的提示權限不夠的錯誤
[/BHPP/BHPPB]
admin=rw
*=

[/BHPP/BHPPH]
admin=rw
*=

[/BHPP/BHPPB/frame]
admin=rw
ls=rw
*=

[/BHPP/BHPPB/docmngt]
admin=rw
ls=rw
*=

[/BHPP/BHPPB/fwebcommon]
admin=rw
ls=rw
*=

[/BHPP/BHPPB/bcommon]
admin=rw
ls=rw
*=

[/BHPP/BHPP/BHPPB/rsserver]
admin=rw
cyq=rw
*=

[/BHPP/BHPPB/cmeramngt]
admin=rw
cxx=rw
*=

[/BHPP/BHPPB/hrmngt]
admin=rw
mg=rw
*=

[/BHPP/BHPPB/finmngt]
admin=rw
lh=rw
*=

[/BHPP/BHPPB/assembly]
admin=rw
zs=rw
*=
啓動SVN:
svnserve -d -r /var/svn/svnrepos

停止SVN:
killall svnserve

查看SVN:
ps -ef |grep svn

執行查看端口號是否監聽:
netstat -an

測試遠程主機端口是否打開:
telnet ip  端口號 

後續問題:show log無法顯示日誌,上面的時間會自動在2016年和1970年間跳,而且設置不了時間。

解決方法:
1、編輯svnserve.conf,設置

anon-access=none

2、在authz中添加 

[/]
* = 

3、清理svn的cache

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章