6.忽略未版本控制的条目

Posted on Posted in 4.高级主题

忽略未版本控制的条目

在任何工作拷贝,将版本化文件和目录与没有也不准备版本化的文件分开会是非常常见的情况。文本编辑器的备份文件会将目录搞乱,代码编译过程中生成的中间文件,甚至最终文件也不是你希望版本化的,用户在见到这些文件和目录(经常是版本控制工作拷贝中)的任何时候都会将他们删除。

期望让Subversion的工作拷贝摆脱混乱保持干净是可笑的,实际上Subversion将工作拷贝是普通目录作为它的一项特性。但是这些没有版本化的文件和目录会给Subversion用户带来一些烦恼,例如,因为svn addsvn 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一直认为它是版本化的对象。

CVS 用户的忽略模式

Subversion的svn:ignore属性与CVS的.cvsignore文件的语法和功能非常类似,实际上,如果你移植一个CVS的工作拷贝到Subversion,你可以直接使用.cvsignore作为svn propset输入文件参数:

$ svn propset svn:ignore -F .cvsignore .
property 'svn:ignore' set on '.'
$

       

但是CVS和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 addsvn import也会使用这个忽略模式列表,这两个操作都包括了询问Subversion来开始管理一组文件和目录。比强制用户挑拣目录树中那个文件要纳入版本控制的方式更好,Subversion使用忽略模式来检测那个文件不应该在大的迭代添加和导入操作中进入版本控制系统。再次说明,操作Subversion文件和目录时你可以使用–no-ignore选项忽略这个忽略列表。


[13] 这不是编译系统的基本功能吗?