这是创建补丁的好方法吗?


15

我想从一个特定的gcc分支创建一个补丁,并将其与官方版本进行比较;因此,当我从稳定版本中解压缩tarball时,我可以应用补丁并获得与该特定分支中相同的内容。

这是我第一次需要创建补丁,所以这是我第一次这样做。我主要关心的是正确获取选项和解析,因为我们正在谈论的是非常重要的软件

diff -crB GccStable GccGit > /tmp/fromStabletoBranch.patch

这足够了,并且是最好的方法吗?


这里通常的良好做法涉及版本控制或其中的一些变体。这包括Mercurial,Git及其关联的补丁队列扩展。您也可以考虑被子。也许您可以更详细地了解您要做什么?
Faheem Mitha 2014年

@FaheemMitha“更多细节”是什么意思?我有一个gcc来自官方稳定tar.bz2版的版本,另一个是来自git存储库的不稳定版本,我想创建一个补丁,当然,我只想与master分支而不是整个存储库进行比较。
user2485710 2014年

OK,好的,请确保您可以使用diff之类的简单方法。但通常最好使用版本控制。一方面,这会使您更难了解自己在做什么。
Faheem Mitha 2014年

@FaheemMitha我不明白您的建议,我tar.bz2显然不是git存储库,您认为我应该如何进行?
user2485710 2014年

1
搜索“使用版本控制创建补丁”。我之前写过的两个与之相关的答案是unix.stackexchange.com/a/127810unix.stackexchange.com/a/139817
Faheem Mitha

Answers:


20

是的,这是创建补丁的好方法。

简而言之:

  1. 要为单个文件创建补丁,您的命令可能类似于

    diff -Naru file_original file_updated > file.patch

    哪里

    • -N:将缺少的文件视为空文件
    • -a:将所有文件视为文本
    • -r:递归比较找到的任何子目录
    • -u:输出统一上下文的NUM(默认3行)行
  2. 要为整个目录创建补丁:

    diff -crB dir_original dir_updated > dfile.patch

    哪里

    • -c:输出已复制上下文的NUM(默认3行)行
    • -r:递归比较任何子目录
    • -B:忽略行均为空白的更改

毕竟要应用此补丁,就可以运行

patch -p1 --dry-run < dfile.patch

其中switch p指示patch删除路径前缀,以便正确识别文件。在大多数情况下应该如此1

--dry-run如果您对屏幕上打印的结果感到满意,请删除。


问题:如果目录或文件dir_updated与其中的目录或文件相比被删除,该怎么dir_original办?在diff太需要照顾的那个或者被忽略?
user2485710 2014年

@ user2485710 diff查看删除了哪些文件。file.patch在一个文本文件中,因此您可以在任何编辑器中打开它,也可以只在其中打开它cat,您会看到一行only in dir_original: missingfile.txt
jimmij 2014年

好的,但是然后patch将其删除missingfile.txt还是其他?
user2485710 2014年

这取决于。如果要删除它们,请使用diff -N ...我的第一个示例。通常patch,默认情况下将删除空文件。如果您不想要,请仅diff -crB在问题中使用。在某些(罕见)情况下,在修补手册之后,还需要命令中的-E选项patch来删除空文件:if the input is not a context diff or if patch is conforming to POSIX, patch does not remove empty patched files unless this option is given
jimmij 2014年

我已经运行diff -Naru dir/file dir/file.new > diff.patch越来越can't find file to patch at input line 3patch -p0 --dry-run < diff.patch补丁的第一行显示--- dir/file第二个+++ dir/file.new时间戳,该差异似乎是恰到好处,没有任何选择如何报告的确切文件名的命令查找?
ptica
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.