如何在Subversion中的不同文件夹级别维护不同的忽略列表?

时间:2012-02-05 20:36:28

标签: svn

给定一个Subversion项目,其中某些模式总是被忽略,

*.log
*.idx

并且仅在例如项目根目录

中忽略某些模式
*.out

如何在单个svn:ignore属性中维护这两个列表?

为了维护项目范围的列表,每当我更改它时,我都会递归地应用根文件夹的svn:ignore属性。但那将包括只能在根中忽略的模式。

如果我递归地应用它,那么子文件夹中不会忽略其他模式。

更新:如果你已经习惯了Mercurial(就像我一样),你可能会建议将路径放在root的忽略列表中,比如

*/*.idx

*\*.idx

在最新的Subversion中,这些都不适合我。

2 个答案:

答案 0 :(得分:4)

在Subversion中有两种使用忽略的机制:

  • 全局忽略。可以将模式添加到subversion配置中的global-ignores列表中。全局适用于所有项目。一般来说,定义过多的全局忽略是件坏事。
  • svn:ignore财产。通过设置svn:ignore属性,可以定义在为其定义此属性的目录中忽略的文件或文件夹列表。

全局忽略和svn:ignore属性都不使用正则表达式,而是使用符合fnmatch模式语法的模式。其中仅定义了三种类型的通配符?*[]。您可以使用ls来了解这些模式的工作原理。

可以递归地设置Subversion属性。这适用于*.idx*.log个文件:

$ svn st
? test.log
? test.idx
? recursive/test.log

使用两行创建文件ignores

*.log
*.idx

然后递归设置svn:ingore属性:

$ svn propset --recursive svn:ignore -F ingores  .
property 'svn:ignore' set on '.'
property 'svn:ignore' set on 'recursive'
$ rm ignores
$ svn st --no-ignores
I test.log
I test.idx
I recursive/test.log

在项目根目录中编辑svn:ignore属性之后:

$ svn propedit svn:ignore PROJECT_ROOT

并为*.out模式添加排除。

鉴于:

  

但是,如果我不递归地应用它,则子文件夹中不会忽略其他模式。

唯一的方法是将这些模式添加到全局忽略中。

一些注意事项:

  • 设置svn:ignore属性后,可以递归删除 svn propdel -R ...
  • 的帮助
  • 这种添加忽略的方式对我来说感觉不灵活(对我而言)。例如,在创建新文件夹时,应该记住设置 项目范围的svn:ignore财产。
  • 递归propset应该尽早完成。它删除了所设置属性的旧值。
  • 主要的优点是很少编辑忽略。
  • 通过GUI工具完成时,递归编辑属性似乎更容易

希望这有帮助。

答案 1 :(得分:0)

阅读propset和propedit命令,找到一大差异

  • propset可以递归
  • propedit不能

因此,你可以

  • 在repo-root中使用propset -R和两个repo-wide模式(检查结果以查看它是否填充在树上)
  • 使用propedit编辑root-only文件夹的svn-properties并添加本地ignore-pattern * .out