执行svn合并时出现“内存不足 – 终止应用程序”错误

在32位Windows XP下尝试使用Subversion 1.6.9执行命令行svn merge时,我们看到以下错误。

内存不足 – 终止应用程序。

这个应用程序已经请求运行时以不寻常的方式终止它。 请联系应用程序的支持团队获取更多信息。

在这个时候检查Windows任务pipe理器会显示以下内存使用情况

内存使用率高峰

svn.exe进程的峰值内存使用率超过svn.exe

顺便说一句,当试图使用TortoiseSVN执行合并时,我们会得到相同的结果。

我们正试图从我们的仓库的根级执行合并。 存储库的总文件大小(在开发人员计算机上)大约为3GB。

这是我们第一次尝试根级合并。 我们是否遇到内部svn限制?

编辑

经过一些反复试验,我发现这个问题似乎是由我们的仓库中的一个特定的文件夹造成的。 该文件夹包含1,500个SQL脚本。 在这个文件夹上执行合并会导致相同的内存不足错误(尽pipe需要更长的时间才能完成)。

我们能够解决这个问题,但我们仍然不明白事业的确切性质。

正如我的文章编辑所述,我们追踪到一个包含大约1500个SQL脚本的文件夹。 这个文件夹也有一个svn:externals一个文件的svn:externals

我们执行了以下步骤:

  • 删除了这个svn:externals并做了svn commit
  • 删除了该文件夹的工作副本(似乎有一个问题,如果你删除一个svn:externals属性引用一个单一的文件,外部进入文件夹中的文件不会被删除后续svn update
  • 进行了svn update

当我们下一次尝试一个svn merge命令成功完成。

考虑到终端之前的内存使用情况(〜1.8GB),以及您使用32位Windows(每个进程有2GB内存限制)的事实,建议您尝试在64位计算机上进行合并。

如果你没有可用的64位机器,可以尝试把它分解成更小的合并(除非你正在重新集成一个分支,那么我不知道你是如何分割它的)。

我已经处理了3GB的工作副本和大量的合并(总是从分支的根源) – 我从来没有遇到过内存问题,但我也一直在64位。 可以想象,将分支合并进行大量的修改可能需要大量的内存,但我只是在猜测。

我建议发布到subversion邮件列表,快速搜索告诉我你已经有了:)我怀疑他们会确认你需要更多的内存来做一个大的合并,因为这个版本库的大小,但是也有可能是其他的东西上。

单独的建议:搜索邮件列表类似的问题。

我发现了一个关于太多mergeinfo属性的线程,导致内存使用增加 。 如果你以前从未从根合并过,我认为你有很多mergeinfos。

更新:了解svn:mergeinfos是很重要的。 谨慎操作时不要理解。 在理查德的情况下,版本库从来没有从分支根目录合并,这意味着在根目录下的svn:mergeinfo可能不包含任何东西,所以全部删除它们将删除svn关于之前合并的知识。 在进行完整的分支合并时(例如,svn merge url / to / src / branch – 没有指定修订版本),这一点很重要,并且可能会导致subversion尝试重新合并之前合并的修订版本。 樱桃选择合并(即指定修订x,y,z)不应受到影响。 即使它被全部删除了,它不是世界的尽头,只是你会有一个类似于整个分支合并的行为,在这个时间点之前涉及分支。

这就是说,我不得不多次清理多余的子树mergeinfos,而不是从根目录。

Mergeinfo推荐阅读:

  • Subversion 1.5 Mergeinfo – 了解内部
  • Mergeinfo从哪里来的?

您是否在64位Windows上运行64位版本的SubVersion?

如果不是,请记住在Windows中限制内存大小。 你被限制在3GB的流程使用,所以这可能是你打的限制。

顺便说一句,最新的TortoiseSVN是1.6.13