SVN拉取原先是版本管理的一个功能,但遇到Excel文件的冲突就成为了一个阻碍工作的痛点。而程序化的Excel文件冲突合并就提上了开发日程。
本文将要阐述实现一键解决SVN拉取和Excel冲突合并问题。
在Excel文件目录,可以通过双击"全量拉取合并.bat"文件启动,会有黑窗口提示进度
功能详解 执行流程我们来看一下执行流程
流程并不复杂,下面按照流程依次介绍
SVN拉取通过代码拉取SVN,需要几个前提
- 安装SVN,并且将SVN的安装路径加入到系统PATH中需要连接网络,并且账号和权限都满足要求拉取的目录不处于lock状态(需要cleanup的情况)
作为游戏开发者,上述条件一般都是满足的,不满足也会给出提示。
代码拉取SVN的原理是
- 通过代码启动svn.exe进程通过svn的命令行指令,实现对指定目录的拉取通过svn进程运行结果,解析出成功与否,拉取的文件,冲突的文件
如果文件有冲突,我们能在目录下看到这样的冲突文件
三个文件,依次是自己修改的文件版本(mine),上次同步的本地版本(local),其他人提交的版本(their)
接着,需要对这三个文件按特定逻辑合并
拿到一个冲突的Excel文件,我们需要先解析Excel文件的结构
上图中,Excel文件会有多个sheet表,表分为数据表和非数据表,按不同策略合并
注:双版本修改指mine和their都有修改,单版本修改指mine和their中一方有修改
数据表,指符合编辑规范需要导出为游戏数据的表,合并按如下规范
Excel文件对每张数据表进行一次检测头部字段,以列为合并单元,以“表头”为合并key
合并以字段为单位的单版本的新增、删除、修改合并以字段内数据为单位的单版本的数据修改以字段内数据为单位的双版本的数据修改,提示合并失败 数据内容,以行为合并单元,以“id”为合并key
合并以条目为单位的单版本的新增、删除、修改合并以条目内数据为单位的单版本的数据修改以字段内数据为单位的双版本的数据修改,提示合并失败 非数据表,指除数据表外的表,以“sheet表名”为合并key,合并按如下规范
Excel文件对所有非数据表进行一次检测合并以sheet表为单位的单版本增加、删除、修改不合并sheet表本身的内容以sheet表为单位的双版本的修改,提示合并失败
PS:为什么全部非数据表只有一次检测呢?
由于非数据表,一般是说明性内容,没有特定的格式,对于二维表的合并很难制定合并规范,所以只进行sheet表级别的增删改,而数据表有明确的格式,能够通过逻辑分辨出头部字段和数据内容的增删改,为合并提供了逻辑基础
一个Excel文件会检测N+1次,N为数据表数量,1为所有非数据表检测一次。也就是说上图检测5(4+1)次
每一次检测,都是独立的,也就是每次检测不论成功失败,不影响其他的检测和合并的执行检测成功的,会得出需要增删改的操作,然后执行Excel文件数据合并检测失败的,会给出提示信息对全部检测并合并完成的Excel文件,会进行合并后处理对有一个或多个检测失败的Excel文件,会保留冲突文件需要手动解决 Excel文件合并变更操作
当一次检测为成功,就会执行Excel文件的一次合并(一张数据表或所有非数据表)
合并是基于mine版本,通过比对their和local版本内容,执行在mine上需要增删改的操作。
也就是说,对于合并,对于绝大多数数据是不进行修改,只对个别内容进行变动。
PS:为什么是基于mine版本呢?而不是local呢?
由于开发环境的不稳定性,很有可能对一个Excel文件多次进行合并,人工修改后,也可执行合并,所以需要保证多次执行的结果应当是一致的。
也就是说执行一次合并后,由于mine上已经有their的修改,不会再检测出需要变动的操作。再次合并也不会出现改动
一次Excel文件合并,需要按以下流程
备份操作,是为了保留现场,出现问题可以查找回溯还原保存Excel文件,会将修改后的文件保存回原始文件路径
几次检测合并,就会读取保存几次,因为每次检测合并都是独立的 执行变更操作,在检测的时候,会得到需要变更的操作,然后执行操作
变更操作,有以下逻辑的细分
对所有非数据表,执行的对sheet表的增加、删除和替换对一张数据表,头部字段和数据内容有所不同
头部字段的变更操作,会增加、删除、修改二维表列的数量和数据数据内容的变更操作,会增加、删除、修改二维表行的数量和数据由于列的增加和行的增加同时发生时,会出现数据缺失,由默认值填入 合并后处理
合并后处理,是指Excel文件的所有检测和合并都执行结束后,解决冲突文件的行为
PS:对于一个Excel文件,检测并合并会执行N+1次,合并后处理只会进行一次
对一个Excel文件,有失败和成功2种情况,执行不同逻辑
失败,指一个Excel文件有一个或多个检测失败
将失败原因收集,并给出准确冲突位置和信息,提醒使用者手动解决冲突保留三个版本文件,其中mine版本已经不是最初版本了
由上文,我们知道mine版本是合并了部分成功变更操作的 清理代码中合并的缓存,重载mine版本 成功,指一个Excel文件所有检测合并都成功执行
删除文件目录下冲突Excel文件的版本文件(local和their版本),保留mine的版本
由上文,我们知道合并后的文件就保存在mine版本上 清理代码中合并的缓存,重载mine版本
在备份目录,会看到N+1条合并的备份结果
如果成功,会在本地看到上述去除冲突的Excel文件,可以提交SVN了
如果失败,本地还会保留三个版本,需要手动解决冲突
好啦,SVN拉取和Excel冲突合并就讲完啦!!!



