使用svn:ignore忽略除某些文件之外的所有内容

时间:2009-07-16 13:52:51

标签: svn svnignore

使用svn:ignore属性,有没有办法根据我不想忽略的模式指定我想忽略的内容?换句话说,我想忽略以.xyz结尾的所有文件。我将如何做到这一点(如果可能的话)?

我探索过的一个选项是提交我想要版本化的所有内容,然后将目录上的svn:ignore属性设置为'*',这意味着没有其他文件,但我已经提交的文件将被版本化。这是我能想到的最好的,但它感觉很脏,如果我确实需要添加另一个文件作为版本,我必须进行多次提交...一个删除svn:ignore属性,另一个添加/提交新文件,然后第三个更改svn:忽略回'*'。

你的想法?

6 个答案:

答案 0 :(得分:17)

看看http://www.thoughtspark.org/node/38。显然你可以使用“!”在角色群体中否定其含义。因此,如果要忽略除.java结尾的文件之外的所有内容,请将以下模式设置为svn:ignore:

*[!j][!a][!v][!a]
*.java?*

答案 1 :(得分:12)

不,没有你所描述的独家匹配。 This article列出了模式匹配的可能性。它仅限于:

  • ? - 匹配任何单个字符
  • * - 匹配任何字符串,包括空字符串
  • [ - 开始由]终止的字符类定义,用于匹配字符子集

已经问过类似的问题here

答案 2 :(得分:7)

这是我所知道的唯一解决方案。您可以显式添加文件,即使它们被忽略了。

您需要在所有子目录上添加该设置。

# Create a repository with property ignore *

[wlynch@orange ~] cd /tmp
[wlynch@orange /tmp] svnadmin create foo
[wlynch@orange /tmp] svn co file:///tmp/foo co
Checked out revision 0.
[wlynch@orange /tmp] cd co
[wlynch@orange co] svn propset svn:ignore \* .
property 'svn:ignore' set on '.'

# Create 3 files

[wlynch@orange co] touch a
[wlynch@orange co] touch b
[wlynch@orange co] touch c

# We can add all 3 of these files in one transaction

[wlynch@orange co] svn status
M     .
[wlynch@orange co] svn add a
A         a
[wlynch@orange co] svn add b
A         b
[wlynch@orange co] svn status
M     .
A      a
A      b
[wlynch@orange co] svn add c
A         c
[wlynch@orange co] svn ci
Sending        .
Adding         a
Adding         b
Adding         c
Transmitting file data ...
Committed revision 1.

答案 3 :(得分:5)

这是我在bin属性的svn:ignore文件夹上设置的,以匹配除apk文件之外的所有内容:

*[!a][!p][!k]
*a[!p][!k]
*ap[!k]

如果有完整的RegExp支持,你可以使用负面的lookbehind,但这很少被实现(例如不在JavaScript中)并且效率低下。

答案 4 :(得分:4)

以下对我有用,并摆脱了其他一些建议的一些怪癖。

*.?
*.??
*.???
*.[!j]???
*.?[!a]??
*.??[!v]?
*.???[!a]
*.?????*

逐行说明如下:

  • 忽略所有具有单字母扩展名的内容
  • 忽略所有具有两个字母扩展名的内容
  • 忽略所有具有三个字母扩展名的内容
  • 忽略所有具有四个字母的扩展名,其中扩展名的第一个字母不是j
  • 忽略扩展名的第二个字母不是
  • 的四个字母的扩展名
  • 忽略所有包含四个字母的扩展名,其中扩展名的第三个字母不是v
  • 忽略所有包含四个字母的扩展名,其中扩展名的第四个字母不是
  • 忽略具有五个字母或更多内容的所有内容

限制:

  • 这也将阻止以.java
  • 结尾的目录
  • 不幸的是我无法忽略没有扩展名的文件,因为那样也会阻止目录。

答案 5 :(得分:0)

好吧,我不知道我是否遗漏了什么,但你可以使用你想要的任何模式:

svn propset svn:ignore "*~" .

您可以查看:

svn propget svn:ignore .

另一种方法是使用别名/脚本,在提交时可以进行复杂的解析。

我发现自己使用的最佳解决方案是将源文件的版本化树与构建树完全分开。这样,您就不会在目录的版本化树中生成内容。然后,您只能使用svn:ignore来忽略文本编辑器生成的简单伪像。

编辑:

对不起我第一个解决方案的错误,我误读了你的帖子。即使不完全符合你的要求,其他两种方式似乎也很相关......