有没有办法从svn仓库中删除文件,包括其所有历史记录?当我想要摆脱存储在仓库中的大型二进制文件时,就会出现这个问题。
我知道只有一种方法可以帮助解决这个问题:
- 使用
svnadmin
工具导出repo的所有内容。 - 使用
grep
过滤导出的文件。Grep应该使用文件名并将其写入另一个导出的文件中。 - 使用
svnadmin
导入最后一个导出的文件。
但是这太复杂和不可靠了。也许还有其他的解决方案吗?
有没有办法从svn仓库中删除文件,包括其所有历史记录?当我想要摆脱存储在仓库中的大型二进制文件时,就会出现这个问题。
我知道只有一种方法可以帮助解决这个问题:
svnadmin
工具导出repo的所有内容。grep
过滤导出的文件。Grep应该使用文件名并将其写入另一个导出的文件中。svnadmin
导入最后一个导出的文件。但是这太复杂和不可靠了。也许还有其他的解决方案吗?
使用svndumpfilter
命令使这变得更加简单。细节在subversion文档这里中有详细说明。基本上,为了避免冲突(在此处解释),它会对一个repo dump进行处理,并重新执行每次提交,包括或排除给定的文件前缀。基本语法:
svndumpfilter exclude yourfileprefix < yourdump > yournewdump
可能问题的提问者想要使用Exclude,但您也可以使用Include来提取仓库的子树,使其成为自己的代码库。
Subversion中的最新修订版(非常元)也可以接受glob模式。最近我需要从仓库中删除所有的pdf文件,像这样很容易完成:
svndumpfilter exclude --pattern '*.pdf' < dump > dump_nopdfs
通过调用svndumpfilter help
和svndumpfilter help exclude
可以找到更多的使用信息。
$ cp -R /svn /svnSAVE
-- 转储代码库
$ svnadmin dump /svn/root > svnDump
$ svndumpfilter exclude "/path/file.csv" < svnDump > newSvnDump0
-- {note: should see a message like this}:
-- Dropped 1 node:
-- '/path/file.csv'
$ svndumpfilter exclude "/path/anotherFile.csv" < newSvnDump0 > newSvnDump1
$ rm -rf /svn
-- 重新创建 SVN 目录
$ mkdir -p /svn/root
-- 重新创建SVN
$ svnadmin create /svn/root
$ cat newSvnDump1 | svnadmin load /svn/root
-- 将从已保存副本中的conf文件更新到新副本中...
$ cp /svnSAVE/root/conf/* /svn/root/conf
我同意McDowell的提议,但我建议你考虑用简单包含已删除条目哈希值的文本文件替换大文件。
如果你不小心将一个构建目录中的大量.o文件检入,这种方法可能不适用。但是,如果你从一个包含你需要的一堆二进制工件和你不需要的一堆二进制工件的目录中删除一堆二进制工件,你就有很高的风险犯下昂贵的错误。至少要考虑从主干和大多数分支中将它们删除,但是留下一个特性分支,其中包含原始二进制文件的哈希值的占位符文本文件。这样至少足以找出发生了什么事,验证不应被删除的迷路副本是否为正确的文件,并将其重新放回版本控制。
当然,在你考虑执行任何这些操作之前,一定要将整个代码库备份到像几个M-Discs这样的只读存储介质中。
svnadmin dump > myDump; svndumpfilter exclude myFile < myDump > newDump; cat newDump | svnadmin load myRepositoryURL;
对吗? - Shawnsvnadmin dump 仓库路径 > old.dump; svndumpfilter exclude 文件前缀 < old.dump > new.dump; rm -rf 仓库路径; svnadmin create 仓库路径; svnadmin load 仓库路径 < new.dump;
主要的区别在于,在加载筛选后的转储文件之前,您必须删除并重新创建仓库。请注意,path_to_repository 是服务器上仓库的路径,而不是您的工作副本的路径。 - Shawn