SVN 版本控制的数据合并规则

文章目录

  • 自己的猜想
    • 文件名比对
    • 文本行比对
  • 事实是什么
  • 提交计划
  • 提交数据
  • 更新客户端版本库数据时,同名文件中文本行的数据比对规则

自己的猜想

假设SVN服务端就存在一份最新版的文件 HF,客户端检出这份文件后再提交,当前用户提交的文件称为 NF。

在这里插入图片描述

文件名比对

首先比对文件名,如果文件名不同,则比对文件属性的元数据,文件 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)

提交数据

  1. 只要客户端版本库的版本号和服务端版本库的版本号不同,就无法正常提交,提示“过期”
  2. 如果提交数据成功,是将工作副本的数据完全覆盖服务端的数据,没有进入文件内容进行文本行的数据比对

更新客户端版本库数据时,同名文件中文本行的数据比对规则

内容对比客户端标记状态服务端标记状态内容处理方案
不相同删除修改过产生冲突
相同删除未修改过遵从客户端的
相同未修改过未修改过遵从客户端的
相同修改过修改过遵从客户端的
不相同修改过未修改过遵从客户端的
不相同修改过修改过产生冲突
不相同未修改过版本不同遵从服务端的
相同未修改过删除遵从服务端的
相同修改过删除产生冲突
不相同修改过删除产生冲突

注:服务端文本是否修改过,是针对客户端文本行的版本而言。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java算术运算符的分类_6.Java算术运算符

1.算术运算符的分类:算术运算符:* :( 正数,加法 ,连接符)* 连接符: 如果数据和字符串连接一起就是用了"",那么""就成了连接符,拼接字符串* 任何数据与字符串使用连接符那么结果的数据类型都是字符串类型* 任何数据和数据相加就是做加法…

java项目教训_[免费电子书]分析超过600,000个Java项目的经验教训

java项目教训建立明智的错误处理工作流程需要什么? 调查和解决生产中的应用程序错误对于维持性能和可靠性至关重要。 但是,这并不意味着要花很多时间。 要理解为什么在生产中的故障排除,可这样的头痛,我们开始发现“真理”我们经…

MacOS 的软件包管理工具 MacPorts

MacPorts 就像 Homebrew 一样,可以管理 MacOS 的软件包,和 Linux 系统下的 apt-get、yum 一样。 官方网址:https://www.macports.org/index.php

java plus方法_Java.math.BigDecimal.plus()方法实例

全屏Java.math.BigDecimal.plus()方法实例java.math.BigDecimal.plus() 返回一个BigDecimal,其值是 (this),并且其刻度为是 this.scale().这种方法,它只是返回此BigDecimal是包括对称性与一元减号方法negate()。声明以下是java.math.BigDecim…

java jdk设置字符集_使用JDK 11在Java字符串上的新方法

java jdk设置字符集Java的String类似乎将在JDK 11中获得一些新方法,该方法将于2018年9月发布。 错误号 错误标题 新的String方法 描述 JDK-8200425 字符串::行 lines() “使用专用的分隔符从源字符串中懒散地提供行的字符串实例方法。” JDK-8200378 Stri…

MacOS 如何安装 SVN 命令终端

I purchased a new Mac running Mac OS X v10.8.5 (Mountain Lion). I’ve seen it written in various places that SVN is installed on OS X by default, but when I open a terminal and type which svn the program is not found. I’ve also run find / -name svn to che…

java代码审计ssrf危险函数_某租车系统Java代码审计之后台注入漏洞分析

CMS简介系统基于租车业务场景而搭建的O2O服务平台,可为用户提供商务租车、接送机、旅游租车、企业租车、自驾租车、婚庆用车等自助租车服务。系统包含车辆库管理、门店管理、员工管理、司机管理、订单管理、活动管理、评价管理、财务管理、统计等。部署简介1、下载代…

docker jib_Jib –为Spring Boot应用程序构建docker映像

docker jib使用Jib为示例Spring Boot应用程序创建docker映像是如此容易,这让我感到惊喜。 让我首先将Jib与以前使用的方法进行对比。 我正在使用bmuschko出色的gradle-docker插件创建docker映像。 如果可以访问docker守护进程以及基于dockerfile或直接Dockerfile的…

如何在 MacOS 环境下搭建 SVN 服务端环境

文章目录在服务端创建资源仓库资源仓库访问权限配置给资源仓库添加用户配置用户组及用户的权限启动 SVN 服务器停止 SVN 服务器SVN 是一个使用十分广泛的开放源代码的版本控制系统。在 Windows 系统下,我们一般使用 TortoiseSVN 来搭建 SVN 环境。而 MacOS 系统我们…

java 飞行记录器_Java 11功能– Java飞行记录器

java 飞行记录器在本文中,我们将看到如何利用Java Flight Recorder功能作为Java 11的一部分。之前,它是商业功能之一。 但是,对于带有JEP 328的 Java 11,它是开源的。 Java Flight Recorder将OS和JVM事件记录到一个文件中&#xf…

mysql管理节点_MySql节点管理安装步骤需要在SerA和SerB上各做一次

对大家推荐很好使用的MySql节点系统,像让大家对MySql节点系统有所了解,然后对MySql节点系统全面讲解介绍,希望对大家有用在向大家详细介绍MySql节点之前,首先让大家了解下MySql节点,然后全面介绍MySql节点,…

在java中补零的作用是什么_浅谈Java中的补零扩展和补符号位扩展

今天,魏屌出了一道题,题目如下:定义一个大头序的byte[]a{-1,-2,-3,-4},转换成short[]b.问b[0]和b[1]分别是多少?乍一看,这题不难,无非就是移位操作,再进行组合。但是呢?对…

arquillian_使用Arquillian(远程)测试OpenLiberty

arquillian听到许多好评后,我想我会尝试一下Open Liberty 。 在这篇文章中,我将讨论以下内容: 开放自由的设置 设置JDBC连接 设置Arquillian 测试REST端点 安装开放自由 在撰写本文时,我正在使用Open Liberty 18.0.0.1&…

Linux 命令之 pico -- 文本编辑器

没有时间整理,暂时参加此文:https://tool.lu/command/detail.html?namepico

delphi 获取java控件位置_delphi的IdFTP控件函数怎么调用

RootDir 要删除的根目录,一般情况下 RemoteDir 与 RootDir 相等}procedure TForm1.FTP_DeleteAllFiles(var idFTP : TIdFtp;RemoteDir,RootDir : string);label Files;vari,DirCount : integer;Temp : string;beginidFTP.ChangeDir(RemoteDir);if Pos(RootDir,idFT…

javafx查找子节点_JavaFX技巧29:使布局忽略不可见的节点

javafx查找子节点在我仍在Swing中实现UI的时候,我曾经是MigLayout的忠实拥护者(“一个布局管理者来统治所有这些,对吗Mikael?”)。 我真正喜欢的功能之一是当组件不可见时可以定义不同的行为。 MigLayout允许我保留现在…

SVN 仓库转换为 Git 仓库

没有时间整理,请暂时参考:http://www.178linux.com/21199

现在java编程用的框架_现在java编程用的框架

2怎样学习java掌握常用的API用法每一门成熟的编程语言都会向用户提供丰富的应用编程接口(Application programming Interface),也就是通常所说的API,熟练掌握这些API,无疑会极大的提高我们编码的效率,但是Java提供的API实在是太多…

jdk11 默认收集器_JDK 11:新的默认收集方法toArray(IntFunction)

jdk11 默认收集器“ JDK 11 Early Access发行说明 ”指示JDK 11的Early Access Build 20在Collection接口上包括一个新的默认方法 ,该方法 “允许将集合的元素转移到所需运行时类型的新创建的数组中”。 这个新的默认方法 [ Collection.toArray(IntFunct…

SVN 命令详解

文章目录在 SVN 服务端创建项目仓库,即资源仓库启动 SVN 服务器将客户端的源代码导入 SVN 版本库中从 SVN 服务器端检出代码到指定的客户端目录下从 SVN 版本控制器中导出指定版本的源代码到指定的客户端目录下更新指定版本的数据/回滚指定版本的数据/还原到指定版本…