综述

SVN拉取原先是版本管理的一个功能,但遇到Excel文件的冲突就成为了一个阻碍工作的痛点。而程序化的Excel文件冲突合并就提上了开发日程。

本文将要阐述实现一键解决SVN拉取和Excel冲突合并问题。

在Excel文件目录,可以通过双击"全量拉取合并.bat"文件启动,会有黑窗口提示进度

功能详解

执行流程

我们来看一下执行流程

流程并不复杂,下面按照流程依次介绍

SVN拉取

通过代码拉取SVN,需要几个前提

  1. 安装SVN,并且将SVN的安装路径加入到系统PATH中
  2. 需要连接网络,并且账号和权限都满足要求
  3. 拉取的目录不处于lock状态(需要cleanup的情况)

作为游戏开发者,上述条件一般都是满足的,不满足也会给出提示。

代码拉取SVN的原理是

  1. 通过代码启动svn.exe进程
  2. 通过svn的命令行指令,实现对指定目录的拉取
  3. 通过svn进程运行结果,解析出成功与否,拉取的文件,冲突的文件

如果文件有冲突,我们能在目录下看到这样的冲突文件

三个文件,依次是自己修改的文件版本(mine),上次同步的本地版本(local),其他人提交的版本(their
接着,需要对这三个文件按特定逻辑合并

Excel文件合并检测

拿到一个冲突的Excel文件,我们需要先解析Excel文件的结构

上图中,Excel文件会有多个sheet表,表分为数据表和非数据表,按不同策略合并

注:双版本修改指minetheir都有修改,单版本修改指minetheir中一方有修改

  • 数据表,指符合编辑规范需要导出为游戏数据的表,合并按如下规范

    • 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冲突合并就讲完啦!!!

SVN拉取和Excel冲突合并相关推荐

  1. idea使用svn拉取源码,创建分支,合并分支教程

    svn拉取源码,创建分支,合并分支教程 最近对svn的分支使用比较感兴趣了,花时间研究了一下,分享给大家: 此文章记录了idea使用svn的过程:包括拉取源码.建立分支.切换分支.合并分支等常用操作. ...

  2. svn拉取文件合并_四、Jenkins+SVN拉取文件下发

    一.安装SVN [root@docker02 ~]# yum -y install subversion [root@docker02 ~]# mkdir -pv /data/svn [root@do ...

  3. Git从master拉取新分支、合并分支

    一.从master拉取新分支 git checkout master #切换到master分支 git pull #更新到最新代码 git checkout -b dev #创建新分支并切换到该分支 ...

  4. 正确导入svn拉取的工程

    为什么要写这篇博文?主要是记录摸着石头过黄河的过程.之前在eclipse装了svn插件,拉取远程工程,在eclipse显示的工程,并不会分开显示模块工程,反而 是以总工程的姿态呈现.或许你觉得不管分模 ...

  5. SVN拉取、提交文件

    前提: 已完成安装SVN软件以及配置相关账号和权限. SVN拉取项目 拿到SVN地址,新建文件夹后,在文件夹空白处鼠标右键,选择SVN Checkout,windows 11系统右键在显示更多选项中可 ...

  6. svn拉取文件合并_svn - SVN - 大象笔记

    checkout 需要账号密码的项目 svn checkout http://www.svnchina.com/svn/sunzhongwei --username sunzhongwei 然后 SV ...

  7. svn拉取文件合并_SVN分支与合并【超详细的图文教程】(转载)

    SVN分支与合并 一.分支与合并的概念 二.SVN分支的意义 三.如何创建分支与合并分支 一.分支与合并的概念: 分支:版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上.这条线被 ...

  8. gitee项目能用SVN拉取吗_用好 Git 和 SVN,轻松驾驭版本管理

    来源 | 凌承一链接 | bubuko.com/infodetail-2844306.html 本文从 Git 与 SVN 的对比入手,介绍如何通过 Git-SVN 开始使用 Git,并总结平时工作高 ...

  9. gitee项目能用SVN拉取吗_使用Git开发维护Github开源项目的一些经验

    Github无法访问/访问慢的经验 github经常会因为一些原因抽风,无法访问,这时候,可以使用gitee同步github项目,然后从gitee拉项目.在gitee导入项目以后,项目名称后面有个同步 ...

最新文章

  1. 2022-2028年中国出行O2O市场深度调研及投资前景预测报告
  2. 设计模式之外观模式(Facade)摘录
  3. 实现instanceof关键字
  4. JMS - QueueBrowser
  5. ASP.NET跨页传值方法汇总
  6. 从网络访问计算机不能添加用户名,windows7 和 XP 能互相用\\ip访问,但是不能通过计算机名访问...
  7. 需求说明 用户登陆功能的实现 c#
  8. 推荐召回体系化建设与排序优化实践
  9. 发布NGuestBook(一个基于.NET平台的分层架构留言本小系统)
  10. java 泛型的类型擦除和桥方法
  11. matlab如何动态输出很长的图片,Qt实现长图片的放大缩小以及动态显示
  12. 打开计算机文档左边,打开.chm的文件后,看不到左边的目录,该怎样解决?
  13. 大数据时代的小数字感:数据再有价值,别人听不懂照样没用
  14. 【0034】 PostgreSQL报错信息:The server must be started by the user that owns the data directory.
  15. 微服务网关搭建(podman+kong+konga)
  16. win10拒绝访问,需要安全选项卡如何操作?
  17. python炒股软件开发_Python之路day03-习题+作业-股票查询程序开发
  18. XenApp 7.6:如何启用客户端IME,启用客户端输入法
  19. 第12期:Spark零基础学习路线
  20. hihocoder 第280周德国心脏病c++

热门文章

  1. viewflip和viewpage
  2. 【Python爬虫】图文教学 爬取并汇总至Excel:高考志愿中的所有专业大类、具体专业的各项信息
  3. 微信小程序漏洞:可下载任意微信小游戏源代码
  4. PaaS简介及国内PaaS平台
  5. 时序预测 | MATLAB实现贝叶斯优化CNN-LSTM时间序列预测(股票价格预测)
  6. 什么是OpenID?OpenID概念、原理和案例
  7. web前端开发主要课程,jquery源码实现原理
  8. 面经:2020校招中兴提前批面试经历
  9. ajax请求失败readyState为0
  10. eMMC SI 总结