有没有办法从svn存储库中删除文件,包括其所有历史记录?当我想摆脱驻留在repo中的大型二进制文件时,会出现这个问题。
我知道在这种情况下只有一种方法可能会有所帮助:
svnadmin
实用程序转储所有回购。grep
过滤转储的文件。 Grep应该使用filename并写入其他dump-file svnadmin
但这太复杂,不可靠。也许有另一种解决方案?
答案 0 :(得分:33)
使用命令svndumpfilter
最近变得更加直截了当。详细信息可在subversion文档here中找到。基本上,为了避免冲突(解释here),它需要一个repo转储并重做每次提交,包括或排除给定的文件前缀。基本语法:
svndumpfilter exclude yourfileprefix < yourdump > yournewdump
排除可能是问题提供者正在寻找的内容,但您也可以使用include来提取repo的子树,以便将其作为自己的存储库进行分割。
颠覆(非常元)中最新的subversion版本也可以采用glob模式。我最近不得不从repo中删除所有pdf,它很容易就像这样:
svndumpfilter exclude --pattern '*.pdf' < dump > dump_nopdfs
可以通过致电svndumpfilter help
和svndumpfilter help exclude
找到更多使用信息。
答案 1 :(得分:6)
但这太复杂,不可靠。
我不知道为什么这不应该被认为是可靠的。但是,如果你想彻底摆脱文件,历史和所有,无论这个文件是以前版本的影响是什么,只有一种方法这样做,这种方式确实很复杂。这是正确的。 SVN是一个只有一个目标的工具:永远不会丢失任何文件,即使它已被删除。强迫它做其他事情应该很难。
答案 2 :(得分:3)
我遇到了类似的问题,除了我需要删除多个文件,而不仅仅是一个文件,而且我们还在Subversion 1.6上,它不支持--patern指令。
- 备份当前SVN
$ cp -R /svn /svnSAVE
- dump repository
$ 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
- 删除旧的svn
$ 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
现在,存储库不应包含2个大文件&#34; file.csv&#34;和&#34; anotherFile.csv&#34;
答案 3 :(得分:0)
我同意McDowell的建议,但是我建议您考虑用一个文本文件替换大文件,该文件只包含已删除条目的文件哈希值。
如果您有大量的.o文件意外地检查了构建目录,这可能不合适。但是如果你要从包含一堆你想要的二进制工件的目录中删除一堆你不想要的二进制工件,那么你很有可能犯下一个代价高昂的错误。至少,请考虑从主干和大多数分支中删除它们,但留下一个功能分支,其中包含占位符文本文件和原始二进制文件的哈希值。这至少足以弄清楚以后发生的事情,验证不应该删除的杂散副本实际上是正确的文件,并将其重新置于版本控制之下。
而且,显然,在您考虑做任何这些事情之前,将整个回购设备备份为只读,就像几张M-Disc或其他东西一样。