### 第7章高級主題
**目錄**
如果你是從頭到尾按章節閱讀本書,你一定已經具備了使用Subversion客戶端執行大多數不同的版本控制操作足夠的知識,你理解了怎樣從Subversion版本庫取出一個工作拷貝,你已經熟悉了通過**svn commit**和**svn update**來提交和接收修改,你甚至也經常下意識的使用**svn status**,無論目的是什么,你已經可以正常使用Subversion了。
但是Subversion的特性集可不只是“一般的版本控制操作”。
本章重點介紹一些Subversion不常用的特性,在這里,我們會討論Subversion的屬性(或者說“元數據”)支持,和如何通過更改運行配置區來改變Subversion的缺省行為方式,我們會描述怎樣使用外部定義來指導Subversion從多個版本庫得到數據,我們會覆蓋一些Subversion分發版本附加的客戶端和服務器端的工具的細節。
在閱讀本章之前,你一定要熟悉Subversion對文件和目錄的基本版本操作能力,如果你還沒有閱讀這些內容,或者是需要一個復習,我們建議你重讀[第2章 *基本概念*]和[第3章 *指導教程*],一旦你已經掌握了基礎知識和本章的內容,你會變成Subversion的超級用戶!
### 運行配置區
Subversion提供了許多用戶可以控制的可選行為方式,許多是用戶希望添加到所有的Subversion操作中的選項,為了避免強制用戶記住命令行參數并且在每個命令中使用,Subversion使用配置文件,并且將配置文件保存在獨立的Subversion配置區。
Subversion*配置區*是一個雙層結構,保存了可選項的名稱和值。通常,Subversion配置區是一個保存*配置文件*的特殊目錄(第一層結構),目錄中保存了一些標準INI格式的文本文件(文件中的“section”形成第二層結構)。這些文件可以簡單用你喜歡的文本編輯器編輯(如Emacs或vi),而且保存了客戶端可以讀取的指示,用來指導用戶的一些行為選項。
### 配置區布局
**svn**命令行客戶端第一次執行時,會創建一個用戶配置區,在類Unix系統中,配置區位于用戶主目錄中,名為`.subversion`。在Win32系統,Subversion創建一個名為`Subversion`的目錄,這個目錄通常位于用戶配置目錄(順便說一句,通常是一個隱藏目錄)的`Application Data`子目錄下。然而,在Win32平臺上,此目錄的具體位置在不同的系統上是不一樣的,由Windows注冊表決定。 我們以Unix下的名字`.subversion`來表示用戶配置區。
除了用戶配置區,Subversion也提供了系統配置區,通過系統配置區,系統管理員可以為某個機器的所有用戶建立缺省配置值。注意系統配置區不會規定強制性的策略―每個用戶配置區都可以覆蓋系統配置區中的配置項,而**svn**的命令行參數決定了最后的行為。在類Unix的平臺上,系統配置區位于`/etc/subversion`目錄下,在Windows平臺上,系統配置區位于`Application Data`(再說一次,是由Windows注冊表決定的)的`Subversion`目錄中。與用戶配置區不同,**svn**不會試圖創建系統配置區。
目前,Subversion的配置區包含三個文件―兩個配置文件(`config`和`servers`),和一個INI文件格式的`README.txt`描述文件。配置文件創建的時候,Subversion的選項都設置為默認值。配置文件中的選項都按功能劃分成組,大多數選項還有詳細的文字描述注釋,說明這些選項的值對Subversion的主要影響。要修改選項,只需用文本編輯器打開并編輯配置文件。如果想要恢復缺省的配置,可以直接刪除(或者重命名)配置目錄,并且運行一些如**svn --version**之類的無關緊要的**svn**命令,一個包含缺省值的新配置目錄就會創建起來。
用戶配置區也緩存了認證信息,`auth`目錄下的子目錄中緩存了一些Subversion支持的各種認證方法的信息,這個目錄需要相應的用戶權限才可以訪問。
### 配置和Windows注冊表
除了基于INI文件的配置區,運行在Windows平臺的Subversion客戶端也可以使用Windows注冊表來保存配置數據。注冊表中保存的選項名稱和值的含義與INI文件中相同,“file/section”在注冊表中表現為注冊表鍵樹的層級,使得雙層結構得以保留下來。
Subversion的系統配置值保存在鍵`HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion`下。舉個例子,`global-ignores`選項位于`config`文件的`miscellany`小節,在Windows注冊表中,則位于`HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Config\Miscellany\global-ignores`。用戶配置值存放在`HKEY_CURRENT_USER\Software\Tigris.org\Subversion`下。
基于注冊表的配置項在基于文件的配置項*之前*解析,所以其配置項的值會被配置文件中相同配置項的值覆蓋,換句話說,在Windows系統下配置項的優先級是:
1.
命令行選項
1.
用戶INI配置文件
1.
用戶注冊表值
1.
系統INI配置文件
1.
系統注冊表值
此外,雖然Windows注冊表不支持“注釋掉”這種概念,但是Subversion會忽略所有以井號(`#`)開始的字符,這允許你快速的取消一個選項而不需要刪除整個注冊表鍵,明顯簡化了恢復選項的過程。
**svn**命令行客戶端不會嘗試寫Windows注冊表,也不會在注冊表中創建默認配置區。不過可以使用**REGEDIT**創建所需的鍵。此外,還可以創建一個`.reg`文件,并在文件瀏覽器中雙擊這個文件,文件中的數據就會合并到注冊表中。
**例7.1.注冊表條目(.reg)樣本文件。**
~~~
REGEDIT4
[HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Servers\groups]
[HKEY_LOCAL_MACHINE\Software\Tigris.org\Subversion\Servers\global]
"#http-proxy-host"=""
"#http-proxy-port"=""
"#http-proxy-username"=""
"#http-proxy-password"=""
"#http-proxy-exceptions"=""
"#http-timeout"="0"
"#http-compression"="yes"
"#neon-debug-mask"=""
"#ssl-authority-files"=""
"#ssl-trust-default-ca"=""
"#ssl-client-cert-file"=""
"#ssl-client-cert-password"=""
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auth]
"#store-auth-creds"="no"
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\helpers]
"#editor-cmd"="notepad"
"#diff-cmd"=""
"#diff3-cmd"=""
"#diff3-has-program-arg"=""
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"#global-ignores"="*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store"
"#log-encoding"=""
"#use-commit-times"=""
"#template-root"=""
"#enable-auto-props"=""
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\tunnels]
[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auto-props]
~~~
上面例子里顯示的`.reg`文件中,包含了一些最常用的配置選項和它們的缺省值。注意,上面的例子中不僅包含了系統設置(關于網絡代理相關的選項),也包含了用戶設置(指定的編輯器程序,是否保存密碼,以及其它選項)。同時要注意的是,所有選項都注釋掉了,要啟用其中的選項,只需刪除該選項名稱前面的井號(`#`),然后設置相應的值就可以了。
### 配置選項
本節我們會詳細討論Subversion目前支持的運行配置選項。
#### 服務器
`servers`文件保存了Subversion關于網絡層的配置選項,這個文件有兩個特別的小節:`groups` 和`global`。`groups`小節是一個交叉引用表,其中的關鍵字是`servers`文件中其它小節的名字,值則是一個可以包含通配符的字符序列,對應于接收Subversion請求的主機名,稱為glob。
~~~
[groups]
beanie-babies = *.red-bean.com
collabnet = svn.collab.net
[beanie-babies]
…
[collabnet]
…
~~~
當通過網絡訪問Subversion服務器時,客戶端會設法匹配正在嘗試連接的服務器名字和`groups`小節中的glob名稱,如果發現匹配,Subversion會在`servers`文件中查找對應于這個glob名稱的小節,并從該小節中去讀取真實的網絡配置設置。
如果沒有能夠匹配到`groups`中的glob名稱,`global`小節中的選項就會發生作用。`global`小節中的選項與其他小節一樣(當然是除了`groups`小節),這些選項是:
`http-proxy-host`
代理服務器的詳細主機名,是HTTP為基礎的Subversion請求必須通過的,缺省值為空,意味著Subversion不會嘗試通過代理服務器進行HTTP請求,而會嘗試直接連接目標機器。
`http-proxy-port`
代理服務器的詳細端口,缺省值為空。
`http-proxy-username`
代理服務器的用戶名,缺省值為空。
`http-proxy-password`
代理服務器的密碼,缺省為空。
`http-timeout`
等待服務器響應的時間,以秒為單位,如果你的網絡速度較慢,導致Subversion的操作超時,你可以加大這個數值,缺省值是`0`,意思是讓HTTP庫Neon使用自己的缺省值。
`http-compression`
這說明是否在與設置好DAV的服務器通訊時使用網絡壓縮請求,缺省值是`yes`(盡管只有在這個功能編譯到網絡層時壓縮才會有效),設置`no`來關閉壓縮,如調試網絡傳輸時。
`neon-debug-mask`
只是一個整形的掩碼,底層的HTTP庫Neon用來選擇產生調試的輸出,缺省值是`0`,意思是關閉所有的調試輸出,關于Subversion使用Neon的詳細信息,見[第8章 *開發者信息*]。
`ssl-authority-files`
這是一個分號分割的路徑和文件列表,這些文件包含了Subversion客戶端在用HTTPS訪問時可以接受的認證授權(或者CA)證書。
`ssl-trust-default-ca`
如果你希望Subversion可以自動相信OpenSSL攜帶的缺省的CA,可以設置為`yes`。
`ssl-client-cert-file`
如果一個主機(或是一些主機)需要一個SSL客戶端證書,你會收到一個提示說需要證書的路徑。通過設置這個路徑你的Subversion客戶端可以自動找到你的證書而不會打擾你。沒有標準的存放位置;Subversion會從任何你指定的路徑得到這個文件。
`ssl-client-cert-password`
如果你的SSL客戶端證書文件是用密碼加密的,Subversion會在每次使用證書時請你輸入密碼,如果你發現這很討厭(并且不介意把密碼存放在`servers`文件中),你可以設置這個參數為證書的密碼,這樣就不會再收到密碼輸入提示了。
#### config
其它的Subversion運行選項保存在`config`文件中,這些運行選項與網絡連接無關,只是一些正在使用的選項,但是為了應對未來的擴展,也按小節劃分成組。
`auth`小節保存了Subversion相關的認證和授權的設置,它包括:
`store-passwords`
這告訴Subversion是否緩存服務器認證要求時用戶提供的密碼,缺省值是`yes`。設置為`no`可以關閉在存盤的密碼緩存,你可以通過**svn**的`--no-auth-cache`命令行參數(那些支持這個參數的子命令)來覆蓋這個設置,詳細信息請見[“客戶端憑證緩存”一節]。
`store-auth-creds`
這個設置與`store-passwords`相似,不過設置了這個選項將會保存*所有*認證信息,如用戶名、密碼、服務器證書,以及其他任何類型的可以緩存的憑證。
`helpers`小節控制完成Subversion任務的外部程序,正確的選項包括:
`editor-cmd`
Subversion在提交操作時用來詢問用戶日志信息的程序,例如使用**svn commit**而沒有指定`--message`(`-m`)或者`--file`(`-F`)選項。這個程序也會與**svn propedit**一起使用―一個臨時文件跳出來包含已經存在的用戶希望編輯的屬性,然后用戶可以對這個屬性進行編輯(見[“屬性”一節]),這個選項的缺省值為空,如果這個選項沒有設置,Subversion會依次檢查環境變量`SVN_EDITOR`、`VISUAL`和`EDITOR`(這個順序)來找到一個編輯器命令。
`diff-cmd`
這個命令是比較程序的絕對路徑,當Subversion生成了“diff”輸出時(例如當使用**svn diff**命令)就會使用,缺省Subversion會使用一個內置的比較庫―設置這個參數會強制它使用外部程序執行這個任務。
`diff3-cmd`
這指定了一個三向的比較程序,Subversion使用這個程序來合并用戶和從版本庫接受的修改,缺省Subversion會使用一個內置的比較庫―設置這個參數會導致它會使用外部程序執行這個任務。
`diff3-has-program-arg`
如果`diff3-cmd`選項設置的程序接受一個`--diff-program`命令行參數,這個標記必須設置為`true`。
`tunnels`小節允許你定義一個**svnserve**和`svn://`客戶端連接使用的管道模式,更多細節見[“SSH認證和授權”一節]。
`miscellany`小節是一些沒法歸到別處的選項。 在本小節,你會找到:
`global-ignores`
當運行**svn status**命令時,Subversion會和版本化的文件一樣列出未版本化的文件和目錄,并使用``字符(見see [“**svn status**”一節](# "svn status"))標記,有時候察看無關的未版本化文件會很討厭―比如程序編譯產生的對象文件―的顯示出來。`global-ignores`選項是一個空格分隔的列表,用來描述Subversion在它們版本化之前不想顯示的文件和目錄,缺省值是`*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store`。
就像**svn status**,**svn add**和**svn import**命令也會忽略匹配這個列表的文件,你可以用單個的`--no-ignore`命令行參數來覆蓋這個選項,關于更加細致的控制忽略的項目,見[“`svn:ignore`”一節]。
`enable-auto-props`
這里指示Subversion自動對新加的或者導入的文件設置屬性,缺省值是`no`,可以設置為`yes`來開啟自動添加屬性,這個文件的`auto-props`小節會說明哪些屬性會被設置到哪些文件。
`log-encoding`
這個變量設置提交日志缺省的字符集,是`--encoding`選項(見[“**svn**選項”一節])的永久形式,Subversion版本庫保存了一些UTF8的日志信息,并且假定你的日志信息是用操作系統的本地編碼,如果你提交的信息使用別的編碼方式,你一定要指定不同的編碼。
`use-commit-times`
通常你的工作拷貝文件會有最后一次被進程訪問的時間戳,不管是你自己的編輯器還是用**svn**子命令。這通常對人們開發軟件提供了便利,因為編譯系統通常會通過查看時間戳來決定那些文件需要重新編譯。
在其他情形,有時候如果工作拷貝的文件時間戳反映了上一次在版本庫中更改的時間會非常好,**svn export**命令會一直放置這些“上次提交的時間戳”放到它創建的目錄樹。通過設置這個config參數為`yes`,**svn checkout**、**svn update**、 **svn switch**和**svn revert**命令也會為它們操作的文件設置上次提交的時間戳。
`auto-props`小節控制Subversion客戶端自動設置提交和導入的文件的屬性的能力,它可以包含任意數量的鍵-值對,格式是`PATTERN = PROPNAME=PROPVALUE`,其中`PATTERN`是一個文件模式,匹配一系列文件名,此行其它兩項為屬性和值。如果一個文件匹配多次,會導致有多個屬性集;然而,沒有手段保障自動屬性不會按照配置文件中的順序應用,所以你可以一個規則“覆蓋”另一個。你可以在`config`文件找到許多自動屬性的用法實例。最后,如果你希望開啟自動屬性,不要忘了設置`miscellany`小節的`enable-auto-props`為`yes`。
`APPDATA`環境變量指向`Application Data`目錄,所以你可以通過`%APPDATA%\Subversion`引用用戶配置區目錄。
就是一個大雜燴?
- 第1章介紹
- Subversion的歷史
- Subversion的特性
- Subversion的架構
- 安裝Subversion
- Subversion的組件
- 快速入門
- 第2章基本概念
- 版本模型
- Subversion實戰
- 摘要
- 第3章指導教程
- 導入
- 修訂版本: 號碼、關鍵字和日期,噢,我的!
- 初始化的Checkout
- 基本的工作周期
- 檢驗歷史
- 其他有用的命令
- 摘要
- 第4章分支與合并
- 使用分支
- 在分支間拷貝修改
- 常見用例
- 轉換工作拷貝
- 標簽
- 分支維護
- 摘要
- 第5章版本庫管理
- 版本庫的創建和配置
- 版本庫維護
- 添加項目
- 摘要
- 第6章配置服務器
- 網絡模型
- svnserve,一個自定義的服務器
- httpd,Apache的HTTP服務器
- 支持多種版本庫訪問方法
- 第7章高級主題
- 屬性
- Peg和實施修訂版本
- 外部定義
- 賣主分支
- 本地化
- Subversion版本庫URL
- 第8章開發者信息
- 使用API
- 進入工作拷貝的管理區
- WebDAV
- 使用內存池編程
- 為Subversion做貢獻
- 第9章Subversion完全參考
- svn add
- svn blame
- svn cat
- svn checkout
- svn cleanup
- svn commit
- svn copy
- svn delete
- svn diff
- svn export
- svn help
- svn import
- svn info
- svn list
- svn log
- svn merge
- svn mkdir
- svn move
- svn propdel
- svn propedit
- svn propget
- svn proplist
- svn propset
- svn resolved
- svn revert
- svn status
- svn switch
- svn update
- svnadmin
- svnadmin create
- svnadmin deltify
- svnadmin dump
- svnadmin help
- svnadmin hotcopy
- svnadmin list-dblogs
- svnadmin list-unused-dblogs
- svnadmin load
- svnadmin lstxns
- svnadmin recover
- svnadmin rmtxns
- svnadmin setlog
- svnadmin verify
- svnlook
- svnlook author
- svnlook cat
- svnlook changed
- svnlook date
- svnlook diff
- svnlook dirs-changed
- svnlook help
- svnlook history
- svnlook info
- svnlook log
- svnlook propget
- svnlook proplist
- svnlook tree
- svnlook uuid
- svnlook youngest
- svnserve
- svnversion
- mod_dav_svn Configuration Directives
- 附錄A.Subversion對于CVS用戶
- 目錄的版本
- 更多離線操作
- 區分狀態和更新
- 分支和標簽
- 元數據屬性
- 沖突解決
- 二進制文件和轉化
- 版本化的模塊
- 認證
- 轉化CVS版本庫到Subversion
- 附錄C.WebDAV和自動版本化
- 自動版本化交互性
- Subversion和DeltaV
- 術語表