我只是想编写一个shell脚本,以一种易于实现的方式实现删除功能(外部,使用建议的方式,但是自动化)。
这就是我的想法:
在客户端
svn list -R > file-list
。grep XXX file-list>>files-to-delete
。files-to-delete
传输到服务器
醇>
在服务器上
svnadmin dump /path/to/repos > repos-dumpfile
,也可以将其保留为备份。cat repos-dumpfile | svndumpfilter exclude $file > new-dumpfile
svnadmin create new-name; svnadmin load new-name < new-dumpfile
这会有用吗?怎么会失败?还有其他想法吗?
答案 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?