忽略SVN更新中的一个文件夹

37

如果我使用svn:ignore忽略一个非常大的文件夹,会提高SVN更新期间的性能吗?

我的项目中有一个非常庞大(> 600MB)的文件夹。这个文件夹中的文件应该根本不会发生变化。问题是每次我调用“svn update”都需要很长时间。是否有一种方法可以在更新过程中忽略此文件夹以加快更新速度?


类似于这个 Stack Overflow 的帖子 https://dev59.com/MHVD5IYBdhLWcg3wBWzd - beer_monk
3
svn:ignore 只能用于忽略未被版本控制的文件。您仍然可以添加与 svn:ignore 匹配的文件,它们将像存储库中的任何其他文件一样处理。 - Michael Madsen
你可以尝试一下,看看是否有帮助。 - House
5个回答

57

svn:ignore 只用于那些尚未在 Subversion 仓库中的文件,而这个文件夹已经在其中。

您可以使用 svn update --set-depth exclude 文件夹名称 命令将这个文件夹从您的工作目录中删除:

$ svn update --set-depth exclude bigFolder  #Removes "bigFolder" from workdir
D bigFolder

$

下次更新时,bigFolder不会出现在您的工作目录中。如果您想要它回来,您需要重置深度:

$ svn update --set-depth infinity
U bigFolder
U bigFolder/File1
U bigFolder/File2
...

11
我不喜欢它删除文件夹,我只想不更新已经存在的文件夹。 - Fedir RYKHTIK
这允许排除单个目录。有没有一种方法可以排除多个目录?我不需要在本地副本中保留项目的所有旧分支。 - Barmar
@Barmar 你只需要检出你想要的分支,不必将整个项目的主干、标签和分支都放在你的工作副本中。 - Sergi
@Sergi 在我的情况下,我可能想忽略100个目录中的10或20个。因此,我必须明确地检出那90个目录。当新目录被创建时,由于无法更新父目录,我必须手动检出它们。 - Barmar
2
您可以在多个文件和目录中使用 --set-depth exclude。例如:svn update --set-depth exclude dir1 dir2 file1 ... - Sergi
无法在 Mac 上使用 SVN 1.13.0。当我执行 'svn update' 命令时,它仍会在本地恢复已删除的文件夹。 - terreb

11

你可以执行 svn update 命令,然后指定需要更新的其他目录,例如:

svn update dir1 dir2 dir3

或者,使用 grep -v 命令来过滤掉你不想要的内容。

svn update `ls | grep -v big_dir`

或者,将big_dir用svn mv移动到另一个文件夹中,然后更改您的构建系统以从其他目录获取内容。


10

只需要做:

svn up `svn ls | grep -v big_dir`

使用 "svn ls" 命令可以更新本地存在的目录和文件,也可以从版本库获取新文件。因此,更新比排除更完整。您无需像"--set-depth exclude" 命令那样删除已经存在的文件。


解析 ls 命令的输出通常是一个不好的主意 http://mywiki.wooledge.org/ParsingLs - Doppelganger
1
@Doppelganger 在这篇文章中,它是关于 ls 命令的。但在答案代码中使用了 svn ls 命令,两者有一点不同。 - Fedir RYKHTIK
2
你说得对。解析ls的常见陷阱在于它不能很好地处理文件名中带有换行符的情况。svn ls避免了这个问题,因为svn不会让你添加文件名中带有换行符的文件。svn add 'a b' svn: E160005: Invalid control character '0x0a' in path '/svn-test/a\012b' - Doppelganger
如果有另一个名为“big_dir_something_else”的文件或目录,则可能会出现问题,因此最好使用“-w”过滤整个单词:svn up $(svn ls | grep -wv big_dir)(同时将反引号改为$(...))。 - Renato

3
除了 @Bill Brasky 提到的,还有一个建议是将大文件夹移动到外部。这样你就可以执行 svn up --ignore-externals
如果你不想在工作副本中有大文件夹,你可以查看稀疏检出:
svn checkout repo . --depth empty
svn up other dirs

0
svn file structure:
trunk
|___ folder1
|___ folder2
|___ folder3
|___ other_folder

首先,在结账时,请使用 immediates,仅结账第一级文件夹和文件:

  • svn co svn://svn-xxxx.com/svn/develop/trunk --depth immediates trunk,

然后,设置一些文件夹以便稍后更新:

  • cd trunk
  • svn up folder1 folder2 folder3 --set-depth infinity

现在,只有文件夹 123 可以更新,其他第一级文件夹仍保留在 trunk 文件夹中。


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