我有一个我想使用的绝对路径的补丁。即前几行如下。
--- /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml 2014-10-10 18:47:23.000000000 +1100
+++ /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod 2014-11-11 09:44:17.786200477 +1100
Run Code Online (Sandbox Code Playgroud)
但是,除非我在根目录中,否则它会失败。
~$ cd
~$ sudo patch -i /tmp/fix_kde_icons.patch -p0
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml
Ignoring potentially dangerous file name /usr/share/apps/plasma/packages/org.kde.pager/contents/ui/main.qml.mod
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
...
~$ cd /tmp
/tmp$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/tmp$ cd /usr
/usr$ sudo patch -i /tmp/fix_kde_icons.patch -p0
... #same error as above
/usr$ …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用命令创建补丁
git diff sourcefile >/var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
Run Code Online (Sandbox Code Playgroud)
当我应用补丁时,它给了我
$ patch -v
GNU patch 2.7.5
$ /usr/bin/patch -p1 </var/lib/laymab/overlay/category/ebuild/files/thepatch.patch
patching file sourcefile
Hunk #1 FAILED at 1 (different line endings).
Hunk #2 FAILED at 23 (different line endings).
Hunk #3 FAILED at 47 (different line endings).
Hunk #4 FAILED at 65 (different line endings).
Hunk #5 FAILED at 361 (different line endings).
5 out of 5 hunks FAILED -- saving rejects to file sourcefile.rej
Run Code Online (Sandbox Code Playgroud)
我试图将 dos2unix 应用于 src 文件和补丁文件,但消息没有消失......
UPD:--ignore-whitespace 也无济于事
PATCH COMMAND: …Run Code Online (Sandbox Code Playgroud) 我已经多次阅读了这句话(下面),最近一次在这里,并且一直对如何dd用于修补任何东西感到困惑,更不用说编译器了:
30 年前,我在学校使用的 Unix 系统在 RAM 和磁盘空间方面非常有限。特别是
/usr/tmp文件系统非常小,当有人试图编译一个大程序时会导致问题。当然,无论如何,学生都不应该编写“大型程序”;大型程序通常是从“某处”复制的源代码。我们中的许多人复制/usr/bin/cc到/home/<myname>/cc,并用于dd修补二进制文件以使用/tmp代替/usr/tmp,后者更大。当然,这只会让问题变得更糟——这些副本占用的磁盘空间在那些日子里确实很重要,现在/tmp经常被填满,甚至阻止其他用户编辑他们的文件。在他们发现发生了什么之后,系统管理员做了一个chmod go-r /bin/* /usr/bin/*它“修复”了问题,并删除了我们所有的 C 编译器副本。
(强调我的)
该dd手册页只字未提修补和不认为它可能是重新定意要做到这一点呢。
二进制文件真的可以打补丁dd吗?这有什么历史意义吗?
我已经阅读了 diff 和 patch,但我不知道如何应用我需要的东西。我想它很简单,所以为了显示我的问题,请使用这两个文件:
一个.xml
<resources>
<color name="same_in_b">#AAABBB</color>
<color name="not_in_b">#AAAAAA</color>
<color name="in_b_but_different_val">#AAAAAA</color>
<color name="not_in_b_too">#AAAAAA</color>
</resources>
Run Code Online (Sandbox Code Playgroud)
xml文件
<resources>
<color name="same_in_b">#AAABBB</color>
<color name="in_b_but_different_val">#BBBBBB</color>
<color name="not_in_a">#AAAAAA</color>
</resources>
Run Code Online (Sandbox Code Playgroud)
我想要一个输出,看起来像这样(顺序无关紧要):
<resources>
<color name="same_in_b">#AAABBB</color>
<color name="not_in_b">#AAAAAA</color>
<color name="in_b_but_different_val">#BBBBBB</color>
<color name="not_in_b_too">#AAAAAA</color>
<color name="not_in_a">#AAAAAA</color>
</resources>
Run Code Online (Sandbox Code Playgroud)
合并应包含符合此简单规则的所有行:
我想在 bash 脚本中应用这个任务,所以如果另一个程序更适合,它不一定需要完成差异和补丁
是否可以告诉patch不要生成.orig和.rej文件?我发现补丁创建这些非常烦人。
我不订阅 linux-kernel 邮件列表,但我想获得一组几周前发布的补丁并将它们应用到我的内核中进行测试。我对修补、构建等非常熟悉。我的问题是,获得此补丁集副本的最佳方法是什么?它不适用于我所知道的任何 Git 存储库,它只是被发布到邮件列表中进行讨论。
我找到了许多存档 linux-kernel 邮件列表的站点,我可以在那里看到补丁集,但是这些站点都没有下载原始电子邮件的任何方法(我可以找到),因此我可以使用“git apply “或“补丁”或其他什么。只需从我的网络浏览器复制/粘贴内容,由于空格差异等,它似乎不会很成功。
人们如何管理这个?
对于每个 Linux 内核版本,都有一个补丁文件可供下载。例如,linux-3.12.22有一个对应的patch-3.12.22。
那个补丁的目的是什么?总是在编译之前修补相应的内核,还是将以前的内核版本与补丁匹配的内核(在这种情况下为 3.12.22)保持最新?
git log -G<regex> -p是一个很好的工具,可以在代码库的历史记录中搜索与指定模式匹配的更改。然而,在几乎不相关的大块海洋中找到差异/补丁输出中的相关大块可能会让人不知所措。
当然可以搜索git log原始字符串/正则表达式的输出,但这对减少许多不相关更改的视觉噪音和干扰几乎没有作用。
继续阅读git log,我看到了--pickaxe-all,这与我想要的完全相反:它扩大了输出(到整个变更集),而我想限制它(到特定的大块)。
本质上,我正在寻找一种方法来“智能地”将差异/补丁解析为单个大块,然后对每个大块执行搜索(仅针对更改的行),丢弃不匹配的大块,并输出那些大块那做。
是否存在我描述的工具?有没有更好的方法来获得匹配/受影响的帅哥?
我做过的一些初步研究......
如果可以grep使用 diff/patch 输出并使上下文选项值动态化(例如,通过正则表达式而不是行数),那可能就足够了。但grep并非完全按照这种方式构建(我也不一定要求该功能)。
我找到了patchutils套件,最初听起来它可能适合我的需求。但是在阅读其man页面后,这些工具似乎无法处理基于正则表达式的匹配块。(不过,他们可以接受帅哥的名单……)
我终于遇到了splitpatch.rb,它似乎可以很好地处理补丁的解析,但它需要显着增强以通过 处理读取补丁stdin,匹配所需的大块,然后输出大块。