我尝试制作此处介绍的补丁。
说我有两个目录pp1(modified version)和pp0(clean version)我打个补丁文件,pp0.patch用diff命令:
diff -crB pp0 pp1 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
问题是如果只有 pp1 中有一个文件,它不会包含在补丁中。如何解决它?
更新:
我首先进入pp0目录,测试补丁是否成功
patch --dry-run -p1 -i /path-to-pp0.patch
Run Code Online (Sandbox Code Playgroud)
虽然我已经添加--new-file到diff命令中,但pp1结果中没有列出那些只在
更新:
我不小心修补了错误的文件,所以
diff -crb --new-file pp1 pp0 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
或者
diff -crNb pp1 pp0 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
会做
对不起 - 我不记得确切的名字。我知道有一种机制可以在运行时通过加载模块而不需要重新启动来修补内核,只要所涉及的结构不受影响。它被服务器用于安全补丁,最近被 Ubuntu 和 Fedora 使用。
我已经向 linux 内核提交了一个补丁,该补丁得到了一些评论,并在邮件列表上进行了几次迭代。它已由两名开发人员确认和审查,但他们表示是否批准该补丁取决于特定的开发人员。该开发人员相对不在邮件列表中。我不想亲自骚扰他,但我想得到某种承认,该补丁可以或不能被接受。向该开发人员征求反馈的最佳方式是什么?向他或其中一位审阅者发送私人电子邮件是否可以接受,或者通过邮件列表公开所有通信是否重要?
我正在尝试使用 diff 工具创建补丁文件。但面临一个问题。我正在做的方法如下。
我创建了一个名为 a 的目录并将原始文件放入其中。
a/original_file.c
Run Code Online (Sandbox Code Playgroud)
现在我创建了另一个名为 b 的目录,并将具有修改内容的相同文件放入其中。
b/original_file.c
Run Code Online (Sandbox Code Playgroud)
现在b/original_file.c我从互联网上复制的文件内容并将其放入一些文本编辑器中。
给出 command: 后diff -Naur a b > patch_file.patch,文件patch_file.patch被生成并且它有一些不需要的更改(它与缩进有关)。
例如:
return mg_nw (MG_READY_NOY, &rmsg, seqnr,
- sizeof (struct mg_rdy_notify));
+ sizeof (struct mg_rdy_notify));
Run Code Online (Sandbox Code Playgroud)
现在您可以看到与缩进相关的更改,其中sizeof (struct mg_rdy_notify))被替换为相同sizeof (struct mg_rdy_notify))的缩进基础,这是我们不想要的。
我在 Debian 包装中应用了一个带有 quilt 的补丁,但发生了错误:
Applying patch debian/patches/fixshare.patch
patching file net/slirp.c
Hunk #1 FAILED at 529.
1 out of 1 hunk FAILED -- rejects in file net/slirp.c
Run Code Online (Sandbox Code Playgroud)
我用谷歌搜索了一下,我知道这个错误是因为应用补丁时的“模糊”。现在,我的问题是什么是模糊以及如何解决应用被子补丁的问题?
我已经阅读了这篇文章并执行了它所说的步骤,但仍然有问题!
我试图通过在以下联机帮助页中的示例中修补二进制文件来了解它的含义xxd:
Patch the date in the file xxd.1
% echo "0000037: 3574 68" | xxd -r - xxd.1
% xxd -s 0x36 -l 13 -c 13 xxd.1
0000036: 3235 7468 204d 6179 2031 3939 36 25th May 1996
Run Code Online (Sandbox Code Playgroud)
我有一个非 root 用户拥有的文件:
# ls -l example.php
-rw------- 1 foo bar ... example.php
Run Code Online (Sandbox Code Playgroud)
我刚刚应用了一个带有类似命令的补丁
patch -p0 <<-EOF
--- .../example.php.orig 2012-06-20 15:07:13.000000000 +0200
+++ .../example.php 2012-06-20 15:43:05.000000000 +0200
...
EOF
Run Code Online (Sandbox Code Playgroud)
作为 root 和目标文件用户和组都更改为root. 我在man页面中找不到任何对此的引用。
有没有办法像以前一样保留文件所有权而不使用su, sudo, 或chown?
su 似乎无法指定一个组。sudo -u foo patch ... 运行良好,但设置了错误的组。sudo -u foo -g bar patch ...返回Sorry, user root is not allowed to execute '/usr/bin/patch' as foo:bar on hostname。这可能是因为 userfoo不是 …我正在尝试解决的补丁问题的缩小范围:只有两个文件,每个文件的大小为 1 个字节:
a(包含'a')b(包含'b')和目标是制作并应用一个补丁来改变'b'to的值'a'。Makefile 的内容是:
patch:
diff -u b a > b2a.patch
patch -o b.corrected b < b2a.patch
diff a b.corrected
clean:
rm -f b2a.patch b.corrected
Run Code Online (Sandbox Code Playgroud)
鉴于上述情况,make失败并显示以下输出:
$ make
diff -u b a > b2a.patch
make: *** [patch] Error 1
Run Code Online (Sandbox Code Playgroud)
但是,如果我在 bash shell 上一个接一个地执行 Makefile 中的命令,则完全没有问题。
我提交了一个错误报告,并被要求在其中应用补丁并查看它是否有效。我试图找到有关如何去做的文档,但不清楚。
我能弄清楚的最接近的是http://www.thegeekstuff.com/2014/12/patch-command-examples/。
我通过 apt-get 在名为 dpkg 的目录下下载了最新的源代码 -
$ sudo apt-get source dpkg
Run Code Online (Sandbox Code Playgroud)
这是它的样子——
[shirish@debian] - [~/games/dpkg] - [5692]
??[$] pwd
/home/shirish/games/dpkg
Run Code Online (Sandbox Code Playgroud)
那是路径,这里是-
??[shirish@debian] - [~/games/dpkg] - [5691]
??[$] ls
d-m-h-verbose-version-check.patch dpkg-1.18.15 dpkg_1.18.15.dsc dpkg_1.18.15.tar.xz
Run Code Online (Sandbox Code Playgroud)
我想在应用补丁之前进行备份并进行试运行,但需要知道我应该期待哪些命令和输出。另外,我通常使用 -
$ fakeroot debian/rules build
$ fakeroot debian/rules binary
Run Code Online (Sandbox Code Playgroud)
构建本地 deb 包。这够好吗?
更新 1 - 那没有用 -
??[shirish@debian] - [~/games/dpkg] - [5710]
??[$] cd dpkg-1.18.15
??[shirish@debian] - [~/games/dpkg/dpkg-1.18.15] - [5711]
??[$] dch -n "Apply d-m-h fix from #844701."
dch: …Run Code Online (Sandbox Code Playgroud) 可以patch幂等地调用;即,是否存在某些选项组合会导致重复调用patch与单次调用patch(对于非空差异)具有相同的效果?