【问题标题】:What's the best way to clean up a Subversion repository?清理 Subversion 存储库的最佳方法是什么?
【发布时间】:2012-03-10 15:48:48
【问题描述】:

我有一个不断增长的存储库,其中包含我使用 TortoiseSVN 维护的十几个项目(因为我对此完全陌生,还不知道来龙去脉)。我必须保存存储库的空间是有限的,所以我想备份它,然后删除一些旧版本。比如一个项目是50版本,我想只保留50,49,48。

【问题讨论】:

  • 没有。将存储库移动到更大的空间。
  • 您真的应该阅读svnbook.red-bean.com 上的“带有Subversion 的版本控制”一书(像啤酒一样免费),以更好地理解版本控制的意义。

标签: svn version-control


【解决方案1】:

删除旧版本有点破坏版本控制的意义,但您可以直接转储您想要保留的版本,然后将它们放入新的存储库中,然后删除旧的。

svnadmin dump /path/to/current/repo -r48:50 > svn.dump
svnadmin create /path/to/new/repo
svnadmin load /path/to/new/repo < svn.dump

或使用svndumpfilter 包含/排除您想要的特定位等。在 svn 常见问题解答中还有一些关于removal 的信息,您可能会觉得有用。

【讨论】:

  • 这不是只会转储版本 48 到 50 中的特定 commits 吗?我认为他正在寻找版本 48 时的存储库状态,而不仅仅是那里的提交。
  • 我刚试过这个。这根本不符合我认为 OP 想要的:它从这些修订中获取提交。您不会获得“版本 48 的存储库状态,然后是使其到版本 50 所需的所有提交。”
  • 约翰:你是怎么运行它的?这对我来说可以。它完全转储指定的第一个修订版,然后提交到指定的最后一个修订版。仅当您指定“--deltas”开关时,它才会转储提交。
【解决方案2】:

我可以删除旧版本或存储库以释放存储空间吗?

简短的回答是否定的。 Subversion 和 CVS 的工作方式是它们保留完整的更改历史记录,包括已删除的文件、二进制文件等。每个修订版都依赖于最后一个修订版,因此您不能只是在中间的某个地方删除修订版,或者您损坏您的存储库。如果空间不足,您可以做两件事:1) 删除您的模块,然后仅使用 HEAD 修订版重新创建它,这将清除所有旧修订版(但您将丢失提交历史记录)。 2)更好的选择-升级到更高的计划:-)。这对 Git 来说不是什么问题,因为它的服务器端存储需求要少得多。

如何从存储库的历史记录中彻底删除文件?

在某些特殊情况下,您可能希望销毁文件或提交的所有证据。 (也许有人不小心提交了一份机密文件。)这并不容易,因为 Subversion 被刻意设计为永远不会丢失信息。修订是相互依赖的不可变树。从历史中删除修订会导致多米诺骨牌效应,在所有后续修订中造成混乱,并可能使所有工作副本无效。

然而,该项目计划在某一天实施一个 svnadmin obliterate 命令,该命令将完成永久删除信息的任务。 (见第 516 期。)

与此同时,您唯一的办法是 svnadmin 转储您的存储库,然后通过 svndumpfilter(不包括错误路径)将转储文件传送到 svnadmin 加载命令中。有关这方面的详细信息,请参阅 Subversion 书籍的第 5 章。

引自:

http://subversion.apache.org/faq.html#removal

http://codesion.com/benefits/faq.htm#deleterevisions

【讨论】:

    【解决方案3】:

    没有办法以您描述的方式“剪切”特定修订版的存储库。您可以做的是 svn export 所需修订版的整个存储库,然后将其导入新存储库,然后将日志文件中的修订版的提交重播到新存储库中。这不是小事。

    或者,如果您只想从存储库中排除一些杂乱的路径,并且您可以直接访问存储库所在的文件系统,则可以使用svnadminsvndumpfilter 的组合来选择路径你想要并修剪所有其他人。

    请注意,您所描述的内容或多或少与 Subversion 的观点背道而驰:它应该保留所有内容。如果您经常遇到此问题,请考虑建立更好的签到实践。或者考虑使用Git,这使得这种实验几乎免费。

    【讨论】:

    • subversion 中的分支(svn 复制)在时间和空间上几乎都是免费的。从 subversion 1.6 开始,分支之间的补丁合并使用表示共享来避免数据重复。我不知道您所说的“分支在 svn 中的空间成本很高”是指什么。
    • 一般来说,使用 svn-dumpfilter 比使用 git-filter-branch 和/或 .git/info/grafts 更费力。我已经对 svn-dumpfilter 进行了大量修补以支持更多类型的历史编辑,但它仍然不是一个好工具。
    • @wcoenen:你是对的。我根本没有说得很好。 @emk:同意,这太糟糕了。现在我主要使用 Git。
    • 老实说,我只使用 Subversion 是因为我需要在各种机器(家庭和工作)上同步我的代码,这是通过 USB 记忆棒实现此目的的好方法。我觉得 SVN 有点烦人,因为它不会强制结帐,而且有时合并似乎有点可疑。
    • ... 就像我忘记在一台机器上提交并在另一台机器上更改代码一样。对于我的简单需求,SourceSafe 类型的功能很棒(但 SS 不是很稳定)。
    猜你喜欢
    • 1970-01-01
    • 2011-03-25
    • 1970-01-01
    • 1970-01-01
    • 2019-12-24
    • 2016-07-28
    • 1970-01-01
    • 2013-05-23
    • 2010-09-07
    相关资源
    最近更新 更多