创建一个补丁,显示更少的删除行

时间:2019-07-01 22:47:48

标签: linux git diff patch

我需要在两个目录中的不同版本的软件之间创建一个补丁,并且该补丁将交付给我的客户端。他们需要能够将该补丁应用到较旧的版本,以将其更新为较新的版本。由于安全性要求(查找恶意代码等),我必须亲眼阅读此补丁的每一行。我不想读取所有删除的代码,因为如果有15万行删除的行和10万行添加的行,那么我必须通读25万行,而实际上只有其中的10万行值得阅读。

当前,我将使用以下方式创建补丁:

diff -N -r --unified=1 old new > patch.diff

然后使用以下命令应用补丁:

cp -r old new
cd new
patch -N -p1 < ../patch.diff

例如,我具有以下目录结构:

[user@hostname test]$ tree -af
.
├── ./new
│   ├── ./new/a.txt
│   ├── ./new/b.txt
│   └── ./new/c.txt
└── ./old
    ├── ./old/a.txt
    └── ./old/c.txt

在新版本中,添加了新文件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)-对我而言并不重要,只要补丁仍然可以安全地应用即可。

1 个答案:

答案 0 :(得分:1)

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

例如,如果您有文件

a
b
c

您将其编辑为

a
c

您可能需要一个仅显示“删除第2行”的补丁;但是当您将补丁应用到目标副本时,git担心副本可能已被修改-因为git的全部目的都是分布式开发。如果目标已经过编辑,那么第二行现在就变成了

b

那么从技术上讲就有冲突了。

-D有一个git format-patch选项,它与您想要的内容有关,但仅省略了被删除的整个文件的前映像。)

因此,您需要其他一些工具。我不认识一个好人。您可以编写一些自定义脚本,但是其复杂性和风险要比最初看起来要高。