提交异常文件名导致SVN库无法操作的解决方案

昨天本来应该是挺happy的一天,元旦假期即将开始了,但是由于一个开发同学向SVN库中提交了一个文件名包含特殊字符的文件,导致无法更新,检出,也无法增量同步到备库,所有操作只要碰到那个文件则会被强制中断,日志也无法查看了

最后无奈的只能选择将整个库dump出来,然后使用svndumpfilter来抽取那个有问题的文件,然后将处理后的dump文件重新load到一个新的SVN仓库,具体的方法如下。

首先先找到那个有问题的版本,通过看svn日志,发现整个仓库最新版是2696,而日志只能显示2696和2695两个版本,而2694开始就显示不了日志
svn log
如果选择查看2693以前的版本则一切正常,因此确定有问题的那个文件是2694这个版本提交的
svn log

dump出0到2693的记录,然后dump出2694到head的记录,然后充2694到head的dump文件中抽取那个有问题的文件

1
2
svnadmin dump -r 0:2693 --incremental svnrepo > svnrepo.0.2693.dump
svnadmin dump -r 2694:HEAD --incremental svnrepo > svnrepo.2694.head.dump

然后新建一个svn仓库,将0到2693的记录导入

1
2
svnadmin create svnrepo2
svnadmin load svnrepo2 < svnrepo.0.2693.dump

然后从2694中抽取有问题那个文件,但是由于是文件名中有特殊字符,因此没法直接指定到那个文件,只能指定到该文件所在目录,因此可能会多抽取该文件所在目录的提交的其他文件,暂时没有别的办法,只能解决完后重新提交一次

1
svndumpfilter exclude "branches/xxxxxx/xxx/xxx" < svnrepo.2694.head.dump > svnrepo.2694.head.dump.exclude

执行该命令后,会提示被丢弃的文件有哪些,确定有问题的那个文件被丢弃后,再记录下多丢弃的文件,后面需要重新提交

将处理后的dump文件导入到新的仓库

1
svnadmin load svnrepo2 < svnrepo.2694.head.dump.exclude

完成后,检查仓库版本差异,可以看到2964的提交记录,少了之前丢弃的那几个文件
svn log
确认没问题后,将新库的uuid设置为老库的uuid,重新提交者几个文件即可

1
2
3
4
5
6
svn info http://svnrul/svnrepo
URL: http://svnrul/svnrepo
版本库根: http://svnrul/svnrepo
版本库 UUID: xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

svnadmin setuuid svnrepo2 xxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxxx

这个办法同样适用于想从SVN仓库中彻底删除一个文件

声明: 除非注明,小峰网络遨游记文章均为原创,转载请以链接形式标明本文地址

本博客原创文字只代表本人某一时间内的观点或结论,与本人所在公司没有任何关系。

本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。

第三方若用于商业用途的转载,须取得本人授权。

本文作者:

本文地址:http://xfeng.me/submit-abnormal-file-causes-svn-error-solution/

你可能还对下面文章感兴趣: