解决svn文件类型报错

上周末将svn服务器从虚拟机迁移到docker环境中后,今天有同事反馈有一个代码库,在提交代码时,我们的代码检查插件报错了:

1
svnlook:期望文件系统格式在1到4之间,发现格式6

收到这个反馈后,我其实是很慌的,因为我对于svn其实不大熟悉,之前虽然搞了一阵,但是没有复习,都忘光了,连基本的svn命令也不记得了。不过考虑到周末迁移过程中总结的一些问题,我还是准备静下心来,尝试把这个问题给解决掉。

遇到问题,先整理思路,不要盲目下手。靠逻辑解决问题,而不是靠猜测解决问题。

首先,我通过网上搜索这个问题,再加上自己的分析,猜测可能导致这个问题的原因有如下几种:

1、代码库目录不对

2、apache中的authz和passwd不对

3、authz和passwd文件权限不对

4、当初创建这个代码库的时候,命令没有加兼容低版本svn的参数

然后逐一对这几个猜测进行验证:1和2通过查看svn的web管理后台,确认了不是该原因;3也说不通,其他代码库都是正确的,这个代码库没有在迁移过程中做处理,应该也是正确的。

然后感觉可能是原因4。但是之前一直都能用,为什么现在又用不了了呢?

到这里思路被卡住了一会儿,然后我感觉这样猜测不是办法,还是得弄清楚根本原因。因此我准备从svn的文件格式入手。

format是什么?每个数值代表什么含义?

我通过测试服务器上安装的svn进行了测试,发现:

1.6的svn,创建的代码库,这个数值是4

1.7的svn,创建的代码库,这个数值是4

1.8的svn没有安装,没有校验

1.9的svn,创建的代码库,这个数值是7

然后根据以前的笔记,发现svn在1.9版本,对于数据存储的文件格式做了大升级,因此这个format应该是和数据存储格式息息相关的。

再结合上面的猜测4,那么答案就呼之欲出了:这个报错的代码库创建的时候,用的是1.8版本的svn,因此里面的db/format文件标注的文件格式是6;而上周升级svn的时候,可能我们没有给svnlook创建正确的软链接,导致系统默认的svnlook指向的是1.6版本的,还无法识别format=6的这种数据格式,因此报错。

然后我去GX那里查看线上服务器的信息,发现确实系统默认的svnlook是1.6版本的,我将其替换为1.8版本的svnlook后,该代码库就可以正常提交代码了。

本来我想到这里这个问题就结束了,然后GX提到一个问题:看docker构建命令,已经创建过1.8版本的svnlook的软链接了,为什么系统的svnlook还是1.6版本的?

思考:GX解决问题,务必会从根源上进行解决,要把每一个为什么都弄清楚。这种精神是我需要学习的。

然后经过排查,发现是因为我们yum安装过1.6版本的svn,把这个1.8版本svn的软链接给替换掉了。然后WHB重新修改docker构建命令,把这个问题修复了。

至此,问题追溯到了源头,从根源上予以解决了。

思考:其实很多问题并没有想象的那么难,我感觉难是因为我没有把它摸透,因此应用一个东西,一定要把它吃透,否则就会给自己挖坑。