diff -u file1.txt file2.txt > patchfile
Run Code Online (Sandbox Code Playgroud)
创建一个补丁文件,其中包含patch将 file1.txt 转换为与 file2.txt 完全一样的指令
这不能使用cp命令来完成吗?我可以想象这在文件太大并且必须通过网络传输时很有用,这种方法可能会节省带宽。有没有其他方法可以使用 diff/patch 在其他场景中是有利的?
我想从特定gcc分支创建一个补丁,将其与官方版本进行比较;因此,当我从稳定版本中解压缩 tarball 时,我可以应用补丁并获得与该特定分支中的内容相同的内容。
这是我第一次需要创建补丁,所以这是我第一次这样做,我主要关心的是获得正确的选项和解析,因为我们正在谈论一个非常重要的软件
diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch
Run Code Online (Sandbox Code Playgroud)
这是否足够并且是最好的方法?
我有一个非常大的补丁文件,我正试图将其应用到我的代码中。问题是,我的补丁中的一些更改已经存在于代码中。有没有办法让补丁优雅地忽略已经应用的更改?
该-N选项不符合我的要求。如果它遇到一个已经应用的大块,它将生成一个拒绝文件,并且不会再向该文件应用任何大块。我希望它忽略那个大块头并继续应用补丁的其余部分。我希望它生成 .rej 文件的唯一时间是无法应用大块头并且似乎尚未应用。
有没有办法做到这一点?
我有一个应用程序foobar,有人为其编写了补丁来添加我喜欢的功能。如何使用补丁?
我使用diff上下文行数为 1(-c选项)的命令生成了一个补丁。我的补丁文件内容:
*** /home/sk/abc/def/src/klm/a.py 2015-05-18 16:25:50.348398554 +0530
--- /opt/abc/def/ghi/klm/a.py 2015-05-18 14:27:13.860503469 +0530
***************
*** 72,73 ****
--- 72,74 ----
output, error, rCommand = "", "", ""
+ import subprocess
rCommand = self.copyCmd % (self.executor_hostname, self.testId, self.testId)
Run Code Online (Sandbox Code Playgroud)
当我尝试使用这些命令应用补丁时,
cd /
patch -p0 < sg.patch
Run Code Online (Sandbox Code Playgroud)
我得到了这个输出,
can't find file to patch at input line 3
Perhaps you used the wrong -p or --strip option?
The text leading up to this was:
--------------------------
|*** /home/sk/abc/def/src/klm/a.py 2015-05-18 16:25:50.348398554 +0530
|--- …Run Code Online (Sandbox Code Playgroud) 假设abc我的本地计算机上有一个 4 GB 的文件。我已通过 SFTP 将其上传到远程服务器,花了几个小时。
现在我在本地稍微修改了该文件(最大可能为 50 MB,但不是此文件中的连续字节),并将其保存到abc2. 我还将原始文件保存在abc本地计算机上。
如何计算的二进制差异abc和abc2?
应用:
我只能向patch远程服务器发送一个文件(可能最大 100MB),而不是重新上传整个abc2文件(又需要几个小时!),并且仅abc2在远程服务器上重新创建。abcpatch
在本地,与其浪费 8 GB 来备份abcand abc2,我只能保存abc+ patch,因此只需要 < 4100 MB。
这该怎么做?
PS:对于文本,我知道diff,但在这里我正在寻找适用于任何原始二进制格式的东西,它可以是 zip 文件或可执行文件,甚至其他类型的文件。
PS2:如果可能,我不想使用rsync;我知道它可以以有效的方式复制两台计算机之间的更改(不重新发送未更改的数据),但在这里我真的想要一个patch文件,如果我同时拥有abc和patch.
有时我需要将一个大补丁分成更小的(不相交的)补丁,例如对于包含的每个单独的功能。
通常我通过标准的 vim yank/dd 命令和拆分窗口切换来完成。
但是是否有一些工具/vim 技巧可以帮助进行这种编辑?
例如支持如下命令:将 3 个下一个完整的块移动到打开的补丁文件中
我想应用此补丁,因此我复制了以“Index: src/options.h”开头并以“+@item”结尾的代码,并将其放入在wget的源代码文件夹中创建的新文件中。然后我做了:
$ patch -p0 < name_of_patch
(Patch is indented 1 space.)
patching file src/options.h
patch: **** malformed patch at line 6: char **excludes; /* List of excluded FTP directories. */
Run Code Online (Sandbox Code Playgroud)
我应该如何应用这个?
这是我创建的文件的内容:
Index: src/options.h
===================================================================
--- src/options.h (revision 2276)
+++ src/options.h (working copy)
@@ -62,6 +62,8 @@
char **excludes; /* List of excluded FTP directories. */
char **includes; /* List of FTP directories to
follow. */
+ int maxsize; /* Maximum file size (kB) */ …Run Code Online (Sandbox Code Playgroud) 我尝试制作此处介绍的补丁。
说我有两个目录pp1(modified version)和pp0(clean version)我打个补丁文件,pp0.patch用diff命令:
diff -crB pp0 pp1 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
问题是如果只有 pp1 中有一个文件,它不会包含在补丁中。如何解决它?
更新:
我首先进入pp0目录,测试补丁是否成功
patch --dry-run -p1 -i /path-to-pp0.patch
Run Code Online (Sandbox Code Playgroud)
虽然我已经添加--new-file到diff命令中,但pp1结果中没有列出那些只在
更新:
我不小心修补了错误的文件,所以
diff -crb --new-file pp1 pp0 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
或者
diff -crNb pp1 pp0 > pp0.patch
Run Code Online (Sandbox Code Playgroud)
会做
这是在两个问题上触摸“检查文件或文件夹已被修补”和“制作patch返回跳过已经应用的补丁时0 ”既不但是有一个令人满意的答案。
我正在编写脚本并想测试以下补丁:
完全应用:继续
部分应用:退出
未应用:如果可以成功应用则继续,否则退出
问题是处理部分应用的情况:
mkdir test && cd test
cat << EOF > foobar.patch
--- /dev/null
+++ foo
@@ -0,0 +1 @@
+foo
--- /dev/null
+++ bar
@@ -0,0 +1 @@
+bar
EOF
patch --forward -i foobar.patch
rm foo
Run Code Online (Sandbox Code Playgroud)
所以 bar 存在但 foo 不存在,因为在某些时候它被删除了。现在,如果我在试运行中向前应用补丁,退出代码为 1,因为它没有成功应用。
$ patch --dry-run --forward --force -i foobar.patch
checking file foo
The next patch would create the file bar,
which already exists! Skipping patch.
1 out of 1 …Run Code Online (Sandbox Code Playgroud)