2009-07-16 226 views
27

使用svn:ignore属性,有没有一种方法可以根据我不想忽略的模式来指定要忽略的内容?换句话说,我想忽略所有的,但是以.xyz结尾的文件。我会如何去做(如果甚至可能的话)?使用svn:忽略忽略某些文件的所有内容

我探索过的一个选项是提交我想要版本化的所有东西,然后将目录中的svn:ignore属性设置为'*',这意味着没有其他文件,但是我已经提交的文件将被版本化。这是最好的我可以想出,但它感觉肮脏,如果我曾经需要添加另一个文件版本,我不得不作出多个提交...一个删除svn:忽略属性,另一个添加/提交新文件,然后第三个将svn:ignore更改为'*'。

您的想法?

回答

10

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

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

类似的问题被问到已经here

0

好了,我不知道如果我错过了什么,但你可以使用任何方式你想要的:

svn propset svn:ignore "*~" . 

您可以检查有:

svn propget svn:ignore . 

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

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

编辑:

对不起我的第一个解决方案的错误,我误解你的帖子。其他两种方式似乎相关,即使不完全是你想要的...

+0

虽然我认为你的第一个解决方案是关于某件事的。你可以设想svn:忽略一个正则表达式匹配除了以“.xyz”结尾的文件之外的所有内容吗? – jprete 2009-07-16 14:17:51

+0

@jprete不幸的是,不允许正则表达式。模式匹配基于fnmatch。 – whaley 2009-07-17 13:44:54

7

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

虽然您需要在所有子目录中添加该设置。

# Create a repository with property ignore * 

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

# Create 3 files 

[[email protected] co] touch a 
[[email protected] co] touch b 
[[email protected] co] touch c 

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

[[email protected] co] svn status 
M  . 
[[email protected] co] svn add a 
A   a 
[[email protected] co] svn add b 
A   b 
[[email protected] co] svn status 
M  . 
A  a 
A  b 
[[email protected] co] svn add c 
A   c 
[[email protected] co] svn ci 
Sending  . 
Adding   a 
Adding   b 
Adding   c 
Transmitting file data ... 
Committed revision 1. 
+1

感谢您的提示。我没有意识到你可以显式添加文件,显然`svn add`忽略svn:ignore。 – whaley 2009-07-17 13:42:50

+0

对于TortoiseSVN(1.8)用户,如果您尝试通过gui添加忽略的文件,它会让您生气,但您可以通过命令行执行此操作。 – AlexMA 2013-09-04 18:18:20

17

看一看http://www.thoughtspark.org/node/38。显然你可以使用“!”在字符组中否定其含义。所以如果你想忽略除了以。Java中,设置以下模式的svn:忽视:

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

这是我对bin文件夹设置为svn:ignore属性匹配除了APK文件的所有内容:

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

如果将有充分的RegExp支持你可以使用负面后顾,但是很少实现(例如不在JavaScript中)并且效率低下。

4

以下为我工作,并摆脱了其他建议的几个怪癖。

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

一行说明的行如下:

  • 忽略了一个字母的扩展
  • 不顾一切,有一个两个字母的扩展
  • 不顾一切有三个一切字母扩展名
  • 忽略扩展名的第一个字母不是j的所有扩展名为四个字母的文字
  • 忽略具有四个字母的扩展都在扩展的第二个字母不是
  • 不顾一切,有一个四个字母的扩展,其中扩展的第三个字母不是V
  • 忽略,有一个四个字母的扩展一切凡拓的第四个字母不是
  • 忽略具有五个字母的扩展名以上

限制的一切:

  • 该W生病也阻止以.java结尾的目录
  • 不幸的是我不能忽略没有扩展名的文件,因为那样会阻塞目录。