将补丁应用于 Git 下的文件而不使用 Git?
Apply patch to file that's under Git without using Git?
我从 Git 查看了最新的 OpenSSL:
git clone git://git.openssl.org/openssl.git
一位开发者给我发了一个 AARCH64 的补丁来测试:
$ cat RT4237.diff
diff --git a/crypto/ec/asm/ecp_nistz256-armv8.pl b/crypto/ec/asm/ecp_nistz256-armv8.pl
index 9d1bce1..ce6b69e 100644
--- a/crypto/ec/asm/ecp_nistz256-armv8.pl
+++ b/crypto/ec/asm/ecp_nistz256-armv8.pl
@@ -1289,6 +1289,9 @@ $code.=<<___;
stp $acc0,$acc1,[$rp_real,#$i]
stp $acc2,$acc3,[$rp_real,#$i+16]
___
+$code.=<<___ if ($i == 0);
+ adr $bp_real,.Lone_mont-64
+___
}
$code.=<<___;
ldp $acc0,$acc1,[$ap_real,#$i] // in1
补丁不适用于使用 Git。我不会分享 Git 失败,这样人们就不会因为解决 Git 问题而分心。相反,我只是想使用一个实际有效的工具。
我试过使用 Apply Patch File to a Source Code Tree (patch -p3 < RT4237.diff
) 但由于Git 序言:
$ cd openssl
$ patch -p3 < RT4237.diff
(Stripping trailing CRs from patch; use --binary to disable.)
can't find file to patch at input line 5
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff --git a/crypto/ec/asm/ecp_nistz256-armv8.pl b/crypto/ec/asm/ecp_nistz256-armv8.pl
|index 9d1bce1..ce6b69e 100644
|--- a/crypto/ec/asm/ecp_nistz256-armv8.pl
|+++ b/crypto/ec/asm/ecp_nistz256-armv8.pl
--------------------------
如何在不使用 Git 的情况下应用补丁 ?
hikey:openssl$ pwd
/home/jwalton/openssl
hikey:openssl$ find . -name RT4237.diff
./RT4237.diff
hikey:openssl$ find . -name ecp_nistz256-armv8.pl
./crypto/ec/asm/ecp_nistz256-armv8.pl
据我所知,git 补丁是带有序言的常规差异。
因此,删除 git 序言并重试。
根据 pwd
和补丁文件的内容,补丁需要使用 -p1
标志来告诉补丁忽略路径名的前导 "a/" 部分命令它找到要修补的文件:
$ cd openssl
$ patch -p1 < RT4237.diff
(Stripping trailing CRs from patch; use --binary to disable.)
patching file crypto/ec/asm/ecp_nistz256-armv8.pl
$
我从 Git 查看了最新的 OpenSSL:
git clone git://git.openssl.org/openssl.git
一位开发者给我发了一个 AARCH64 的补丁来测试:
$ cat RT4237.diff
diff --git a/crypto/ec/asm/ecp_nistz256-armv8.pl b/crypto/ec/asm/ecp_nistz256-armv8.pl
index 9d1bce1..ce6b69e 100644
--- a/crypto/ec/asm/ecp_nistz256-armv8.pl
+++ b/crypto/ec/asm/ecp_nistz256-armv8.pl
@@ -1289,6 +1289,9 @@ $code.=<<___;
stp $acc0,$acc1,[$rp_real,#$i]
stp $acc2,$acc3,[$rp_real,#$i+16]
___
+$code.=<<___ if ($i == 0);
+ adr $bp_real,.Lone_mont-64
+___
}
$code.=<<___;
ldp $acc0,$acc1,[$ap_real,#$i] // in1
补丁不适用于使用 Git。我不会分享 Git 失败,这样人们就不会因为解决 Git 问题而分心。相反,我只是想使用一个实际有效的工具。
我试过使用 Apply Patch File to a Source Code Tree (patch -p3 < RT4237.diff
) 但由于Git 序言:
$ cd openssl
$ patch -p3 < RT4237.diff
(Stripping trailing CRs from patch; use --binary to disable.)
can't find file to patch at input line 5
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|diff --git a/crypto/ec/asm/ecp_nistz256-armv8.pl b/crypto/ec/asm/ecp_nistz256-armv8.pl
|index 9d1bce1..ce6b69e 100644
|--- a/crypto/ec/asm/ecp_nistz256-armv8.pl
|+++ b/crypto/ec/asm/ecp_nistz256-armv8.pl
--------------------------
如何在不使用 Git 的情况下应用补丁 ?
hikey:openssl$ pwd
/home/jwalton/openssl
hikey:openssl$ find . -name RT4237.diff
./RT4237.diff
hikey:openssl$ find . -name ecp_nistz256-armv8.pl
./crypto/ec/asm/ecp_nistz256-armv8.pl
据我所知,git 补丁是带有序言的常规差异。 因此,删除 git 序言并重试。
根据 pwd
和补丁文件的内容,补丁需要使用 -p1
标志来告诉补丁忽略路径名的前导 "a/" 部分命令它找到要修补的文件:
$ cd openssl
$ patch -p1 < RT4237.diff
(Stripping trailing CRs from patch; use --binary to disable.)
patching file crypto/ec/asm/ecp_nistz256-armv8.pl
$