第 7 章 客製化你的 Subversion 體驗

目錄

運行設定區
設定區部署
設定和 Windows 註冊表
設定選項
本地化
理解地區
Subversion對區域設定的支持
使用外部(External)比較工具
外部(External) diff
外部(External) diff3

版本控制可以成為複雜的主題,和科學一樣充滿藝術性,為解決事情能提供了無數的方法。貫穿這本書,你已經閱讀許多Subversion指令列子命令,以及可以改變運行方式的選項,在本章我們要查看一些自行定義Subversion工作的方法—設定Subversion運行設定,使用外部(External)幫助程序,Subversion與操作系統設定的地區交互等等。

運行設定區

Subversion提供了許多用戶可以控制的可選行為方式,許多是用戶希望新增到所有的Subversion操作中的選項,為了避免強制用戶記住指令列參數並且在每個命令中使用,Subversion使用設定文件,並且將設定文件保存在獨立的Subversion設定區。

Subversion設定區是一個雙層結構,保存了可選項的名稱和值。通常,Subversion設定區是一個保存設定文件的特殊目錄(第一層結構),目錄中保存了一些標準INI格式的文字文件(文件中的「section」形成第二層結構)。這些文件可以簡單用你喜歡的文字編輯器編輯(如Emacs或vi),而且保存了客戶端可以讀取的指示,用來指導用戶的一些行為選項。

設定區部署

svn指令列客戶端第一次執行時,會建立一個用戶設定區,在類Unix系統中,設定區位於用戶主目錄中,名為.subversion。在Win32系統,Subversion建立一個名為Subversion的目錄,這個目錄通常位於用戶設定目錄(順便說一句,通常是一個隱藏目錄)的Application Data子目錄下。然而,在Win32平台上,此目錄的具體位置在不同的系統上是不一樣的,由Windows註冊表決定。 [45]我們以Unix下的名字.subversion來表示用戶設定區。

除了用戶設定區,Subversion也提供了系統設定區,通過系統設定區,系統管理員可以為某個機器的所有用戶建立預設設定值。注意系統設定區不會規定強制性的策略—每個用戶設定區都可以覆蓋系統設定區中的設定項,而svn的指令列參數決定了最後的行為。在類Unix的平台上,系統設定區位於/etc/subversion目錄下,在Windows平台上,系統設定區位於Application Data(再說一次,是由Windows註冊表決定的)的Subversion目錄中。與每用戶設定區不同,svn不會試圖建立系統設定區。

目前,Subversion的設定區包含三個文件—兩個設定文件(configservers),和一個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. 指令列選項

  2. 用戶INI設定文件

  3. 用戶註冊表值

  4. 系統INI設定文件

  5. 系統註冊表值

此外,雖然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-passwords"="yes"
"#store-auth-creds"="yes"

[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\tunnels]

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\miscellany]
"#global-ignores"="*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store"
"#log-encoding"=""
"#use-commit-times"=""
"#no-unlock"=""
"#enable-auto-props"=""

[HKEY_CURRENT_USER\Software\Tigris.org\Subversion\Config\auto-props]


上面例子裡顯示的.reg文件中,包含了一些最常用的設定選項和它們的預設值。注意,上面的例子中不僅包含了系統設定(關於網路代理相關的選項),也包含了用戶設定(指定的編輯器程序,是否保存密碼,以及其它選項)。同時要注意的是,所有選項都註釋掉了,要啟用其中的選項,只需刪除該選項名稱前面的井號(#),然後設定相應的值就可以了。

設定選項

本節我們會詳細討論Subversion目前支持的運行設定選項。

伺服器

servers文件保存了Subversion關於網路層的設定選項,這個文件有兩個特別的小節:groupsglobalgroups小節是一個交叉引用表,其中的關鍵字是servers文件中其它小節的名字,值則是globs格式的,也就是包含通配符的字元序列,對應於接收Subversion請求的主機名。

[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-exceptions

這裡指定了一組逗號分割的列表,其內容是無須代理伺服器可以直接訪問的版本庫主機名模式,模式語法與Unix的shell中的文件名相同,其中任何匹配的版本庫主機不會通過代理訪問。

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 章 嵌入 Subversion

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文件中),你可以設定這個參數為證書的密碼,這樣就不會再收到密碼輸入提示了。

設定

其它的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一起使用—一個臨時文件跳出來包含已經存在的用戶希望編輯的屬性,然後用戶可以對這個屬性進行編輯(見「屬性」一節),這個選項的預設值為空,檢測編輯器的順序如下(小號碼位置優先於大號碼位置):

  1. 指令列選項--editor-cmd

  2. 環境變數SVN_EDITOR

  3. 設定選項editor-cmd

  4. 環境變數VISUAL

  5. 環境變數EDITOR

  6. 也有可能Subversion會有一個內建的預設值(官方編譯版本不是如此)

所有這些選項和變數(不像diff-cmd)的值的開頭都是shell中要執行的指令列,Subversion會追加一個空格和一個需要編輯的臨時文件,編輯器必須修改臨時文件,並且返回一個0來表明成功。

diff-cmd

這裡是比較程序的絕對路徑,當Subversion生成了「diff」輸出時(例如當使用svn diff命令)就會使用,預設Subversion會使用一個內建的比較庫—設定這個參數會強制它使用外部程序執行這個任務,此類程序的更多訊息見「使用外部(External)比較工具」一節

diff3-cmd

這指定了一個三向的比較程序,Subversion使用這個程序來合併用戶和從版本庫接受的修改,預設Subversion會使用一個內建的比較庫—設定這個參數會導致它會使用外部程序執行這個任務,此類程序的更多訊息見「使用外部(External)比較工具」一節

diff3-has-program-arg

如果diff3-cmd選項設定的程序接受一個--diff-program指令列參數,這個標記必須設定為true

tunnels小節允許你定義一個svnservesvn://客戶端連接使用的管道模式,更多細節見「穿越 SSH 隧道」一節

miscellany小節是一些沒法歸到別處的選項。 [46]在本小節,你會找到:

global-ignores

當運行svn status命令時,Subversion會和版本化的文件一樣列出未版本化的文件和目錄,並使用?字元(見see 「查看你的修改概況」一節)標記,有時候察看無關的未版本化文件會很討厭—比如程序編譯產生的對象文件—的顯示出來。global-ignores選項是一個空格分隔的列表,用來描述Subversion在它們版本化之前不想顯示的文件和目錄,預設值是*.o *.lo *.la #*# .*.rej *.rej .*~ *~ .#* .DS_Store

就像svn statussvn addsvn import命令也會忽略匹配這個列表的文件,你可以用單個的--no-ignore指令列參數來覆蓋這個選項。

For information on more fine-grained control of ignored items, see 「忽略未版本控制的條目」一節.

enable-auto-props

這裡指示Subversion自動對新加的或者匯入的文件設定屬性,預設值是no,可以設定為yes來開啟自動新增屬性,這個文件的auto-props小節會說明哪些屬性會被設定到哪些文件。

log-encoding

這個變數設定提交日誌預設的字元集,是--encoding選項(見「svn選項」一節)的永久形式,Subversion版本庫保存了一些UTF-8的日誌訊息,並且假定你的日誌訊息是用操作系統的本地編碼,如果你提交的訊息使用別的編碼方式,你一定要指定不同的編碼。

use-commit-times

通常你的工作副本文件會有最後一次被進程訪問的時間戳,不管是你自己的編輯器還是用svn子命令。這通常對人們開發軟體提供了便利,因為編譯系統通常會通過查看時間戳來決定那些文件需要重新編譯。

在其他情形,有時候如果工作副本的文件時間戳反映了上一次在版本庫中更改的時間會非常好,svn export命令會一直放置這些「上次提交的時間戳」放到它建立的目錄樹。通過設定這個config參數為yessvn checkoutsvn updatesvn switchsvn revert命令也會為它們操作的文件設定上次提交的時間戳。

auto-props小節控制Subversion客戶端自動設定提交和匯入的文件的屬性的能力,它可以包含任意數量的鍵-值對,格式是PATTERN = PROPNAME=PROPVALUE,其中PATTERN是一個文件模式,匹配一系列文件名,此行其它兩項為屬性和值。如果一個文件匹配多次,會導致有多個屬性集;然而,沒有手段保障自動屬性不會按照設定文件中的順序應用,所以你可以一個規則「覆蓋」另一個。你可以在config文件找到許多自動屬性的用法實例。最後,如果你希望開啟自動屬性,不要忘了設定miscellany小節的enable-auto-propsyes



[45] APPDATA環境變數指向Application Data目錄,所以你可以通過%APPDATA%\Subversion引用用戶設定區目錄。

[46] 就是一個大雜燴?