单个大型 SVN 项目的最佳实践

Posted

技术标签:

【中文标题】单个大型 SVN 项目的最佳实践【英文标题】:Best practices for a single large SVN project 【发布时间】:2009-04-14 20:53:37 【问题描述】:

我在 svn 中继承了一个项目:超过 300 000 个文件中的 30Gb。那里有大量的二进制文件,大部分位于图像文件夹中。更新整个项目之类的操作可能会非常缓慢。

团队改进了一个流程,只在他们正在处理的特定文件夹上运行更新/切换,并最终检查损坏的代码,因为“它在我的计算机上工作”。任何人的工作副本都可能包含过期代码、切换代码和遗忘-从未提交的代码。此外,发生的分支最少。

我个人的解决方案是每天早上 5 点的小型 bash 签出/构建脚本,但不是每个人都有命令行勇气甚至复制我的解决方案,而是宁愿舒适地使用 tortoise svn 和破碎的过程。

有没有人尝试过调整这么大的存储库并可以提供建议? 是否有任何我可以实施的最佳实践来处理大型存储库,我可以让每个人都轻松进入?

附: externals 似乎不是一个好主意,SVN optimizations to keep large repositories responsive 在这里不适用,因为我正在处理一个项目

附言这目前也在调查中:http://www.ibm.com/developerworks/java/library/j-svnbins.html

【问题讨论】:

有关于这个问题的消息吗?我在我们的项目中遇到了类似的问题。 【参考方案1】:

首先,在客户端和服务器上升级到 SVN 1.6。 latest release 注释提到了大文件的加速 (r36389)。

其次,如果您必须在工作副本中包含整个项目,这可能不太适合您,但请使用sparse directories。我们为我们的大型 repo 执行此操作,客户端所做的第一件事是仅签出***目录,然后为了获取更多数据,使用 repo 浏览器转到所需的目录并在其上“更新到此修订版”。它在 TortoiseSVN 上运行良好。 1.6 还具有“减少深度”选项来删除您不再需要处理的目录。

如果这不适合您,您仍然可以对工作副本的某些部分进行更新。您拥有的文件越多,更新就越慢(在 Windows 上,NTFS 似乎对用于更新的锁定策略特别差。Bert Huijben noticed this 并建议修复 - 1.7 版本的 TBA,但您可以重建当前用他的“快速修复”编写代码。

另一种方法是更改​​您的文件系统,如果您可以重新格式化,您可以尝试ext2 IFS driver,但我相信您会对此保持谨慎!

最后一个选项 - 关闭 .svn firectories 的病毒扫描程序,以及服务器上的存储库。如果您在服务器上运行 Apache,请确保您在短时间内保持存活(以防止发生重新身份验证)。还要关闭工作副本目录和卷影副本的索引。 (最后一个没有多大帮助,但您可能会看到我所做的更好的改进,在服务器上关闭 AV 将我的 SVN 响应提高了 10 倍)。

【讨论】:

感谢所有建议。我将不得不对它们进行分析,看看哪种效果最好。 @Talesh - 你是如何描述的? ***.com/questions/2684893/is-there-an-svn-benchmark【参考方案2】:

我们有两个存储库,一个用于我们的代码(经常更改),另一个用于我们的二进制数据(非常大,很少更改)。有时这很痛苦,但在处理代码时值得更快的速度。

我们还有一个我们称之为“每日更新”的 Ruby 脚本,已检查到我们的存储库中,我们每天一大早通过 Windows 计划任务在所有开发 PC 上启动该脚本。它将两个结帐更新到最新版本,然后在本地构建所有内容,所以我们一到早上就准备好了。

我们还没有解决一些问题——例如,当我们的自动化测试运行时,他们检查代码和检查数据之间存在延迟,所以当我们提交更改时对于这两个存储库,CI 服务器有时会获取旧代码和新数据,这会导致测试失败。

当我们向数据存储库提交更改时,我们通常只是告诉其他所有人他们需要更新(我们都坐在同一个房间里)。否则,我们通常不会手动更新数据;我们只是让每日更新脚本保持新鲜。

【讨论】:

【参考方案3】:

为了处理笨重的大小,我会考虑将二进制数据拆分到另一个分支(或者甚至将其完全删除以存储在其他地方),与代码分开。这至少应该会加快速度,尤其是在数据不经常更改的情况下。

我理解人们需要为他们的工具、数据和库提供一个中心位置,但只有一个转储并不好用。

【讨论】:

【参考方案4】:

我会保持简短:

升级到最新版本 (1.6.x)。 1.5.x 也进行了速度优化。 确保每个人都使用相同版本的 TortoiseSVN,该版本是根据服务器的确切版本构建的。我们遇到了很多问题,有些人随心所欲地更新,然后遇到奇怪的问题。 外部在同一存储库上的服务器、存储库和文件夹之间工作。因此,您可以将二进制文件完全移动到另一个存储库/服务器,然后通过外部链接到它们。 重组文件夹,以便您可以稀疏地签出项目并仍然能够高效地工作。基本上每个人都只检查顶部文件夹 + 子文件夹,然后选择性地“更新到修订”他们需要完全检查的文件夹。 创建导出、构建然后提交(或提示提交)的脚本。我有这样的脚本供我使用。在提交之前,我运行脚本并导出我的 wc 然后构建。注意:这将复制完整的 wc!因此,这对于数据量较小(呃)的稀疏签出很有用。 考虑将二进制文件从存储库中移出(我不推荐这样做,但它可能是再次提高生产力的最明智的解决方案)。 请记住,导出不会创建 wc,这意味着与结帐相比,您可以节省 50% 的磁盘空间。因此,如果您进行重组,以便可以导出二进制文件和不经常更新的项目而不是结帐,这将鼓励更多的人“获得完整的东西”,而不是试图浏览其中的一部分。

【讨论】:

【参考方案5】:

我曾是 SCM 经理,处于类似情况。我们有一个包含超过 200K 文件(主要是代码)的项目,其中存在一些相同的问题。我们的解决方案是将存储库拆分为两个版本。一个版本是开发版本,另一个是生产版本。我们使用所有代码的最新和最知名的工作副本为开发版本播种。开发人员从那里开始并进行更改、签入/签出等。一旦他们觉得事情稳定了,管理员(在我们的例子中是构建经理)合并代码并进行测试构建以验证一切正常。如果一切都过去了,那就太好了。如果不这样做,构建管理员将追捕开发人员并严厉惩罚他们。一开始我们遇到了一些相同的问题,比如“它在我的电脑上运行”等,但不久之后,由于殴打和鞭打,这些问题都解决了.....

在特定点,开发代码(ALL WORKING CODE!!!!)被合并回生产运行并发布给客户。

【讨论】:

嗨,马克,您的回答描述了我们当前的设置和常见的 svn 模式,但它并没有真正回答我的问题。我们的开发人员没有使用完整的工作副本,因为更新所有内容需要半小时。 抱歉,没有回答这个问题。这就是我们所做的,以解决您描述的几乎相同的情况。几周之内,我们很少遇到您描述的情况。【参考方案6】:

是否可以将项目分解为可以通过某种插件系统连接的较小项目?

【讨论】:

以上是关于单个大型 SVN 项目的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章

建立和管理开源项目的最佳实践

SVN 布局——最佳实践

最佳实践:单个 Amazon EC2 实例上的多个 django 应用程序

大型项目代码格式化的最佳实践[关闭]

svn协同开发下的dll版本管理最佳实践

集成使用 svn、Jira 和 Bamboo 的任何最佳实践? [关闭]