今天,我在一个工程中增加了很多程序文件,这些文件有个特点:文件名两两相同,但是分列在两个目录中。我使用Mozilla开发平台开发基于XUL的Firefox的扩展(extension),要支持中英双语,所以在目录en-US和zh-CN两个目录下有名字相同的子目录和文件。当提交到SVN时出现错误,发现Eclipse的SVN插件错误的将zh-CN目录下的一个文件当成了en-US目录下的了,结果,出现了混乱,具体原因不详,下面将现象和解决方法记录了下来。
工作环境
我工作在Fedora8下,Eclipse是Fedora Eclipse 3.3.0,安装Fedora8时自动安装的。SVN客户端插件记不清楚是后来安装的还是原来有的,在工作视图中有个“SVN资源库研究”项目。
现象
提交 locale/zh-CN/overlay目录时,错误提示:
条目已存在
svn: “/xxx/locale/zh-CN/overlay”已纳入版本控制
提交locale/en-US/overlay下的文件时,错误提示如下:
文件系统没有条目
svn: 提交失败(细节如下):
svn: 文件找不到: 事务“524-1” ,路径“/xxx/locale/en-US/overlay/文件名”
分析
我感觉到版本管理状态信息在两个地方分别存储:SVN系统内部和Eclipse插件,两者很容易造成不一致。我没有找到确凿的证据,但是感觉到是Eclipse插件报告异常而造成的不一致。基于这个分析,我首先使用SVN命令行命令将SVN中的锁进行清理,删除问题目录,并执行数据库恢复操作。然后将原来备份的程序文件一个一个拷到工作目录中,主要不要拷备.svn目录,然后将其作为新文件和子目录重新上载,到这一步SVN数据库状态已经正确恢复了。然后进入Eclipse,刷新工程,发现涉及的文件和目录都用一个粗+号表示,不知道什么原因,但是发现Eclipse认为这些目录是没有提交的。这也是我认为Eclipse还保留了一份状态信息。提交后全部恢复。
操作命令
首先进入本地工作目录,即包含locale子目录的目录。执行下面操作:
svn: “locale/zh-CN/overlay”尚未纳入版本控制
我没有敢直接强制删除,先到locale/zh-CN目录中尝试删除overlay,执行下面的操作:
D overlay/xxx/xxx
D ......
svn: 在目录“.”中
svn: 在“%$s”中处理命令“%$s”出错
svn: 修改“overlay”的入口出错
svn: “overlay”尚未纳入版本控制
后来我又删除locale/zh-CN下的文件,发现有个文件,暂且称作“文件A”,被锁定了,删除时出现下面的信息:
svn: 运行“svn cleanup”删除锁定 (输入“svn help cleanup”得到用法)
执行释放命令,没有产生输出信息,如下:
接下来就是强制删除locale下的en-US和zh-CN,使用下面的命令:
接下来还在服务器的版本库中执行了恢复命令:
至此,locale下的子目录都已经删除了。然后,手工创建子目录并将程序文件一个一个拷入。在包含locale子目录的目录下用命令行执行svn add locale,提示说locale目录已经加入了版本控制,因为前面我并没有使用svn delete命令删除locale目录,但是我确实使用Eclipse删除了locale目录,而且在“SVN资源库研究”视图下看不到locale目录了,进一步印证SVN和Eclipse分别保留状态信息。于是到locale中执行svn add *将所有的目录加入
然后再到Eclipse下,发现locale目录下的每个文件和目录都用一个粗+号标记,使用菜单命令,将locale下的目录提交给服务器,提示说locale还没有加入,于是来到上级目录,将locale目录提交给服务器,至此,问题解决