在任何工作副本,將版本化文件和目錄與沒有也不準備版本化的文件分開會是非常常見的情況。文字編輯器的備份文件會將目錄搞亂,代碼編譯過程中生成的中間文件,甚至最終文件也不是你希望版本化的,用戶在見到這些文件和目錄(經常是版本控制工作副本中)的任何時候都會將他們刪除。
期望讓Subversion的工作副本擺脫混亂保持乾淨是可笑的,實際上Subversion將工作副本是普通目錄作為它的一項特性。但是這些沒有版本化的文件和目錄會給Subversion用戶帶來一些煩惱,例如,因為svn add和svn import命令都是會遞歸執行的,並不知道哪些文件你不希望版本化,很容易意外的新增一些文件。因為svn status會報告工作副本中包括未版本化文件和目錄的訊息,如果這種文件很多,它的輸出會變得非常嘈雜。
所以Subversion提供了兩種方法讓你指明哪些文件可以被漠視,一種方法需要你修改Subversion的運行設定系統(見「運行設定區」一節),這樣會使所有的Subversion操作都利用這個設定,通常來說,這是在某一個計算機上的操作,或者是某個計算機某個用戶的操作。另一種方法利用了Subversion目錄屬性支持,與版本化的目錄樹緊密結合,因而會影響所有擁有這個目錄樹工作副本的人。兩種機制都使用文件模式。
Subversion運行設定系統提供一個global-ignores選項,其中的值是空格分開的文件名模式(或glob)。這些模式會應用到可以新增到版本控制的候選者,也就是svn status顯示出來的未版本化文件。如果文件名與其中的某個模式匹配,Subversion會當這個文件不存在。這個文件模式最好是全域不期望版本化的模式,例如編輯器Emacs的備份文件*~和.*~。
如果是在版本化目錄上發現svn:ignore屬性,其內容是一列以行分割的文件模式,Subversion用來判斷在這個目錄下對象是否被忽略。這些模式不會覆蓋在運行設定設定的全域忽略,而是向其新增忽略模式。不像全域忽略選項,在svn:ignore屬性中設定的值只會應用到其設定的目錄,而不會應用到其子目錄。svn:ignore屬性是告訴Subversion在每個用戶的工作副本對應目錄忽略相同的文件的好方法,例如編譯輸出或—使用一個本書相關的例子—本書從DocBook XML文件生成的HTML、PDF或PostScript。
Subversion對於忽略文件模式的支持僅限於將未版本化文件和目錄新增到版本控制時,如果一個文件已經在Subversion控制下,忽略模式機制不會再有效果,不要期望Subversion會阻止你提交一個符合忽略條件的修改—Subversion一直認為它是版本化的對象。
全域忽略模式只是一種個人喜好,可能更接近於用戶的特定工具鏈,而不是特定工作副本的需要,所以餘下的小節將關注svn:ignore屬性和它的使用。
假定你的svn status有如下輸出:
$ svn status calc M calc/button.c ? calc/calculator ? calc/data.c ? calc/debug_log ? calc/debug_log.1 ? calc/debug_log.2.gz ? calc/debug_log.3.gz
在這個例子裡,你對button.c文件作了一些屬性修改,但是你的工作副本也有一些未版本化的文件:你從原始碼編譯的最新計算器程序,一系列調試輸出日誌文件,現在你知道你的編譯系統一直會編譯生成計算器程序。 [13]而且你知道你的測試組件總是會留下這些調試日誌,這對所有的工作副本都是一樣的,不僅僅是你的。你也知道你不會有興趣在svn status命令中顯示這些訊息,所以使用svn propedit svn:ignore calc來為calc目錄增加一些忽略模式,舉個例子,你或許會新增如下的值作為svn:ignore的屬性:
calculator debug_log*
當你新增完這些屬性,你會在calc目錄有一個本地修改,但是注意你的svn status輸出有什麼其他的不同:
$ svn status M calc M calc/button.c ? calc/data.c
現在,所有多餘的輸出不見了!當然,你的計算器程序和所有的日誌文件還在工作副本中,Subversion僅僅是不再提醒你它們的存在和未版本化。現在所有討厭的噪音都已經不再顯示,只留下了你感興趣的條目—如你忘記新增到版本控制的原始碼文件data.c。
當然,不僅僅只有這種簡略的工作副本狀態輸出,如果想查看被忽略的文件,可以使用Subversion的--no-ignore選項:
$ svn status --no-ignore M calc M calc/button.c I calc/calculator ? calc/data.c I calc/debug_log I calc/debug_log.1 I calc/debug_log.2.gz I calc/debug_log.3.gz
我們在前面提到過,svn add和svn import也會使用這個忽略模式列表,這兩個操作都包括了詢問Subversion來開始管理一組文件和目錄。比強制用戶挑揀目錄樹中那個文件要納入版本控制的方式更好,Subversion使用忽略模式來檢測那個文件不應該在大的迭代新增和匯入操作中進入版本控制系統。再次說明,操作Subversion文件和目錄時你可以使用--no-ignore選項忽略這個忽略列表。