从存储库中删除旧的.Svn文件

时间:2015-04-13 13:53:04

标签: svn tortoisesvn

我的.svn存储库变得非常大(5 GB),我们真的不需要回到目前为止。 (找到6个月或一年)。

我还有8 GB .svn文件夹位于从存储库中检出的目录的根目录。

我甚至会满足于#34;重新开始"并保留旧SVN的副本6个月或一年,然后最终按How to backup and restore all the source code in svn?

删除它

4 个答案:

答案 0 :(得分:1)

你的.svn存储库是什么意思?

.svn文件夹主要用于管理签出版本,并且与存储库服务器的历史记录完全无关。

.svn目录包含的信息包括客户端上的文件更改,签出人员以及URL。在1.7版本的Subversion版本中,它甚至保留了签出目录的完整副本。这样,您可以执行差异以查看您所做的更改,而无需与服务器通信。这意味着如果您检出100Mb的文件,那么您的.svn目录也将大约为100Mb。

如果您正在谈论客户端,您只需要检查您需要处理的URL部分。例如,假设您拥有标准的Subversion存储库设置,如下所示:

  • http://%REPO_URL%/trunk
  • http://%REPO_URL%/tags
  • http://%REPO_URL%/branches

trunk下,您拥有所有项目:

  • http://%REPO_URL%/trunk/project_foo
  • http://%REPO_URL%/trunk/project_bar
  • http://%REPO_URL%/trunk/project_fubar

如果我只在http://%REPO_URL%/trunk工作,我不必结帐project_foo。我当然不想结账http://%REPO_URL%这将给我我的整个存储库,包括完全检出的所有分支和标签。 (而且我见过这样做的人)。

Subversion客户端不会检出整个存储库,而只检查项目的单个版本。如果你检查出你需要什么,你可以拥有一个数百TB的存储库,但是你工作的副本可能不超过千兆字节。

我看到的一个问题是人们检查二进制代码 - 第三方库或编译代码。此代码不应该是您的存储库的一部分。如果您使用Java,请使用Maven,Gradle或Ant与Ivy来管理这些第三方库以及您自己的项目可能使用的构建对象。如果您使用.NET,请使用NuGet执行相同的操作。

Subversion以diff格式存储文件。如果一个版本与另一个版本不同,则只有该行更改存储在Subversion中。虽然单个源更改可能是一行,但它可能会对构建的文件产生重大影响。二进制文件占用Subversion存储库的90%以上的空间并不罕见。也就是说,由于二进制文件的原因,大小约为500兆字节的存储库会膨胀到超过50千兆字节。

更糟糕的是,二进制文件很快就会过时,Subversion没有简单的方法来删除过时的版本。此外,Subversion中没有可以帮助您分析二进制文件的工具。两个二进制版本之间的区别是没有意义的。除了构建和检查版本的人之外,作者没有任何相关性 - 不一定是应该联系任何问题的人(这是一种很好的方式来说明责备)。

我希望这能回答你的问题。只检查您需要的内容,您的.svn目录将会小得多。不要在Subversion中存储二进制文件,并且您的.svn目录不必引用它们。如果这些没有帮助,请查看sparse checkouts,这可以消除您不需要的跟踪文件。

答案 1 :(得分:1)

一种选择是使用svnadmin工具的dump命令(如链接中所示),但是给它一个你愿意切断数据的点的起始修订版。这将导致转储启动修订,就好像它是添加了一个新树(即该修订版中的所有文件都是完整的)。这将为您提供最近X个月承诺修订的记录。您可以使用--deltas选项来减小转储文件的大小。请参阅http://svnbook.red-bean.com/en/1.7/svn.ref.svnadmin.c.dump.html

然后,您可以创建一个新的存储库,并通过load命令将此转储文件提供给它,以获得一个新的存储库,其中只包含您想要的最新数据。

就我个人而言,我不建议这样做,因为你永远不知道什么时候旧的数据可以派上用场,但我不知道你的具体情况,这是实现我认为你要求的一种方式。

答案 2 :(得分:0)

看起来您的local working copy混淆了repository,因此不清楚您的具体要求。

如果您使用Subversion 1.7或更新的工作副本,那么它应该只包含根目录下的一个.svn目录。 .svn是一个管理目录,您不应该手动触摸它。实际上,它并不包含您所期望的完整修订历史记录。引用SVNBook:

  

管理目录中的文件可帮助Subversion识别   哪个版本化文件包含未发布的更改,以及哪些   文件已经过时与其他人相关了。工作

我认为.svn目录占用8GB的事实意味着您检出了整个存储库。你是否?你真的需要有整个存储库的工作副本吗?通常,您应该仅检出存储在存储库中的项目的主干或分支,并且此类工作副本的大小要小得多。 @David在他的回答中提供了很好的总结。

答案 3 :(得分:0)

如果你只是想重新开始,我会这样做:

  1. 查看没有任何.svn文件的行李干线:

    $ svn export file:///path/to/current/repository old-trunk
    
  2. 在结账时除去您想要进入新存储库的任何内容。正如其他人所评论的那样,目前你可能在repo中有很多大型二进制文件,它们并不属于那里。

    您可能会发现我的pigs脚本对该搜索有帮助:

     #!/bin/sh
     du -skL "$@" -- * | sort -n
    
  3. 从该清洁提示结帐创建一个新的回购:

    $ svnadmin create /path/to/new/clean/repository
    $ svn import old-trunk file:///path/to/new/clean/repository \
      -m "Tip of old repo trunk as of 2015.04.14, r12345"
    
  4. 暂时将旧的结帐移到一边,然后从新的清理存储库中进行新的检查。 保留旧的签出,直到您确定自己拥有所需的内容为止。即使您保留旧的存储库,也至少有一个已知的工作结帐也是好的。