diff补丁格式

时间:2023-03-08 22:22:06

title: diff补丁格式

tags: 学习

categories: 学习

date: 2018-09-20 21:03:53

diff补丁格式

在Uboot学习中,接触到了打补丁这个操作,首先来学习下diff的patch文件格式.

命令参数

diff

  1. ”-u”:表示在比较结果中输出上下文中一些相同的行
  2. “-r“:表示递归比较各个子目录下的文件
  3. “-N“:将不存在的文件当作空文件
  4. “-w“:忽略空格的比较
  5. “-B“:忽略空行的比较

patch

  1. -pn,表示忽略diff命令中原文件路径中的几层父目录,-p1表示忽略第一个父目录

补丁文件内容

  1. 第一行,首先指定文件目录路径个比对参数
  2. 第二行,---.....表示原来的文件
  3. 第三行,+++....表示新文件
  4. 第四行一般是被 @@...@@包含的内容,比如@@ -206,8 +206,8 @@: -206表示原来的第206行,8表示总共8行,+206表示这是从新文件的206行,总共也有8行
  5. 文件内容中-表示删除这一行,+表示新增这一行,无+-表示保持原来的

制作补丁

使用命令 diff -urN oldFloder NewFloder > mypatch.diff,其中oldFloder为原旧文件,NewFloder为新文件,生成补丁mypatch.diff

应用补丁

使用命令patch 来应用补丁

例子

  1. 在OldFloder存在文件test.txt

    111111
    222222
    333333
    444444
    555555
  2. 在NewFloder存在文件test.txt

    111111 add here
    delete 222222 here
    33 change 33
    444444
    555555
  3. 为OldFloder创建补丁diff -urN OldFloder NewFloder > test.diff

  4. 查看下补丁的内容cat test.diff

    diff -urN OldFloder/test.txt NewFloder/test.txt
    --- OldFloder/test.txt 2018-09-20 21:15:40.576162357 +0800
    +++ NewFloder/test.txt 2018-09-20 21:17:02.747161577 +0800
    @@ -1,5 +1,5 @@
    -111111
    -222222
    -333333
    +111111 add here
    +delete 222222 here
    +33 change 33
    444444
    555555
  5. 应用补丁,patch -p1 < ../test.diff,命令前面的 -p1表示忽略路径中第1个父目录,我们这里是在OldFloder中应用的,所以是p

  6. 查看在OldFloder中的文件cat test.txt,可以发现已经应用成功

    111111 add here
    delete 222222 here
    33 change 33
    444444
    555555
  7. 例子解析

    diff -urN OldFloder/test.txt NewFloder/test.txt
    --- OldFloder/test.txt 2018-09-20 21:15:40.576162357 +0800
    +++ NewFloder/test.txt 2018-09-20 21:17:02.747161577 +0800
    @@ -1,5 +1,5 @@
    -111111
    -222222
    -333333
    +111111 add here
    +delete 222222 here
    +33 change 33
    444444
    555555
    • @@ -1,5 +1,5 @@表示原来文件的第1行开始,总共有5行,新文件从第1行开始,总共有5行
    • -111111表示删除原文件这一行
    • -222222表示删除原文这一行
    • -333333表示删除原文这一行
    • 后面三个+++....表示新增这一行
    • 接下去的44444455555表示不更改
    • 这么减了三行,去除三行,然后再保留原来的两行444444555555,总共还是5行