我有一个不断增长的代码仓库,包含大约十几个项目,我使用TortoiseSVN来维护这些项目(因为我完全是新手,还不知道所有的细节)。我用来存放代码仓库的空间有限,所以我想要备份它,然后删除一些较老的版本。例如,如果某个项目版本号为50,那么我只想保留50、49、48这三个版本。
我有一个不断增长的代码仓库,包含大约十几个项目,我使用TortoiseSVN来维护这些项目(因为我完全是新手,还不知道所有的细节)。我用来存放代码仓库的空间有限,所以我想要备份它,然后删除一些较老的版本。例如,如果某个项目版本号为50,那么我只想保留50、49、48这三个版本。
svnadmin dump /path/to/current/repo -r48:50 > svn.dump
svnadmin create /path/to/new/repo
svnadmin load /path/to/new/repo < svn.dump
我可以删除旧版本或存储库以释放存储空间吗?
简短的答案是不行。Subversion和CVS的工作方式是保留所有更改历史记录,包括已删除文件、二进制文件等。每个版本都依赖于上一个版本,因此您不能只是在中间某个地方删除一个版本,否则会破坏存储库。如果您的空间不足,有两件事情可以做:1)删除模块,然后使用仅HEAD版本重新创建它,这将清除所有旧版本(但您将失去提交历史记录)。2)更好的选择-升级到更高的计划。:-)由于Git的服务器端存储要求少得多,因此这不是很大的问题。
如何完全从存储库历史记录中删除文件?
有特殊情况下,您可能希望销毁文件或提交的所有证据。(也许有人意外提交了机密文件。)这并不容易,因为Subversion的设计意图是永远不会丢失信息。修订是不可变树,建立在彼此之上。从历史记录中删除修订将引起一个连锁反应,在所有后续修订中创建混乱,并可能使所有工作副本无效。
不过,这个项目打算有一天实现一个svnadmin obliterate命令,可以完成永久删除信息的任务。(请参见问题516。)
与此同时,您唯一的选择是svnadmin倾销存储库,然后将dump文件通过svndumpfilter(排除错误路径)传递到svnadmin load命令中。请参阅Subversion书第5章以了解详细信息。
引用自:
按照您所描述的方式,没有办法在特定修订版本上“剪切”存储库。您可以做的是,在所需的修订版本处svn export
整个存储库,然后将其导入新存储库,然后将日志文件中该版本之后的提交重放到新存储库中。这并不容易。
或者,如果您只想从存储库中排除一些混乱的路径,并且您可以直接访问存储库所在的文件系统,则可以使用svnadmin
和svndumpfilter
的组合来选择所需的路径并修剪所有其他路径。
请注意,您所描述的内容或多或少违反了Subversion的原则:它应该保留所有内容。如果您经常遇到此类问题,请考虑建立更好的签入实践。或者考虑使用Git,它使这种实验几乎免费。