【问题标题】:Subversion Obliterate feature颠覆消除功能
【发布时间】:2010-10-08 07:44:56
【问题描述】:

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

这是我的想法:

在客户端

  1. svn list -R > file-list
  2. 使用 grep 等多种方式过滤文件列表以创建文件“要删除的文件”,类似于一组 grep XXX file-list>>files-to-delete
  3. 使用 scp 将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

这行得通吗?怎么会失败?还有其他想法吗?

【问题讨论】:

  • 如下所述,cat new-dumpfile | svndumpfilter exclude $file > new-dumpfile 将不起作用,因为它会破坏 new-dumpfile。永远不要使用同一个文件进行读写(应该很明显......)。

标签: svn svnadmin svndump svndumpfilter


【解决方案1】:

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

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

【讨论】:

  • 删除一棵树的一个示例原因可能是,如果一个人签入第三方组件只是为了稍后决定许可证由于某种原因是不可接受的......
【解决方案2】:

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

从下面的 cmets 来看:new-dumpfile 肯定会丢失,因为 shell 会在启动命令之前破坏(截断到零长度)它。

【讨论】:

  • 为什么说“不会被完全处理,它的内容可能会丢失”?
  • 我认为,对于一个大文件,读取和同时写入它是行不通的。我想即使是小文件,不是吗? “cat file | do_something > file” 看起来它会覆盖自己,这可能在完全处理之前发生。我想。
  • 是的,当然,这会破坏新的转储文件。不管它有多大:shell 会在启动 svndumpfilter 之前设置输出重定向到 new-dumpfile,并截断 new-dumpfile。
  • 我想,也许,这是一个错字,他的意思是 'cat dumpfile ... $file > new-dumpfile' 否则为什么叫 new-dumpfile 而不是只是转储文件
  • @EFraim:等等,你对我的回答投了反对票,因为我指的是明显的数据损坏?
【解决方案3】:

我有一个类似但稍微复杂一点的要求。在过去的数百次修订中,一些 非常 大 (>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

【讨论】:

    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-11
      相关资源
      最近更新 更多