清理Subversion仓库的最佳方法是什么?

10

我有一个不断增长的代码仓库,包含大约十几个项目,我使用TortoiseSVN来维护这些项目(因为我完全是新手,还不知道所有的细节)。我用来存放代码仓库的空间有限,所以我想要备份它,然后删除一些较老的版本。例如,如果某个项目版本号为50,那么我只想保留50、49、48这三个版本。


2
不,将代码库移动到更大的空间。 - yfeldblum
你真的应该阅读《使用Subversion进行版本控制》这本书(免费的啤酒)以更好地理解版本控制的重要性。书籍网址为http://svnbook.red-bean.com/。 - Ryan P
3个回答

13
删除旧版本有点违背版本控制的初衷,但您可以先将要保留的版本导出,然后将它们放入一个新仓库中并删除旧仓库。
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 来包含/排除您想要的特定部分等。 Subversion 的常见问题解答中还有一些关于删除的信息可能会对您有用。

这不仅仅会从版本48到50中转储特定的提交吗?我认为他正在寻找在版本48时存储库的状态,而不仅仅是那里的提交。 - John Feminella
我刚试了一下,这并不完全符合原帖作者的要求:它只获取那些版本之间的提交。你无法得到“仓库在版本48的状态,然后跟随所有必要的提交以达到版本50”的结果。 - John Feminella
约翰:你是怎么运行它的?对我来说它很好用。它会完全转储指定的第一个版本,然后将提交转储到指定的最后一个版本。只有在指定“--deltas”开关时,它才会仅转储提交。 - Rich Adams

5

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

简短的答案是不行。Subversion和CVS的工作方式是保留所有更改历史记录,包括已删除文件、二进制文件等。每个版本都依赖于上一个版本,因此您不能只是在中间某个地方删除一个版本,否则会破坏存储库。如果您的空间不足,有两件事情可以做:1)删除模块,然后使用仅HEAD版本重新创建它,这将清除所有旧版本(但您将失去提交历史记录)。2)更好的选择-升级到更高的计划。:-)由于Git的服务器端存储要求少得多,因此这不是很大的问题。

如何完全从存储库历史记录中删除文件?

有特殊情况下,您可能希望销毁文件或提交的所有证据。(也许有人意外提交了机密文件。)这并不容易,因为Subversion的设计意图是永远不会丢失信息。修订是不可变树,建立在彼此之上。从历史记录中删除修订将引起一个连锁反应,在所有后续修订中创建混乱,并可能使所有工作副本无效。

不过,这个项目打算有一天实现一个svnadmin obliterate命令,可以完成永久删除信息的任务。(请参见问题516。)

与此同时,您唯一的选择是svnadmin倾销存储库,然后将dump文件通过svndumpfilter(排除错误路径)传递到svnadmin load命令中。请参阅Subversion书第5章以了解详细信息。

引用自:

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

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


1

按照您所描述的方式,没有办法在特定修订版本上“剪切”存储库。您可以做的是,在所需的修订版本处svn export整个存储库,然后将其导入新存储库,然后将日志文件中该版本之后的提交重放到新存储库中。这并不容易。

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

请注意,您所描述的内容或多或少违反了Subversion的原则:它应该保留所有内容。如果您经常遇到此类问题,请考虑建立更好的签入实践。或者考虑使用Git,它使这种实验几乎免费。


在Subversion中,分支(svn copy)几乎是免费的,无论是时间还是空间。从Subversion 1.6开始,分支之间的补丁合并使用表示共享来避免数据重复。我不知道你所说的“svn中的分支占用空间昂贵”的意思。 - Wim Coenen
一般来说,使用svn-dumpfilter进行操作比使用git-filter-branch和/或.git/info/grafts进行操作更加耗费精力。我已经对svn-dumpfilter进行了大量修补,以支持更多种类的历史编辑,但它仍然不是一个好用的工具。 - emk
@wcoenen:你说得对。我表达得不太好。@emk:同意,这很糟糕。现在我主要使用Git。 - John Feminella
说实话,我只使用Subversion是因为我需要在不同的机器上(家里和工作)同步我的代码,而这是通过USB存储设备完成的一种不错的方式。但我发现SVN有点烦人,因为它不强制检出,合并有时也有些可疑。 - Jimbetastic
当我忘记在一台机器上提交并在另一台机器上更改代码时,像SourceSafe这样的功能非常适合我的简单需求(但SS不太稳定)。 - Jimbetastic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接