在Subversion中递归忽略整个源代码树中的文件

52

我不是Subversion的新手,但迄今为止我一直使用Tortoise而不是命令行。 我的问题是,如何忽略整个源中的所有文件,例如*.o,而不仅仅是根目录。

例如,如果我有以下文件:

/myfile.o

/folder1/myfile2.o

/folder1/folder1.1/myfile3.o

/folder2/myfile4.o

如果在根目录中运行svn propedit svn:ignore ".",然后添加*.o,它将会忽略myfile.o,但不会忽略/folder1/myfile2.o,/folder1/folder1.1/myfile3.o和/folder2/myfile4.o。是否有一种方法可以为整个项目添加*.o(我不能为整个存储库这样做,因为此项目位于具有许多其他项目的存储库中)?

请告诉我是否需要进一步澄清。谢谢!

3个回答

72

编辑

以下原始答案是在Subversion v1.8之前提供的,该版本引入了一种设置默认存储库级别忽略(称为svn:global-ignores)的方法,而不必覆盖/替换根目录和每个子目录上的svn:ignore属性。自从1.8以来,实现您想要的最佳方法是调用以下命令(感谢TManhente):

svn propset svn:global-ignores '*.o' .

在早期版本(以及后续版本)中,您仍然可以使用下面原始答案中指示的方法;但是,请注意,这假定您已经同意替换/覆盖每个子目录上的 svn:ignore 属性...这对于小型/新型存储库可能是可以接受的,但如果您有一个大型/旧的存储库,在其中一些子目录可能具有独立的 svn:ignore 属性,您不希望覆盖它们,则这可能不是您想要的。

原始答案

您可以在 "svn propset" 命令中使用 "-R" 或 "--recursive" 选项,如下所示:

svn propset svn:ignore '*.o' . --recursive

更多信息

对于这两种情况,您可以使用以下命令获取有关 svn propset 的更多信息:

svn help propset

1
你也可以使用 --force 参数:svn propset svn:ignore "*.pdb *.db" c:\portal\ --recursive --force - Junior Mayhé
45
如果你已经设置了其他的svn:ignore选项,接受的答案会清除它们所有。如果你想撤销所有属性更改,可以参考此链接:https://dev59.com/FXA75IYBdhLWcg3w0sp9 - hackartisan
2
我想重申hackmaster的警告,并感谢他提供的解决方案。顺便说一下,我选择了全局配置解决方案,位于~/.subversion/config中。 - Artem Russakovskii
3
hackmaster的评论应该置顶在这个主题的顶部。一个“被接受的答案”包含了破坏你的代码库(至少是其中的某些部分)的指令,并不是一件好事情 ;) - Frunsi
@Frunsi,感谢您提出这个问题。在提供这个答案之前,曾经没有可用的替代方案,但是您说得对...我应该澄清我的假设,即您不希望保留svn:ignore属性的子目录已经存在。我已经更新了答案,使其更加现代化和明确。 - Michael Aaron Safyan
显示剩余3条评论

39

更新一下:Subversion 1.8.0引入了 继承属性仓库指定配置(用于自动属性和忽略),这也可以在这种情况下使用。

您可以在根路径中设置新的svn:global-ignores属性。它将 "仅影响设置该属性的路径下的子树"。

这个新属性的设置方式与 svn:ignore 相同:

    svn propset svn:global-ignores '*.o' .

更多信息可在Subversion 1.8.0版本发布说明中获得。


我真的很想知道如何使用自动属性来设置它? - mgouin
我已将 bindebugobj 添加到 svn:global-ignores,但是在此之后,当我运行 svn propget svn:global-ignores 时,它只返回了最后一个 obj,请问如何忽略多个文件/文件夹? Imgur - Luke
@Luke:原因在于你多次调用了 svn propset 命令。每次调用 propset ,都会用传递的新值替换属性的先前值。你需要做的是在单个 propset 调用中添加所有忽略规则,或者使用 svn propedit 代替 propset。查看命令文档以获取更多信息。 - TManhente

3

正如@hackmaster.a在评论中指出的那样,接受答案中给出的示例会有一个副作用,即会清除所有先前的svn:ignore设置。使用propedit而不是propset也行不通。

递归添加多个文件的正确方法是将它们的名称放入列表中,用新行分隔,在svn:ignore属性中设置svn propset svn:ignore "[LIST]" .

例如:

    svn propset svn:ignore -R "*.pkl
    > *.class
    > Thumbs.db
    > data.tmp" .

当然>只是shell提示符。

这个命令会递归地更改当前目录.和它的每个子文件夹的svn:ignore属性。


使用1.7.4会清除所有的svn:ignore。 - lrkwz

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