【问题标题】:Delete older .Svn files from reposititory从存储库中删除旧的 .Svn 文件
【发布时间】:2015-04-14 01:36:01
【问题描述】:

我的 .svn 存储库变得非常大(5 GB),我们真的不需要回到这么远的地方。 (找到 6 个月或一年)。

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

我什至会满足于“重新开始”并将旧 SVN 的副本保留 6 个月或一年,然后最终按照 How to backup and restore all the source code in svn? 删除它

【问题讨论】:

    标签: svn tortoisesvn


    【解决方案1】:

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

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

    .svn 目录包含诸如客户端上的哪些文件已更改、谁进行了签出以及 URL 等信息。在 Subversion 1.7 之前的版本中,它甚至保留了检出目录的完整副本。这样,您可以在不与服务器对话的情况下进行比较来查看所做的更改。这意味着,如果您检出 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

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

    Subversion 客户端不会检出整个存储库,而只是检出项目的单个版本。如果你检查你需要的东西,你可能有一个数百 TB 大小的存储库,但你的工作副本可能不会超过 1 GB。

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

    Subversion 以 diff 格式存储文件。如果一个版本与另一个版本相差一行,则只有该行更改存储在 Subversion 中。尽管单个源更改可能是一行,但它可能会对构建的文件产生重大影响。二进制文件占用 Subversion 存储库 90% 以上的空间并不罕见。也就是说,一个大约 500 MB 大小的存储库会因为二进制文件而膨胀到 50 GB 以上。

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

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

    【讨论】:

      【解决方案2】:

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

      然后,您可以创建一个新的存储库并通过 load 命令将此转储文件输入其中,以创建一个新的存储库,其中仅包含您想要的最新数据。

      我个人不建议这样做,因为您永远不知道旧数据何时会派上用场,但我不知道您的确切情况,这是实现我认为您所要求的一种方法。

      【讨论】:

        【解决方案3】:

        您似乎将local working copyrepository 混淆了,因此不清楚您到底在问什么。

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

        管理目录中的文件帮助 Subversion 识别 您的哪些版本化文件包含未发布的更改,以及哪些 文件对于其他人的工作来说已经过时了。

        我猜.svn 目录占用 8GB 的​​事实意味着您检查了整个存储库。你是否?您真的需要拥有整个存储库的工作副本吗?通常你应该只检出存储在存储库中的项目的主干或分支,这样的工作副本的大小会小得多。 @David 在他的回答中对此做了很好的总结。

        【讨论】:

          【解决方案4】:

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

          1. 检查没有任何.svn 文件的树干尖端:

            $ svn export file:///path/to/current/repository old-trunk
            
          2. 从结帐中剔除您不希望出现在新存储库中的任何内容。正如其他人所评论的那样,您目前可能在 repo 中有很多不属于那里的大型二进制文件。

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

             #!/bin/sh
             du -skL "$@" -- * | sort -n
            
          3. 从干净的提示结帐中创建一个新的 repo:

            $ 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. 暂时将旧结帐移到一边,然后从新的干净存储库中进行新的结帐。 保留旧的签出,直到您确定自己拥有所需的东西。 即使您也保留旧的存储库,最好也至少拥有一个已知的有效签出。 p>

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2023-04-09
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多