<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://wiki.magiclinux.org/index.php?action=history&amp;feed=atom&amp;title=Patch</id>
	<title>Patch - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.magiclinux.org/index.php?action=history&amp;feed=atom&amp;title=Patch"/>
	<link rel="alternate" type="text/html" href="https://wiki.magiclinux.org/index.php?title=Patch&amp;action=history"/>
	<updated>2026-08-11T11:22:51Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.37.1</generator>
	<entry>
		<id>https://wiki.magiclinux.org/index.php?title=Patch&amp;diff=61&amp;oldid=prev</id>
		<title>Sejishikong：创建页面，内容为“== 使用patch ==  　　patch附带有一个很好的帮助，其中罗列了很多选项，但是99%的时间只要两个选项就能满足我们的需要：  &lt;pre&gt;&lt;nowiki&gt; 　　patch -p1 &lt; [patchfile]  　　patch -R &lt; [patchfile] (used to undo a patch) &lt;/nowiki&gt;&lt;/pre&gt;  　　-p1选项代表patchfile中文件名左边目录的层数，顶层目录在不同的机器上有所不同。要使用这个选项，就要把你的patch放在要被打补丁的目录…”</title>
		<link rel="alternate" type="text/html" href="https://wiki.magiclinux.org/index.php?title=Patch&amp;diff=61&amp;oldid=prev"/>
		<updated>2021-12-20T01:39:31Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“== 使用patch ==  　　patch附带有一个很好的帮助，其中罗列了很多选项，但是99%的时间只要两个选项就能满足我们的需要：  &amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt; 　　patch -p1 &amp;lt; [patchfile]  　　patch -R &amp;lt; [patchfile] (used to undo a patch) &amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;  　　-p1选项代表patchfile中文件名左边目录的层数，顶层目录在不同的机器上有所不同。要使用这个选项，就要把你的patch放在要被打补丁的目录…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;== 使用patch ==&lt;br /&gt;
&lt;br /&gt;
　　patch附带有一个很好的帮助，其中罗列了很多选项，但是99%的时间只要两个选项就能满足我们的需要：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
　　patch -p1 &amp;lt; [patchfile]&lt;br /&gt;
&lt;br /&gt;
　　patch -R &amp;lt; [patchfile] (used to undo a patch)&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　-p1选项代表patchfile中文件名左边目录的层数，顶层目录在不同的机器上有所不同。要使用这个选项，就要把你的patch放在要被打补丁的目录下，然后在这个目录中运行path -p1 &amp;lt; [patchfile]。来自Linux内核patch的一个简短的引用可以这样实现：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
　　diff -u --recursive --new-file v2.1.118/linux/mm/swapfile.c linux/mm/swapfile. c--- v2.1.118/linux/mm/swapfile.c Wed Aug 26 11:37:45 1998 +++ linux/mm/swapfile.c Wed Aug 26 16:01:57 1998 @@ -489,7 +489,7 @@&lt;br /&gt;
&lt;br /&gt;
　　int swap_header_version;&lt;br /&gt;
&lt;br /&gt;
　　int lock_map_size = PAGE_SIZE;&lt;br /&gt;
&lt;br /&gt;
　　int nr_good_pages = 0; - char tmp_lock_map = 0; + unsigned long tmp_lock_map = 0;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　应用来自本段中使用-p1开关拷贝的patch可以有效地减短patch定位的路径；patch会查找当前目录下一个名为/mm的子目录，接着应该会在这儿发现swapfile.c文件，然后等待打补丁。在这个过程中，以破折号（“-”号，译者注）开始的行会被一个以加号（“+”号，译者注）开始的行代替。一个典型的patch会包含对多个文件的更新，每个部分中都由对两个版本的文件运行diff -u命令的输出结果组成。&lt;br /&gt;
&lt;br /&gt;
　　patch在操作时把自己的输出结果显示在屏幕上，但是这种输出通常都滚屏太快，来不及观看。原来准备patch的文件名为*.orig，新的patch文件会覆盖这个初始文件名。&lt;br /&gt;
&lt;br /&gt;
== 打补丁的问题 ==&lt;br /&gt;
&lt;br /&gt;
　　使用不同版本的patch问题来源可能不同，所有的版本在网络上都是可用的。Larry Wall近年来已经不再做很多工作来更新patch了，这可能是由于他最后发行的一个版本在大部分情况下都能正常运行。最近几年以来，一直是GNU项目的 FSF程序员发行新版本的patch。他们首先修订有问题的patch，但是我最近一直使用没有问题的2.5版本（这是Debian2.0的发行版本号）。过去，我的2.1版本也一直运行的很好。当前的GNU patch的版本可以从GNU FTP站点上获取，然而大部分人都只使用他们Linux发行版中所提供的版本。&lt;br /&gt;
&lt;br /&gt;
　　让我们假定你已经对一个目录下的源程序文件进行了patch修补工作，但是patch并没有清晰地发挥作用。这可能会偶然发生，在打补丁的过程中会显示错误信息，其中带有行号，说明哪一个文件出现了问题。有时错误是很明显的，例如缺少了分号，这种错误可以不费多大力气就能改正。另外一种可能是从 patch部分删除了产生问题的部分，但是这样根据所涉及到的文件的不同可能会正常工作，也可能不能正常工作了。&lt;br /&gt;
&lt;br /&gt;
　　另外一种常见的错位为：假设你有一个未使用tar打包的内核源程序文件，在/linux/arch/下浏览各个子目录时你会发现各种机器体系结构子目录，例如alpah、sparc等等。如果你和大多数Linux用户一样，使用的是Intel的处理器（或者是Intel系列），你可以决定删除这些目录，这些目录对于编译你特殊的内核并不需要，只是白白占用了磁盘空间。一段时间之后发行了一个新的内核patch，此时试图进行patch操作，当它发现不能找到自己打补丁需要的Alpha或者PPC文件，就会停顿下来。幸运的是patch在这些地方允许用户参与，它会询问&amp;quot;Skip this patch?&amp;quot;回答&amp;quot;y&amp;quot;，patch就可以按照正确的路径继续执行。也许你需要回答这个问题很多次，因此允许自己不需要的目录保留在磁盘上是一种很好的方法。&lt;br /&gt;
&lt;br /&gt;
== 给内核打补丁的技巧 ==&lt;br /&gt;
&lt;br /&gt;
　　很多Linux用户使用patch都主要是给内核源程序打补丁，因此有一些技巧可以使用。可能最简单的方法是使用shell脚本给内核打补丁，这可以在内核源程序树中的/scripts子目录中找到。这种方便的、编写良好的脚本是由Nick Holloway在1995年编写的；两年以后，Adam Sulmicki增加了多种压缩格式的支持，包括*.bz、*.bz2、compress、gzip和无格式文本（也就是已经解压的patch）。这个脚本假定在你使用新版本的patch时，你的内核源程序是在/usr/src/linux目录中。这些缺省值可以通过这种格式的命令行开关覆盖：patch -kernel [sourcedir [patchdir] ]。如果任何一部分的patch失败，对内核打补丁的过程都会失败，但是如果patch清晰地起作用，它就会调用find，这会删除所有的patch留下的*.orig文件。&lt;br /&gt;
&lt;br /&gt;
　　如果你准备查看命令的输出，或者可能你希望保留*.orig文件直到你确定打过补丁的源程序编译已经通过，按照我的经验，直接运行patch（正如前面介绍的一样，patch位于内核源程序的最高目录）是很可靠的。为了避免对patch进行解压，在使用之前，可以使用这样一个技巧：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
　　gzip -cd patchXX.gz | patch -p1&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　或者&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
　　bzip2 -dc patchXX.bz2 | patch -p1&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　在使用patch之后，可以使用find程序来检测被拒绝的文件：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
　　find . -name *.rej&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　第一次使用这个命令，语法可能有些不清楚。点号（“.”）说明find应该查找当前目录并递规查找当前目录之下的所有子目录。记住，点号前后都应该有一个空格。通配符&amp;quot;*&amp;quot;号前面的反斜线把星号转义出来，以免shell会搞混，星号是有其它意义的。如果find找到了任何的*.rej文件，它就会把文件名打印到屏幕上。如果没有任何输出find就退出了，那么就差不多能确定patch正确发挥作用了。&lt;br /&gt;
&lt;br /&gt;
　　find的另外一个工作是删除*.orig文件：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
　　find . -name *.orig -print0 | xargs -0r rm -f&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　这个命令敲起来相当麻烦，可以使用一个新的shell别名来代替这个命令。在你的~/.bashrc文件中类似这样的一行：&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
　　alias findorig &amp;#039;find . -name *.orig -print0 | xargs -0r rm -f&amp;#039;&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
　　可以允许你只输入findorig就可以调用前面的命令。如果别名命令的定义中包含空格，那么就必须使用单引号。为了不用先退出再重新登陆就可以使用一个新的别名，可以在命令行中敲如~/.bashrc。&lt;/div&gt;</summary>
		<author><name>Sejishikong</name></author>
	</entry>
</feed>