摘要

以前一直用 SVN 图形界面,只会使用页面 update, commit ,branch 等功能,前两天为了打一个docker 镜像,在centos 上安装了SVN ,发现命令中有一个 patch,不明所以,因此记录一下。

定义

patch 中文意思是补丁,顾名思义在版本管理系统中就是给系统的代码打补丁。公司里面用的比较少,因为大家一个团队使用一个SVN 地址提交代码,但是在全世界程序员参加的开源项目使用这种方式就不行了,需要有专门人来做代码 review 和 merge。每个人 fork 一个分支,开发完之后生成一个 patch 文件给原项目人员,由他们审查之后决定要不要合并到主干代码中(GitHub 里叫 Pull Request)

放一张流程图:


patchapi(版本管理系统中的Patch)(1)


原理

类 Unix 系统中都会自带 patch 和 diff 程序,可以使用这两个来演示一下补丁的使用。

我们现在有两个文件(SVN 系统中是本地跟远程文件diff,实际也是两个文件)file1, file2,他们的文件内容分别如下:

$ cat file1 this is file1 nothing more line 3 $ cat file2 this is file2 nothing more

使用 diff 比较两个文件:

$ diff -u file1 file2 --- file1 2018-09-07 10:57:28.853583937 0800 file2 2018-09-07 10:57:06.062578590 0800 @@ -1,3 1,2 @@ -this is file1 this is file2 nothing more -line 3

这就是 patch 文件的格式,可以看到是使用特殊的符号来标识每行内容的增减,修改,最开始是文件的时间戳信息。我们创建一个 file-diff.patch文件,然后就可以用patch 程序来打上补丁。

$ diff -u file1 file2 > file-diff.patch $ patch file1 file-diff.patch patching file file1 $ cat file1 this is file2 nothing more

如果你同时修改了file1,patch 和file1 内容就可能产生冲突,这回生成file1.rej文件,这就需要你自己手动去解决冲突,合并代码了。

,