Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 创建显示较少删除线的修补程序_Linux_Git_Diff_Patch - Fatal编程技术网

Linux 创建显示较少删除线的修补程序

Linux 创建显示较少删除线的修补程序,linux,git,diff,patch,Linux,Git,Diff,Patch,我需要在两个目录中的不同版本的软件之间创建一个补丁,该补丁将交付给我的客户端。他们需要能够将该修补程序应用于旧版本,以便将其更新到新版本。由于安全要求(查找恶意代码等),我必须亲自阅读此修补程序的每一行。我不想阅读所有被删除的代码,因为如果有150k行被删除,100k行被添加,我必须阅读250k行,而实际上只有100k行值得阅读 目前,我将使用以下方法创建修补程序: diff -N -r --unified=1 old new > patch.diff 然后使用以下方法应用修补程序: c

我需要在两个目录中的不同版本的软件之间创建一个补丁,该补丁将交付给我的客户端。他们需要能够将该修补程序应用于旧版本,以便将其更新到新版本。由于安全要求(查找恶意代码等),我必须亲自阅读此修补程序的每一行。我不想阅读所有被删除的代码,因为如果有150k行被删除,100k行被添加,我必须阅读250k行,而实际上只有100k行值得阅读

目前,我将使用以下方法创建修补程序:

diff -N -r --unified=1 old new > patch.diff
然后使用以下方法应用修补程序:

cp -r old new
cd new
patch -N -p1 < ../patch.diff
在新版本中,添加了一个新文件b.txt,修改了a.txt,c.txt删除了所有行,但仍然存在。运行我当前的补丁创建将导致以下差异:

[user@hostname test]$ diff -N -r --unified=1 old new
diff -N -r '--unified=1' old/a.txt new/a.txt
--- old/a.txt   2019-07-01 18:09:59.586410797 -0400
+++ new/a.txt   2019-07-01 18:17:19.680446218 -0400
@@ -3,2 +3,3 @@
 a
+h
 a
@@ -8,2 +9,3 @@
 a
+awdwd
 a
@@ -11,23 +13,5 @@
 a
-a
-a
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
-b
 b
+foo
+bar
 b
@@ -39,2 +23,9 @@
 c
+d
+d
+d
+d
+d
+d
+d

diff -N -r '--unified=1' old/b.txt new/b.txt
--- old/b.txt   1969-12-31 19:00:00.000000000 -0500
+++ new/b.txt   2019-07-01 18:10:52.943204070 -0400
@@ -0,0 +1 @@
+this is an entirely new file
diff -N -r '--unified=1' old/c.txt new/c.txt
--- old/c.txt   2019-07-01 18:16:11.820985994 -0400
+++ new/c.txt   2019-07-01 18:14:59.775620402 -0400
@@ -1 +0,0 @@
-this is a file that will be empty in the new version

理想情况下,我不必阅读a.txt中删除的所有“b”行。修补程序文件可能只指示要删除的行号,而不显示其内容,或者可能折叠大于N的整个删除部分-只要修补程序仍然可以安全应用,对我来说并不重要。

git不支持以您想要的形式生成修补程序,并且如果提供了这样的修补程序,也不希望应用这样的修补程序,因为它无法验证修补程序是否按预期应用。我意识到这种安全措施可能不适用于您的用例,但它确实适用于git补丁打算提供服务的用例

例如,如果你有一个文件

a
b
c
然后你把它编辑成

a
c
您可能需要一个只显示“删除第2行”的修补程序;但是当您将补丁应用到目标副本时,git担心副本可能已被修改,因为git的全部目的是分布式开发。如果目标被编辑,那么第2行现在不是

b
从技术上讲,这是一场冲突

(有一个
-D
选项用于
git format patch
,该选项与所需内容相关,但它只会忽略已删除的整个文件的预映像。)


所以你需要一些其他的工具。我不知道一个适合这个目的的。您可以编写一些自定义脚本,但是复杂性和风险比最初看起来的要高。

我总是把
diff-uNb…
比作
忽略空白量的变化
或者尝试
diff-uNBw…
试试
忽略所有空白
忽略所有空白行的变化
或者通过计算缩短阅读时间使用
grep-v'[-]*b$'a.txt
从您的审阅中删除仅包含
'b'
“-b”
的行(您将确认每行的内容)
b