编辑已经存在的补丁文件

Sha*_*sai 5 linux git patch yocto

.patch使用编辑器编辑 a 是标准做法吗?

设想

.patch在 Yocto 应用程序中使用,我想对我希望移植到我的嵌入式设备的存储库进行一些小的更改。

其中一个补丁如下(为酿造删除了一些细节):

From 85987c659762939241e4bdd4223e63eb5997b181 Mon Sep 17 00:00:00 2001

OE ships php5 as php

---
 airmar/airmar.php             | 2 +-
 n2kd/n2kd_monitor             | 2 +-
 send-message/format-message   | 2 +-
 util/list-product-information | 2 +-
 4 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/airmar/airmar.php b/airmar/airmar.php
index ccd4b4d..46ed49d 100755
--- a/airmar/airmar.php
+++ b/airmar/airmar.php
@@ -1,4 +1,4 @@
-#!/usr/bin/php5
+#!/usr/bin/env php
 <?php
 if (!is_array($argv))
 {
diff --git a/n2kd/n2kd_monitor b/n2kd/n2kd_monitor
index f8cfd42..4cb4766 100755
--- a/n2kd/n2kd_monitor
+++ b/n2kd/n2kd_monitor
@@ -233,7 +233,7 @@ for (;;)
         open STDIN, '/dev/null' or die "Can't read /dev/null: $!";
         open STDOUT, '>>', $MONITOR_LOGFILE or die "Can't write to $MONITOR_LOGFILE $!";
         open STDERR, '>&STDOUT' or die "Can't dup stdout: $!";
-        exec 'php5', '/usr/local/bin/n2k.php', '-monitor';
+        exec 'php', '/usr/bin/n2k.php', '-monitor';
       }
       if (!$monitor)
       {
diff --git a/send-message/format-message b/send-message/format-message
index 590a815..2d91185 100755
--- a/send-message/format-message
+++ b/send-message/format-message
@@ -1,4 +1,4 @@
-#!/usr/bin/php5
+#!/usr/bin/env php
 <?
 #
 # Format a particular N2K command
diff --git a/util/list-product-information b/util/list-product-information
index d958ae4..a54a0f2 100755
--- a/util/list-product-information
+++ b/util/list-product-information
@@ -1,4 +1,4 @@
-#!/usr/bin/php5
+#!/usr/bin/env php
 <?php
 #
 # A very limited script engine that sends and receives CAN messages.
-- 
2.17.0
Run Code Online (Sandbox Code Playgroud)

这个补丁只是替换php5env php徘徊无论它发生。

但是,主代码存储库更改了其中一个文件,该文件以前有一个 php 的shebang,如下所示:

   #!/usr/bin/php5
Run Code Online (Sandbox Code Playgroud)

现在在几次提交之后它没有。

根据我的理解,当前的补丁将不起作用,因为它会首先寻找行号和要删除的内容,但会通过错误,因为它将无法再在文件中找到上述shebang。(已经试过了)

可能的方式

  • 一个明确的方法是使用更新的代码克隆存储库,并将所需的 shebang(env php而不是php5)添加到代码中,并使用它git format-patch -1来获取要恢复的新补丁。

但是,这需要付出很多努力,并且当更改的文件数量超过一定数量时,此过程似乎很乏味。

使用编辑器编辑补丁是否合理(我很确定它不是)?还是有一些git功能可以帮助直接修改补丁而不是相应的文件?

Par*_*ban 1

还有另一种使用 的替代方法quilt refresh。简而言之,当使用 quilt 时,您将把所有补丁复制到一个名为的目录中patches(IMO,这可以在 quiltrc 中配置)。

该补丁目录中的文件series存储了所有补丁文件名。当您使用补丁时,

quilt push
Run Code Online (Sandbox Code Playgroud)

或者

quilt push -a
Run Code Online (Sandbox Code Playgroud)

您将错误退出。假设您有 10 个补丁,而第 3 个补丁无法直接应用,因为您的一些更改已经成为存储库的一部分。

然后你可以打电话

quilt push -f
Run Code Online (Sandbox Code Playgroud)

它将尝试应用所有可能的位置并将无法应用的行存储到.rej文件中。示例输出,

Applying patch patches/0001-To-apply.patch
patching file README.md
Hunk #2 FAILED at 51.
1 out of 2 hunks FAILED -- saving rejects to file README.md.rej
Run Code Online (Sandbox Code Playgroud)

我的 README.md 文件中有一些帅哥。

现在您可以通过比较原始文件来检查未完全应用的更改。在上述情况下,介于README.md和之间README.md.rej。您可以解决失败的地方并调用

quilt refresh
Run Code Online (Sandbox Code Playgroud)

刷新后,您的原始补丁文件patches将根据更改进行更新,现在您可以继续使用quilt pushquilt push -a

注意:Yocto 默认使用 quilt,除非使用PATCHTOOL变量进行更改。