描述
patch用于将补丁文件应用到源代码文件中,以实现对源代码的更改。补丁文件一般是由开发者或则社区提供的,用于修补源代码中的错误或则添加新功能。
句型
patch[选项][源代码文件][补丁文件]
-p:指定路径剥离级别,用于清除补丁文件中的路径前缀。一般在补丁文件中会包含源代码文件的相对路径,使用该选项可以消除这种路径前缀。
-d:指定工作目录,用于在指定目录下执行补丁操作。
-N:准许添加新文件,即若果补丁文件中包含新文件linux 应用patch,patch会将其添加到源代码中。
-R:撤消已应用的补丁,将要补丁文件中的更改恢复到源代码文件中。
-s:安静模式,即不显示详尽的操作信息。
-i:指定补丁文件的路径。
root@ubuntu:/home/ubuntu#patch--help
Usage:patch[OPTION]...[ORIGFILE[PATCHFILE]]
Inputoptions:
-pNUM--strip=NUMStripNUMleadingcomponentsfromfilenames.
-FLINES--fuzzLINESSetthefuzzfactortoLINESforinexactmatching.
-l--ignore-whitespaceIgnorewhitespacechangesbetweenpatchandinput.
-c--contextInterpretthepatchasacontextdifference.
-e--edInterpretthepatchasanedscript.
-n--normalInterpretthepatchasanormaldifference.
-u--unifiedInterpretthepatchasaunifieddifference.
-N--forwardIgnorepatchesthatappeartobereversedoralreadyapplied.
-R--reverseAssumepatcheswerecreatedwitholdandnewfilesswapped.
-iPATCHFILE--input=PATCHFILEReadpatchfromPATCHFILEinsteadofstdin.
Outputoptions:
-oFILE--output=FILEOutputpatchedfilestoFILE.
-rFILE--reject-file=FILEOutputrejectstoFILE.
-DNAME--ifdef=NAMEMakemergedif-then-elseoutputusingNAME.
--mergeMergeusingconflictmarkersinsteadofcreatingrejectfiles.
-E--remove-empty-filesRemoveoutputfilesthatareemptyafterpatching.
-Z--set-utcSettimesofpatchedfiles,assumingdiffusesUTC(GMT).
-T--set-timeLikewise,assuminglocaltime.
--quoting-style=WORDoutputfilenamesusingquotingstyleWORD.
ValidWORDsare:literal,,shell-always,c,escape.
DefaultistakenfromQUOTING_STYLEenvvariable,or'shell'ifunset.
Backupandversioncontroloptions:
-b--backupBackuptheoriginalcontentsofeachfile.
--backup-if-mismatchBackupifthepatchdoesnotmatchexactly.
--no-backup-if-mismatchBackupmismatchesonlyifotherwiserequested.
-VSTYLE--version-control=STYLEUseSTYLEversioncontrol.
STYLEiseither'simple','numbered',or'existing'.
-BPREFIX--prefix=PREFIXPrependPREFIXtobackupfilenames.
-YPREFIX--basename-prefix=PREFIXPrependPREFIXtobackupfilebasenames.
-zSUFFIX--suffix=SUFFIXAppendSUFFIXtobackupfilenames.
-gNUM--get=NUMGetfilesfromRCSetc.ifpositive;askifnegative.
Miscellaneousoptions:
-t--batchAsknoquestions;skipbad-Prereqpatches;assumereversed.
-f--forceLike-t,butignorebad-Prereqpatches,andassumeunreversed.
-s--quiet--silentWorksilentlyunlessanerroroccurs.
--verboseOutputextrainformationabouttheworkbeingdone.
--dry-runDonotactuallychangeanyfiles;justprintwhatwouldhappen.
--posixConformtothePOSIXstandard.
-dDIR--directory=DIRChangetheworkingdirectorytoDIRfirst.
--reject-format=FORMATCreate'context'or'unified'rejects.
--binaryReadandwritedatainbinarymode.
--read-only=BEHAVIORHowtohandleread-onlyinputfiles:'ignore'thatthey
areread-only,'warn'(default),or'fail'.
-v--versionOutputversioninfo.
--helpOutputthishelp.
Reportbugsto.
示例
应用补丁文件:
patch-p1<patchfile
该将补丁文件patchfile应用到当前目录下的源代码文件中。
指定工作目录:
patch-d/path/to/directory-p1<patchfile
该命令将补丁文件patchfile应用到/path/to/directory目录下的源代码文件中。
撤消已应用的补丁:
patch-R<patchfile
该命令将补丁文件patchfile中的更改恢复到源代码文件中。
注意事项
在使用LinuxShell中的patch命令时,有一些注意事项须要注意:
确保补丁文件与源代码文件匹配:补丁文件是按照源代码文件生成的,因而确保补丁文件与要应用的源代码文件是匹配的。假如补丁文件与源代码文件不匹配,将会出现错误。
使用正确的剥离路径级别:假如补丁文件中的路径与当前目录下的源代码文件路径不匹配,须要使用-p选项来指定剥离路径的级别。剥离路径级别表示从补丁文件中剥离的路径层级数。诸如,假如补丁文件中的路径是a/b/c/file.txt,而源代码文件在当前目录下,则须要使用-p2选项来剥离两级路径。
注意撤消已应用的补丁:使用-R选项可以撤消早已应用的补丁。在撤消补丁时,须要确保补丁文件与已应用的补丁完全匹配。
使用安静模式:使用-s选项可以步入安静模式,不显示详尽的输出信息。这在批量应用补丁时可以降低输出信息的干扰。
准许添加新文件:使用-N选项可以容许添加新文件。有时侯,补丁文件可能包含新的文件,使用该选项可以容许添加这种新文件。
注意补丁文件的格式:补丁文件应当依照特定的格式进行编撰,包含必要的行信息。假如补丁文件的格式不正确,比如缺乏必要的行信息,将会出现错误。
底层实现
LinuxShell中的patch命令底层实现主要是通过diff和patch工具来完成。
diff工具:diff工具用于比较两个文件或目录的差别,并生成补丁文件。通过比较源文件和目标文件的内容,diff工具会生成一系列描述差别的行。那些行包含了要添加、删除或更改的内容。diff工具支持多种格式的补丁文件生成,比如普通格式、上下文格式和统一格式。
patch工具:patch工具用于按照补丁文件来应用补丁。它会读取补丁文件中的描述差别的行,并按照这种行来更改源文件。patch工具会依照补丁文件中的路径信息和更改操作来定位源文件,并将更改应用到相应的位置。当应用补丁时,patch工具会检测源文件的内容和补丁文件中描述的差别是否匹配,假如匹配则应用补丁,否则会报错。
在底层实现中,patch命令会调用diff工具生成补丁文件,并使用patch工具来应用补丁文件。patch命令会解析用户提供的选项和参数,并将其传递给diff和patch工具进行相应的操作。通过这些方法,patch命令实现了对源文件的更改和更新。
须要注意的是,patch命令底层实现可能会因不同的操作系统或发行版而有所差别linux操作系统版本,但基本原理和使用方式是相像的。
创建补丁
创建补丁最简单的办法是通过两份代码进行,一份源码,另一份是加进了所更改部份的源代码。原先的取名linux-x.y.z,而更改过的就取名为linux。之后借助下边的命令通过这两份代码创建补丁:
diff-urNlinux-x.y.z/linux/>my-patch
通过-u参数指定使用特殊的dif输出格式。否则得到的patch格式奇特,通常人都难以读懂。
-r参数保证会历所有子目录进行操作。
-N参数指明作出更改的源代码中所有新加的文件在dif作时会含在。另外,
如想对一个单独的文件进行dif,你也可以如此做:
diff-ulinux-x.y.z/some/flelinux/some/file>my-patch
注意,在你自己代码所在的目录下执行diff很重要。这样创建的补丁他人用上去更便捷,哪怕她们的目录名子叫difer也没问题。执行一个这样生成的补丁,只须要在你自己代码树的根目录执行下述命令就可以了:
patch-pl<.../my-patch
在这个反例中,补丁的名子叫my-patchlinux桌面,它坐落当前目录的上一级目录中。-p1参数拿来剪除补丁中头一个目录的名称。如此做的用处是可以在打补丁的时侯忽视创建补丁的人的目录命名习惯。
diffstat是一个很有用的工具,它可以列举补丁所造成的变更的统计(加入或移去的代码行)。输出关于补丁的信息,执行:
diffstat-plmy-patch
在贴出自己的补丁时,附送上这份信息常常会很有用。因为patch(1)会忽视第一个diff之前的所有内容,所以你甚至可以在patch的最上面直接加上简略的说明。
用Git创建补丁
假如你用Git管源代码,须要使用Git创建补丁。用Git创建补并不是哪些难事,只须要两个过程。首先,你必须是更改者,之后在本地递交你的更改。把更改递交到Git树与递交到标准的源代码树并没有哪些两样。你根本不须要专门做任何事情去编辑储存在Git中的文件。你作出更改后linux 应用patch,就须要把所做的更改递交到你的Git版库:
gitcommit-a
-a数表示递交所有的更改。假如你仅仅想递交某个指定文件的更改,则如下示例:
gitcommitsome/file.c
然而虽然有了-a参数,Git并不立刻递交新文件,直至把它们添加到版本库中才递交。要降低一个文件,之后再递交,则输入如下两条命令:
gitaddsome/other/file.c
gitcommit-a
当执行Git的commit命令时,Git会要求输入一个修改日志。你应当尽量填写的详尽和完整清楚地解释更改原因。当在源码树中有一个(或两个)递交时,可以为每位递交创建一个补丁,可以像前面章节所描述的那样来处理这个补丁:
gitformat-patchorigin
对于所有的递交,这样形成的补丁放到你的版本库中而不是原始树中。Git形成的补丁坐落源代码树的根目录中。若果只想为最后第N次递交形成补丁,则可以执行下述命令:
gitformat-patch-N
比如,下边的命令只为最后一次递交形成一个补丁:
gitformat-patch-1
本文原创地址://q13zd.cn/srjxpmlrhgxy.html编辑:刘遄,审核员:暂无