使用svn:ignore来忽略除特定文件以外的一切内容

35
使用svn:ignore属性,有没有一种方式可以根据不想忽略的模式来指定要忽略的内容呢?换句话说,我想忽略除以“.xyz”结尾的文件之外的所有内容。如果可能的话,我该如何操作呢?
我探索了一种选项,即提交我想要版本化的所有内容,然后在目录上设置svn:ignore属性为“*”,这意味着将只版本化已经提交的文件,而不会版本化其他任何文件。这是我能想到的最好方法,但感觉有些麻烦,因为如果我需要添加另一个要版本化的文件,就必须进行多次提交... 先要删除svn:ignore属性、再添加/提交新文件,最后第三次更改svn:ignore回到“*”。
您有什么想法?
6个回答

19

4
实际上我当天在IRC上询问了管理OSX svn软件包的jcscoobyrs关于这个问题,结果他发了一篇文章到thoughtspark.org。我在已接受答案的评论中引用了它。这只是表明,无论stackoverflow.com多么棒,它仍然不能击败在IRC上与项目贡献者交谈。 - whaley
正确的是: *[!j][!a][!v][!a] *j[!a][!v][!a] *ja[!v][!a] *jav[!a] - Nux
1
链接已损坏。 - James
*[!a] *[!v]a *[!a]va *[!j]ava *[!.]java 当前的解决方案不能忽略以 a 结尾的任何内容,它会忽略我的.javaParser.java。 - Rick

13

不,没有像你描述的那样的独占匹配。这篇文章列出了模式匹配的可能性。它仅限于:

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

类似的问题已经在这里被问过了。


1
这个答案中提到的fnmatch并不是全部,还有更多内容。请参考下面的tomka的回答:http://docs.python.org/2/library/fnmatch.html - vinnyjames

9

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

但是您需要在所有子目录中都添加该设置。

# 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.

1
谢谢你的提示。我没有意识到你可以明确地添加文件,因为svn add忽略了svn:ignore。 - whaley
对于TortoiseSVN(1.8)用户,如果您尝试通过其GUI添加一个被忽略的文件,它会对您发脾气,但您可以通过命令行这样做。 - AlexMA

5

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

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

如果完全支持正则表达式,你可以使用负回顾后发现,但这在实现时很少见(例如JavaScript中没有),而且效率低下。

4
以下是我使用的方法,可以消除其他建议中存在的一些问题。
*.?
*.??
*.???
*.[!j]???
*.?[!a]??
*.??[!v]?
*.???[!a]
*.?????*

一行一行的解释如下:
  • 忽略所有扩展名只有一个字母的文件
  • 忽略所有扩展名只有两个字母的文件
  • 忽略所有扩展名只有三个字母的文件
  • 忽略所有扩展名是四个字母,并且扩展名的第一个字母不是j的文件
  • 忽略所有扩展名是四个字母,并且扩展名的第二个字母不是a的文件
  • 忽略所有扩展名是四个字母,并且扩展名的第三个字母不是v的文件
  • 忽略所有扩展名是四个字母,并且扩展名的第四个字母不是a的文件
  • 忽略所有扩展名包含五个及以上字母的文件

限制:

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

0

嗯,我不知道是否有遗漏,但你可以使用任何模式:

svn propset svn:ignore "*~" .

您可以使用以下方式进行检查:

svn propget svn:ignore .

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

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

编辑:

对不起,我误读了您的帖子,第一种解决方案是我的错误。即使不完全符合您的要求,另外两种方法似乎也很相关...


我认为你的第一个解决方案有些可行。你可以将svn:ignore设置为一个正则表达式,匹配除了以“.xyz”结尾的文件之外的所有内容。 - jprete
很抱歉,不允许使用正则表达式。模式匹配基于fnmatch。 - whaley

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接