Svn 颠覆抹杀特征
我正在考虑编写一个shell脚本,以一种简单的方式实现擦除功能(外部,使用建议的方式,但自动化) 以下是我的想法: 在客户端上Svn 颠覆抹杀特征,svn,svnadmin,svndump,svndumpfilter,Svn,Svnadmin,Svndump,Svndumpfilter,我正在考虑编写一个shell脚本,以一种简单的方式实现擦除功能(外部,使用建议的方式,但自动化) 以下是我的想法: 在客户端上 svn列表-R>文件列表 以多种方式筛选文件列表,如grep创建“要删除的文件”,如一组grep XXX file list>>要删除的文件 使用scp将要删除的文件传输到服务器 在服务器上 转储存储库svnadmin Dump/path/to/repos>repos dumpfile,这也可以作为备份保存 过滤转储文件,对于“要删除的文件”中的每个单词,执行:cat
svn列表-R>文件列表
grep XXX file list>>要删除的文件
文件传输到服务器
svnadmin Dump/path/to/repos>repos dumpfile
,这也可以作为备份保存cat repos dumpfile | svndumpfilter exclude$file>new dumpfile
svnadmin Create new name;svnadmin加载新名称
这样行吗?它怎么会失败呢?还有其他想法吗?是的,这个脚本可以用。 但通常不会删除那么多文件。通常只有在意外提交机密信息时才需要删除
你确定要对这么多文件使用“删除”吗?我认为
cat new dumpfile | svndumpfilter exclude$file>new dumpfile
是一个危险的例子。新的转储文件将不会被完全处理,其内容可能会丢失,不是吗
从下面的注释中可以看出:新的转储文件肯定会丢失,因为shell甚至在启动命令之前就将其删除(截断为零长度)。不同版本中具有相同路径的文件如何?例如,如果您提交
/trunk/foo
,然后将其重命名为/trunk/bar
,然后在/trunk/foo
处提交要删除的其他内容。您不想丢失现在的/trunk/bar
的历史记录。也许svndumpfilter
支持?我有一个类似但稍微复杂的需求。在过去的几百次修订中,一些非常大(>1GB)的示例数据文件被提交到存储库中。然后他们被移动,最终从头部删除。但是,它们仍处于修订历史中,这使得存储库非常庞大。我无法使用svn list-R
,因为这些文件不再出现在工作副本中
但是,svn list
可以提供一个修订参数。我不确定这些大文件是什么时候签入的,但我知道那是2000年修订版之后的某个时候。我还有一个文件名列表。因此,我使用了一个简单的循环和uniq来生成要删除的文件:
cd $working_copy
for rev in {2000..2437}; do
svn ls -R -r$rev | grep -f ~/tmp/big-file-names >> ~/tmp/file-paths;
done
cat ~/tmp/file-paths | sort | uniq > ~/tmp/files-to-delete
cd ~/tmp
# You should inspect "files-to-delete" to see if it looks reasonable!
cat dumpfile | svndumpfilter exclude `cat files-to-delete` > dumpfile.new
为什么你会说“不会被完全处理,它的内容可能会丢失”?我认为,对于一个大文件,读和写都不起作用。我想即使是小文件,不是吗?“cat file | do|u something>file”看起来会覆盖自身,这可能会在完全处理之前发生。我想,是的,这肯定会破坏新的转储文件。不管它有多大:shell将在启动svndumpfilter之前设置到新dumpfile的输出重定向,并将截断新的dumpfile。我认为,可能是输入错误,他只是指“cat dumpfile…”$file>new dumpfile'否则为什么称为new dumpfile而不仅仅是dumpfile?@EFraim:等等,你否决了我的答案,因为我指的是明显的数据损坏?如下所述,cat new dumpfile | svndumpfiler exclude$file>new dumpfile将不起作用,因为它会破坏新的dumpfile。切勿使用同一文件进行读写(应该是显而易见的…)。删除树的一个原因可能是,如果一个人签入第三方组件后才决定许可证出于任何原因是不可接受的。。。