Subversion Obliterate功能

时间:2009-02-18 11:30:37

标签: svn svnadmin svndump svndumpfilter

我只是想编写一个shell脚本,以一种易于实现的方式实现删除功能(外部,使用建议的方式,但是自动化)。

这就是我的想法:

在客户端

  1. svn list -R > file-list
  2. 以多种方式过滤文件列表,例如grep,以创建文件“files-to-delete”,类似于一组grep XXX file-list>>files-to-delete
  3. 使用scp。
  4. files-to-delete传输到服务器

    在服务器上

    1. 转储存储库svnadmin dump /path/to/repos > repos-dumpfile,也可以将其保留为备份。
    2. 过滤转储文件,对于“要删除的文件”中的每个字,执行:cat repos-dumpfile | svndumpfilter exclude $file > new-dumpfile
    3. 创建新存储库并将新文件加载到其中svnadmin create new-name; svnadmin load new-name < new-dumpfile
    4. 这会有用吗?怎么会失败?还有其他想法吗?

4 个答案:

答案 0 :(得分:7)

是的,该脚本可行。 但通常你不会删除那么多文件。通常只有在您意外提交机密信息时才需要删除。

您确定要对这么多文件使用删除吗?

答案 1 :(得分:6)

我认为cat new-dumpfile | svndumpfilter exclude $file > new-dumpfile是一个危险的例子。 new-dumpfile将不会被完全处理,它的内容可能会丢失,不是吗?

从下面的评论:new-dumpfile肯定会丢失,因为即使在启动命令之前shell也会破坏它(截断为零长度)。

答案 2 :(得分:4)

我有一个类似但稍微复杂的要求。过去几百次修订,一些非常大(> 1GB)的样本数据文件被提交到存储库。然后他们四处移动并最终从HEAD中删除。但是它们仍处于修订历史中,使得存储库变得非常庞大。我无法使用svn list -R,因为文件不再出现在工作副本中。

但是,svn list可以给出修订参数。我不确定何时检查了大文件,但我知道它是在修订版2000之后的某个时候。我还有一个文件名列表。所以我使用了一个简单的循环和uniq来生成我的files-to-delete

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

答案 3 :(得分:0)

在不同版本中具有相同路径的文件怎么样?例如,如果您提交/trunk/foo,则将其重命名为/trunk/bar,然后在/trunk/foo处提交您想要删除的其他内容。你不想丢失现在/trunk/bar的历史。也许svndumpfilter支持peg revisions