如何在SVN中忽略一个目录?

790
我刚开始使用SVN,但我有一个不需要在源代码控制下的缓存目录。如何在SVN中忽略整个目录/文件夹?
我正在使用OS X上的Versions和TextMate以及命令行。VersionsTextMate是独立的SVN客户端。

3
类似的问题已在这里回答:SVN checkout ignore folder - mloskot
可能是重复的问题:如何在Subversion中忽略文件?(我不太关心重复内容是哪一个;两个答案集都没有明显优势。) - Jeffrey Bosboom
22个回答

829

设置父目录的svn:ignore属性:

svn propset svn:ignore dirname .

如果您有多个需要忽略的内容,则在属性值中使用换行符分隔。在这种情况下,使用外部编辑器编辑属性值会更容易:
svn propedit svn:ignore .

5
谢谢你的问题。作为编辑器的 Pico:svn propedit svn:ignore . --editor-cmd pico - hade
163
注意:如果目录已经在 SVN 中,“这样做是行不通的”。请先运行 svn rm --keep-local dirname。(我得到的 SVN 状态输出很多,我费了好大劲才发现这个问题。) - Erik Aronesty
12
如果你想忽略多个文件/文件夹,请将它们所有的名称添加到一个txt文件中,每行一个,并使用以下变体:svn propset svn:ignore -F file.txt . - petervaz
2
@TomBrito 你仍然需要将该属性提交到svn,这就是为什么你在svn状态中看到它的原因。 - Joel Pearson
6
请确保使用 svn propget svn:ignoresvn propset svn:ignore dirname . 命令检查是否已经忽略了某些路径,因为这些命令可能会覆盖当前的忽略路径。最好使用 svn propedit svn:ignore . 命令来编辑忽略列表。如果您已经覆盖了 svn:ignore,请使用 svn proplist -v <PATH>|<URL> 命令获取特定路径的当前值,然后将其复制/粘贴回 svn propedit svn:ignore . 中以恢复之前的设置。 - bucabay
显示剩余10条评论

418

这是一个目录结构的示例:

\project
    \source
    \cache
    \other

当你在项目中看到你的缓存目录没有被添加并且显示为这样时。

> svn status
M  source
?  cache

设置忽略属性,请执行:

svn propset svn:ignore cache .

其中 svn:ignore 是您要设置的属性名称,cache 是该属性的属性值,. 是要在其上设置此属性的目录。它应该是需要属性的 cache 目录的父目录。

要检查已设置的属性:

> svn proplist
Properties on '.':
  svn:ignore

为了查看 svn:ignore 的值:

> svn propget svn:ignore
cache

删除先前设置的属性:

svn propdel svn:ignore

19
这里有一个棘手的问题需要注意,不要在“dirname”后面添加斜杠。例如,在输入“svn propset svn:ignore dirname”时,如果允许(bash) shell为您填充dirname,它会添加尾随斜杠,导致命令变成“svn propset svn:ignore dirname/”,这将不能忽略该文件夹。至少,这是我的经验。 - David Weinraub
7
“cache”目录仍将出现在“svn st”命令的输出中。有没有办法将其从视图中移除?(不需要从磁盘上删除) - The Student

136

需要强调的是:

在命令行中,您不能使用

svn add *

这也会添加被忽略的文件,因为命令行扩展了 * ,因此 svn add 认为您想要添加所有文件。因此,请改用以下命令:

svn add --force .

按照@binco所说的做:svn add --force *不会起作用。要使用点号,而不是星号。 - manuell

84

由于我花了一段时间来尝试让它工作,需要注意的是,如果文件已经存在于SVN中,则需要使用svn delete命令将其删除,然后编辑svn:ignore属性。

我知道这似乎很明显,但它们在我的svn status列表中仍然显示为?,而我以为它只会在本地忽略它们。


9
如果你只是想忽略这些文件而非真正删除它们,请在删除时使用“--keep-local”选项。 - Dylan Holmes

77

稍微扩展一下,如果你使用svn命令行工具进行操作,你需要输入:

svn propedit svn:ignore path/to/dir

打开您选择的文本编辑器,然后键入“*”以忽略其中的所有内容,保存并退出 - 这将包括目录本身在svn中,但忽略其中的所有文件,要忽略目录,请使用父目录的路径,然后在文件中输入目录名称。保存后,运行更新('svn up'),然后检查适当的路径。


8
非常好的观点,谢谢。所有其他答案都忽略了嵌套目录的情况。所以上面的例子(有效的)中,您在编辑器中输入ignored_directory(假设它位于path/to/dir下一级)。然而,以下操作行不通: svn propedit svn:ignore . 然后在编辑器中键入path/to/dir/ignored_directory。换句话说:SVN逐层匹配对象。 - greenoldman

31

在父目录上设置svn:ignore属性:

$ cd parentdir
$ svn ps svn:ignore . 'cachedir'

这将覆盖任何当前的 svn:ignore 值。您可以使用以下方法编辑该值:

$ svn pe svn:ignore .

这将打开您的编辑器。您可以每行添加多个模式。

您可以使用以下命令查看当前值:

$ svn pg svn:ignore .

如果您使用GUI,则应该有一个菜单选项来执行此操作。


4
svn ps svn:ignore . 'cachedir'改为svn ps svn:ignore 'cachedir' .可以解决cachedir is not under version control的问题。请注意,这里不提供任何额外的解释或内容。 - DiCaprio

25

非常感谢以上所有的贡献。
我想分享一些来自我的经验,关于如何忽略文件。


已在版本控制下的文件夹

svn importsvn co文件之后,我们通常需要做第一次设置。

所有的运行时缓存、附件文件夹都将被纳入版本控制。 因此,在使用 svn ps svn:ignore 之前,我们需要将其从仓库中删除。

对于 SVN 版本 1.5 及以上,我们可以使用 svn del --keep-local your_folder, 但对于早期版本,我的解决方案是:

  1. svn export一个干净的文件夹副本(不包括 .svn 隐藏文件夹)
  2. svn del 本地和版本库中的文件夹
  3. svn ci
  4. 将文件夹复制回去
  5. 执行 svn st,确认文件夹标记为 '?'
  6. 现在可以根据解决方案执行 svn ps

当需要忽略多个文件夹时

  • 在一个目录中,我有两个需要设置为 svn:ignore 的文件夹
  • 如果我们设置一个,另一个将被移除。
  • 然后我们需要使用 svn pe

如果需要编辑文本文件,则需要使用 svn pe 命令,您可以使用以下命令设置您的文本编辑器(如 vi):

export SVN_EDITOR=vi
  1. 使用 "o" 按键可以新开一行
  2. 输入要忽略的所有文件夹名称
  3. 按 'esc' 键退出编辑模式
  4. 输入 ":wq" 然后按下 Enter 保存并退出

文件看起来可能就像这样简单:

runtime
cache
attachments
assets

你也可以使用 svn propset svn:ignore -F .ignorethesefiles .,它将使用文件的内容。我喜欢保留它,这样你就知道什么被忽略了。编辑需要后续的 propset。 - Gerard ONeill

22

先移除...

如果您的目录 foo 已经在版本控制下,请使用以下命令先将其移除:

svn rm --keep-local foo

...然后忽略:

svn propset svn:ignore foo .

14

如果你正在使用特定的SVN客户端TortoiseSVN,那么在提交时,你可以右键点击项目并选择“添加到忽略列表”选项。


12

...如果您想要忽略多个目录(比如build/temp/*.tmp文件),您可以通过两步骤来实现(先忽略第一个目录,然后编辑忽略属性,参见此处的其他答案),或者您可以编写以下内容来实现:

svn propset svn:ignore "build
temp
*.tmp" .

在命令行上执行。


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