SVN 版本控制的数据合并规则
文章目录
- 自己的猜想
- 文件名比对
- 文本行比对
- 事实是什么
- 提交计划
- 提交数据
- 更新客户端版本库数据时,同名文件中文本行的数据比对规则
自己的猜想
假设当前用户提交的文件称为 NF,SVN 最新版的文件称为 HF。
文件名比对
首先比对文件名,如果文件名不同,则比对文件属性的元数据,文件 ID 是相同的,说明属于同一个文件,则比对文件名称的版本号,发现 NF 文件名的版本号为 Undefined,说明 NF 文件修改了文件名,于是从客户端的缓存库中获取 NF 文件旧名称的版本号与 HF 文件的名称的版本号比对,发现相同或者 NF 文件旧名称的版本号更大,则保留 NF 文件的文件名;若 NF 文件旧名称的版本号比 HF 名称的版本号小,说明什么问题?说明 HF 文件也曾修改了文件名并且提交了更新;其二当前用户没有更新最新版的数据,而是在旧版本基础上进行更新和提交。所以现在冲突就产生了,保留谁的文件名,两位提交者相互协商后手动解决冲突了。
文件名不同,比对文件属性的元数据,发现文件 ID 也不同,说明不属于同一个文件,而是新增的文件,此时 SVN 会在客户端的缓存库中追溯版本数据(客户端会缓存文件的各种历史版本),试图寻找到 HF 文件的相关数据,结果找到了,发现原来的文件被删除了,于是会比对被删除文件的版本和 HF 文件的版本,如果被删除文件的版本大于等于 HF 的版本号,则遵从提交的数据包,不再保留 HF 文件;如果被删除文件的版本号小于 HF 文件的版本号,说明两个问题,其一 HF 文件是后来有人更新后提交的;其二当前用户没有更新最新版的数据,而是在旧版本基础上进行更新和提交。因此这样的删除行为 SVN 服务器是不会直接通过的,所以冲突产生了。被删除的文件是否保留,两位提交者相互协商后手动解决冲突了。
如果 SVN 在追溯版本数据的时候没有找到 HF 文件相关的数据,则说明当前用户提交的是新增数据,于是保留 NF 和 HF 两份文件到 HEAD 片段中,而原来的 HF 文件会被归档到旧版本片段中。此时其他用户从 SVN 检出或导出或更新就会得到两份文件了。
如果 NF 和 HF 的文件名相同但是文件 ID 不同,也就是说实际是两个不同的文件,但是取名相同(例如,当前用户下载了 HF 文件,后来删除了,又重新创建了一份同名的文件),文件系统是不允许同个目录下存在两份同名的文件的,所以此时 SVN 也是在客户端的缓存库中追溯版本数据,如果发现当前用户删除了与 HF 同 ID 的文件,而且版本相同,则 SVN 会遵从当前用户的提交只保留当前用户的提交的文件;如果当前用户删除的与 HF 同 ID 的文件版本更小,则 SVN 不会直接通过,所以冲突产生了。保留哪个文件,两位提交者相互协商后手动解决冲突。
文本行比对
如果文件名和 ID 都相同的情况下,则逐行比对文件内容。
NF 的第 1 行与 HF 的第 1 行比对,先比对内容,内容相同则 NF 的第 1 行内容保留下来,内容不同则比对行的版本号,如果 NF 的第 1 行的版本号是 Undefined,则追溯该行的旧版本数据,如果发现 NF 文件的第 1 行的旧版本号等于 HF 文件的第 1 行的版本号,则保留 NF 第 1 行的数据,如果 NF 文件的第1行的旧版本号小于 HF 文件的第 1 行的版本号,则产生冲突,需要手动解决。所以基于这样的逻辑,多人同时修改同一位置的数据最先提交的数据顺利通过,但是后面提交的数据都会产生冲突,因为从客户端缓存库中提取到的版本数据肯定被 SVN 服务器 HEAD 片段的数据的版本小。这里说的 HEAD 片段其实就是所谓的“集中式版本库”,SVN 用户都是从这个版本库中下载最新版本的数据资源。
NF 的第 1 行与 H F的第 1 行比对,内容不同,则比对版本号,如果可以直接取到 NF 文件第 1 行的版本号,则说明 NF 文件的第 1 行没有修改过,如果版本号相同,则直接保留 NF 的第1行文本内容,如果 NF 文件的第 1 行的版本号低于 HF 文件的第 1 行的版本号,这说明当前用户在提交的时候没有更新最新版的数据直接提交了,但是没有关系,SVN 知道 NF 文件中的第 1 行文本是旧数据,所以会保留 HF 文件的第 1 行数据。
按上述的逻辑比对后面的所有文本行…
事实是什么
在提交的时候,SVN 并不是按以上的逻辑和规则来比对数据,中央版本库中原来的数据会移入历史版本池中,然后备份一份到 head
分区中(即主分支 /trunk
),接着简单判断同名文件内容是否一致,一致则保留 head 的数据,否则被新提交的文件替换掉。
在客户端版本库的缓存数据中,有保存客户端版本库的文件的实际路径与 SVN 服务端版本库中的对应路径的映射关系。只要有修改客户端版本库中的数据,都会把被修改文件的客户端路径和相对应的 SVN 服务端版本库的路径写入到提交计划中。
所谓 versioned
就是每个客户端版本库的文件都在这个路径映射表中,如果你改了客户端版本库中的文件名或者删除了,SVN 客户端就无法找到对应的映射关系,就会提示文件丢失、无法识别等。
提交计划
客户端版本库的文件只要修改了内容,或者通过命令 svn add
添加的文件,相关文件的路径都会写入提交计划中(schedule)
提交数据
- 只要客户端版本库的版本号和服务端版本库的版本号不同,就无法正常提交,提示“过期”
- 如果提交数据成功,是将工作副本的数据完全覆盖服务端的数据,没有进入文件内容进行文本行的数据比对
更新客户端版本库数据时,同名文件中文本行的数据比对规则
内容对比 | 客户端标记状态 | 服务端标记状态 | 内容处理方案 |
---|---|---|---|
不相同 | 删除 | 修改过 | 产生冲突 |
相同 | 删除 | 未修改过 | 遵从客户端的 |
相同 | 未修改过 | 未修改过 | 遵从客户端的 |
相同 | 修改过 | 修改过 | 遵从客户端的 |
不相同 | 修改过 | 未修改过 | 遵从客户端的 |
不相同 | 修改过 | 修改过 | 产生冲突 |
不相同 | 未修改过 | 版本不同 | 遵从服务端的 |
相同 | 未修改过 | 删除 | 遵从服务端的 |
相同 | 修改过 | 删除 | 产生冲突 |
不相同 | 修改过 | 删除 | 产生冲突 |
注:服务端文本是否修改过,是针对客户端文本行的版本而言。
SVN 版本控制的数据合并规则相关推荐
- SD敢达服务器源码,《SD敢达OL》服务器账号数据合并规则
玩家G币.M币.敢达合金芯片数据(货币数据) 若玩家的单一账号只在进行合并的两个服务器中的一个中创建过人物,那么服务器合并之后,玩家的G币.M币.敢达合金芯片数据保持不变: 若玩家的单一账号在合并服和 ...
- SVN版本控制分支、合并功能使用
目录 一.创建主干文件夹 二.打分支 1.打分支 2.修改分支 编辑 三.合并 功能需求: 1:开发者控制修改提交控制分支, 2:测试无误后哉合并到主干项目, 3:防止未测试完成的功能影响线上项目. ...
- SVN版本控制器之详解
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS. 在实际开发中SVN解决需求: 1.代码备份 2.代码还原 ...
- python用merge匹配和左连接_左手用R右手Python系列——数据合并与追加
感谢关注天善智能,走好数据之路↑↑↑ 欢迎关注天善智能,我们是专注于商业智能BI,大数据,数据分析领域的垂直社区,学习,问答.求职一站式搞定! 本文作者:天善智能社区专家杜雨 今天这篇跟大家介绍R语言 ...
- pandas相关函数sort_values、字符串处理、index、merge、数据合并cancat、groupby分组统计
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.排序函数sort_values() 二.字符串处理 1.介绍 2.代码介绍 3.Categorical类型降低数据 ...
- 这或许是全网最全 Python dataframe 数据合并方法汇总
有位朋友面试阿里的数据岗位,面试官问关于Python的5种数据合并的函数,结果他蒙蔽了'... 那么,究竟是哪五个呢?今天,我们就来带大家了解一下,喜欢记得收藏.关注.点赞. 注意:完整代码.资料.技 ...
- 多人开发SVN版本控制工具安装
SVN版本控制工具安装 1. Beyond Compare 这是一个方便进行文件之间差异对比的工具,可以方便的对文件中的内容进行合并,甚至是文件夹中的内容也可以进行差异对比 直接点击安装即可,除了选择 ...
- STATA数据合并与追加(一)Merge
文章目录 Why Merge? 一.Description 简要描述 二.Syntax 命令语法 1.语法示例 2.Options 参数选项 Merge命令的options 参数表 参数具体说明 3. ...
- webpack-merge合并规则
webpack-merge合并规则 前言 vue中,webpack将开发环境和生产环境的公共配置抽离出来,然后基于公共配置通过webpack-merge合并开发或者生产环境的特有配置,生成完整的开发或 ...
最新文章
- 微服务网关实现用户访问权限识别拦截
- SQL Server2008存储结构之聚集索引
- spring整合mybatis接口无法注入问题
- 2019-02-21-算法-进化
- 微信小程序 全局变量异步函数_微信小程序【生命周期】
- 写给大数据开发初学者的话3
- 问题 D: 最小生成树II
- fuel6.1搭建openstack
- gxworks2软件测试对话框,超实用!GX Works2软件的启动与窗口功能应用
- 解决删除symantec,需要输入密码的问题
- matlab官方中文文档教程
- win10查看服务器共享文件夹,Win10怎么样查看共享文件夹
- 小程序下找地点、查路线、搜地铁,用这3个插件就够了!
- java中的terminated_解决maven build 无反应,直接terminated的问题
- [Tableau] Tableau知识技能
- android 连接web加密的wifi,Android 与WEP加密连接
- imx6ull 14*14 平台使用mfgtools下载代码出现UTP Waiting for device to appear错误
- 《MLB棒球创造营》:走近棒球运动·圣迭戈教士队
- 罗马数字到底是怎么组成的(内容详细)
- 计算机基础知识实验内容及步骤,计算机基础实验报告要点.doc
热门文章
- 黑马ee在职进阶视频_进阶– Java EE 7前端5强
- angular8 rest_带有Angular JS的Java EE 7 – CRUD,REST,验证–第2部分
- 谓词::不适合Java
- Arquillian变色龙。 简化您的Arquillian测试
- 功能Java示例 第3部分–不要使用异常来控制流程
- 同步器 java_您可能不知道的五个高级Java同步器
- 春天重试,因为冬天来了
- 模拟Spring Security上下文进行单元测试
- 独眼巨人反应组织了Java 8库的寒武纪爆发
- 惠而浦:使用Netty和Kafka的微服务