代码打补丁的利器——diff和patch

article/2025/9/25 1:53:03

        一般来说,如果我们在研发过程中需要对代码进行修改,是不需要通过打补丁的方式的,因为我们可以直接改动文件即可。但是如果针对一款要上线的产品,我们总不能在研发的电脑上编译通过后直接发布到线上的。(转载请指明出于breaksoftware的csdn博客)因为这样做有很多缺陷:

  • 最后负责编译的同事,可能忘记提交最终的代码。这样代码库中的代码逻辑和线上运行的产品逻辑将存在差异。
  • 最后负责编译的同事的编译环境可能已经感染病毒,从而导致编译的产品也携带病毒。这样的产品发布到线上将污染生产环境。
  • 无法保证最后负责编译的同事是否对产品逻辑“做过手脚”。
  • 无法保证最后负责编译的系统版本和关联库版本和线上环境一致。

        因为存在种种弊端,所以很多公司都会有专门的编译系统。大家把代码提交到代码库,然后触发编译平台。编译平台会挑选一些编译环境将代码从代码库中拉取下来,然后在这些与外网隔绝的稳定环境中进行代码编译。这样可以杜绝上述问题。

        在一些成规模的公司,会有很多可供大家公用的代码库。如果我们要实现一个功能,可能会用到这些代码库——即依赖,其与我们工程的关系可以分为以下两种:

  1. 把这些依赖放在我们工程代码内部,成为我们自己的私有代码。
  2. 依赖以独立模块存在,不属于我们自己维护的工程代码。只有在编译前才拉取下来。

         可以看出方案1非常不易于维护,因为我们的依赖库会不定期更新,这样就需要定期检查每个依赖库是否有更新并同步更新。而方案2可以让我们从上述繁琐的工作中解脱出来。我们只要在编译前把库(可能是最新的)拉取到本地或者编译环境下即可,而不用关心库的维护者什么时候进行了更新。因此。一般项目我们都是选用方案2的。

        上述看着一切都很美好。而然现实往往比理想要复杂很多。比如我们发现依赖库存在bug,而维护者没有时间去验证bug从而无法提供一个我们认为“稳定”的版本。我们又无法登陆公司的编译环境(实际上公司也不会让普通员工登陆编译环境,否则就太危险了),不可以手工修改依赖库的代码。这种条条规则框住的“无解”问题怎么办?给代码打patch此时就有了用武之地了。

        给代码打patch需要用到两个工具——diff和patch,它们都是linux系统上工具,我们可以很放心的使用。

        diff工具是用于生成补丁文件的。比如依赖库文件中文件A.cpp有bug,我们修改了bug并将文件另存为A_modify.cpp,这样通过下面命令生成补丁文件A_patch.cpp

diff -up A.cpp A_modify.cpp > A_patch.cpp

        

        在编译前,调用下面指令将补丁临时放到依赖库的A.cpp中

patch -p0 < A_patch.cpp

        

        这个时候A.cpp代码就已经没有bug了,我们执行编译。等编译结束后,我们可以使用下面指令,还原A.cpp到原始的内容,即去除补丁

patch -RE -p0 < A_patch.cpp

       

         举个例子:src目录下有不能修改的代码,而我们需要修改其中若干个文件。则我们将创建一个叫做modiy_src的目录,其中文件和src中文件相对路径一致。这样我们就可以修改modify_src下的代码,然后使用cmp工具对比每个文件。如果发现modify_src中的文件和src中的文件不一致,则在patch_src目录下生成一个相对路径一致的补丁文件

#!/bin/shfunction left_to_right(){for element in `ls $1`doleft_dir_or_file=$1"/"$elementright_dir_or_file=$2"/"$elementpatch_dir_or_file=$3"/"$elementif [ -d $left_dir_or_file ];thenleft_to_right $left_dir_or_file $right_dir_or_file $patch_dir_or_fileelseextension=${left_dir_or_file##*.}if [ "$extension"  != "c" -a  "$extension"  != "h" ];thencontinuefiif [ ! -f "$right_dir_or_file" ];thenright_path_floder=$(dirname $right_dir_or_file)if [ ! -d "$right_path_floder" ];thenmkdir -p $right_path_floderficp $left_dir_or_file $right_dir_or_fileelsecmp -s $left_dir_or_file $right_dir_or_filedifferent=$?if [ 0 == $different ];thencontinuefipatch_path_floder=$(dirname $patch_dir_or_file)if [ ! -d "$patch_path_floder" ];thenmkdir -p $patch_path_floderfidiff -up $left_dir_or_file $right_dir_or_file > $patch_dir_or_filefifidone
}left_to_right src/ modify_src/ patch_src/

        然后再写一个脚本,对patch_src下文件进行遍历,并且根据传入的参数决定“打补丁”还是“去除补丁”。

#!/bin/shfunction patch_files(){if [ "$2" == "recover" ];thencover=0elif [ "$2" == "cover" ];thencover=1elseecho "sh patch_files cover/recover"exitfifor element in `ls $1`dopatch_dir_or_file=$1"/"$elementif [ -d $patch_dir_or_file ];thenpatch_files $patch_dir_or_file $2elseif [ 0 == $cover ];thenpatch -RE -p0 < $patch_dir_or_fileelsepatch -p0 < $patch_dir_or_filefifidone
}patch_files patch_src/ $1

        这样在编译时我们这么做,以保证编译正确的代码,同时在编译结束后将代码还原

sh ./patch_files.sh cover
make
sh ./patch_files.sh recover

http://chatgpt.dhexx.cn/article/5kmdtqMb.shtml

相关文章

diff制作patch补丁

diff制作patch补丁 对于源代码项目软件移植的时候&#xff0c;会出现各种各样的问题&#xff0c;系统环境不匹配&#xff0c;版本升级&#xff0c;环境依赖等问题&#xff0c;需要制作补丁&#xff0c;打在源代码项目中&#xff0c;修复bug问题。 diff命令 使用diff命令制作…

git补丁操作:git生成patch和应用patch

一、生成patch 1、拉取代码仓 git clone xxx代码仓地址 2、在clone到本地的代码目录中&#xff0c;例如对README.md文件进行了修改。然后使用 git status 命令查看工作目录和暂存区的状态。 git status &#xff08;示例修改是在README.md文件开头添加了如下内容&#xff09…

patch 修补文件命令

patch 修补文件命令 patch 修补文件命令操作练习&#xff1a;针对单个文件的修改补丁针对文件目录下所有文件的修改补丁 补充&#xff1a;svn生成补丁文件和打补丁文件总结 patch 修补文件命令 功能&#xff1a;修补文件&#xff0c;使用补丁文件&#xff0c;对源文件进行更改…

patch-package给依赖打补丁实例详解

1、安装patch-package patch-package 官方只支持 npm 和 yarn。注意&#xff1a;不要使用cnpm yarn add patch-package -D 2、创建补丁 先修改依赖文件&#xff0c;然后运行patch-package来创建patch文件了。我这里用element-ui来举例子 yarn patch-package element-ui 此时&…

diff和patch工具打补丁

diff和patch工具打补丁 1 对比单个文件差异1.1 编写两个版本的脚本&#xff0c;一个为v1版本&#xff0c;一个为v2版本。2.2 使用diff命令语法 2 使用patch命令对单文件代码打补丁2.1 生成补丁文件2.2 使用patch命令打补丁 3 对比目录中所有文件的差异3.1 准备实验环境3.2 对比…

【知识点】patch补丁文件格式

linux补丁文件格式 “补丁” 指的是文件之间一系列差异。 在原始文件的基础上进行修改后&#xff0c;然后根据所做的修改生成补丁文件&#xff08;使用diff命令&#xff09;。 一个持有原始文件的人&#xff0c;将该补丁打到原始文件上&#xff08;使用patch命令&#xff09…

Git 补丁— diff 和 patch 使用详解

Git 补丁— diff 和 patch 使用详解 1. diff 和 patch 的区别2. 生成patch2.1 git diff3. git format-patch 3. 应用patch4. 冲突解决题外话 1. diff 和 patch 的区别 Git 提供了两种补丁方案&#xff0c;一种是通过 git diff 生成的 .diff 文件&#xff0c;第二种是通过 git …

手把手教你使用patch-package给npm包打补丁

具体文档https://github.com/ds300/patch-package 一、背景 故事从日常团队协作开发展开&#xff0c;整个team使用react antd4搭建前端页面&#xff0c;在开发中我发现antd4.9.*版本的Input.TextArea组件存在一个bug&#xff0c;该bug表现为maxLength属性限制不符合预期&…

patch-package打补丁

如何修改node_modules源码&#xff1f; 首先&#xff0c;我们能想到的思路是直接修改第三方库的代码&#xff0c;不过这会带来团队协作的问题&#xff0c;你的改动需要同步到团队所有成员&#xff0c;比较麻烦。 好在&#xff0c;我们可以使用patch-package这个库来解决这类问题…

Git 打patch (打补丁)的使用

patch 的使用 一般是diff ,apply ,format-patch,am 1 生成patch git diff > test.patch 这个是打补丁(test.patch自己取的名字,这个命令可以看出没有指定修改的问题所以默认把所有修改的文件都打patch了,同时还需要注意,这里是本地修改的没有执行add缓存的) 如果想指定某…

linux基本功系列之fdisk命令实战

文章目录 前言一. fdisk命令介绍二. 语法格式及常用选项三. 参考案例3.1 列出每个分区的大小3.2 分区操作3.2.1 添加硬盘3.2.2 开启虚拟机并分区3.3.3 分区完成后进行格式化挂载 四 . 设置分区自动挂载 前言 大家好&#xff0c;又见面了&#xff0c;我是沐风晓月&#xff0c;本…

fdisk磁盘分区

fdisk磁盘分区 fdisk磁盘分区 fdisk磁盘分区文件系统类型fdisk分区过程 文件系统类型 EXT4 第四代扩展文件系统 存放数据 SWAP 交换文件系统 交换分区 fdisk fdisk 参数 fdisk -l 查看所有磁盘磁盘分区 fdisk命令 格式fdisk 磁盘设备 常用选项&#xff1a; m&#xff1a;查…

linux fdisk原理,fdisk详细剖析笔记

fdisk 简单使用 fdisk 工具原理就是修改磁盘的分区表&#xff0c;和分区信息。 查看帮助 #fdisk --help (1)磁盘列表 #fdisk -l (2)管理某个磁盘 #fdisk /dev/sdb 交互模式&#xff0c;可以直接m查看帮助信息&#xff0c;后面可以使用非交互模式&#xff0c;脚本自动格式化 磁盘…

Linux基础命令-fdisk管理磁盘分区表

文章目录 fdisk 命令介绍 命令格式 基本参数 1&#xff09;常用参数 2&#xff09;fdisk菜单操作说明 创建一个磁盘分区 1&#xff09;创建分区 2&#xff09;创建交换分区 参考实例 1&#xff09; 显示当前分区的信息 2&#xff09; 显示每个磁盘的分区信息 命令…

linux磁盘分区fdisk命令详解及云硬盘挂载实操

linux磁盘分区fdisk命令详解 1、什么是分区&#xff1f; 分区是将一个硬盘驱动器分成若干个逻辑驱动器&#xff0c;分区是把硬盘连续的区块当做一个独立的磁硬使用。分区表是一个硬盘分区的索引,分区的信息都会写进分区表。 2、为什么要有多个分区&#xff1f; 防止数据丢失…

linux磁盘挂载之fdisk

linux磁盘挂载&#xff0c;使用fdisk命令 fdisk可以支持2T以下的分区的挂载&#xff0c;如果分区大于2T需要使用parted工具 磁盘情况查看 fdisk -l 可以看到有两块物理盘 名称磁盘符号磁盘大小备注Disk/dev/sda214.7G已分区Disk/dev/sdb1073.7G未分区 如果disk中有Device项…

fdisk分区命令

fdisk是Linux系统中最常用的分区工具&#xff0c;通过这个命令也可以查看系统中所有可用的分区&#xff0c;但是这个命令只支持MBR的分区表(这句话应该只对某些系统&#xff0c;CentOS7-1810适用&#xff0c;Debian9.5和openSUSE15应该已经支持GPT分区表&#xff0c;下面对fdis…

fdisk分区工具

fdisk分区工具 Linux磁盘分区步骤常见Linux分区方案 常见分区表MBR分区表使用fdisk进行分区fdisk手动创建主分区0查看磁盘详情1执行fdisk2选择新建分区3选择主分区4输入分区编号5输入起始扇区6输入结束扇区7查看分区表信息8保存分区9查看分区是否新增成功10同步分区信息11再次查…

linux中磁盘分区fdisk,管理磁盘分区之fdisk详解

Mozatr的不定期更新,处于学习阶段的Mozart,愿不断分享,不断进步。 此次分享一个重要的管理分区命令:fdisk ,我们一一阐述。 (一)分区 首先我们了解下什么是分区,分区是将一个硬盘驱动器分成若干个逻辑驱动器,分区是把硬盘连续的区块当做一个独立的磁盘使用。分区表是一个…

一天一个 Linux 命令(26):fdisk 命令

本文为joshua317原创文章,转载请注明&#xff1a;转载自joshua317博客 一天一个 Linux 命令&#xff08;26&#xff09;&#xff1a;fdisk 命令 - joshua317的博客 一、简介 Linux里的fdisk&#xff08;英文全称&#xff1a;"Partition table manipulator for Linux&quo…