应用多个 .patch 文件

应用多个 .patch 文件

我有一个包含.patch使用 diff 生成的文件的目录。

我想将所有这些补丁应用patch -p1到另一个目录。

但是补丁只需要一个文件,除非我cat

使用什么命令来应用多个文件xargs或类似的工具?

答案1

如果cat有效,为什么不使用它呢?

使用findxargs

find dirname -name namespec -print0 | xargs -0 patch patchargs

例子:

find src/networking -type f -name 'network*.patch' -print0 | xargs -0 patch -p2

答案2

假设您正在使用 bash/sh/zsh 等...

cd /path/to/source
for i in /path/to/patches/*.patch; do patch -p1 < $i; done

答案3

接受的答案对我不起作用,它似乎假设补丁可以在一个命令行上使用多个补丁文件。我的解决方案:

find /tmp/patches -type f -name '*.patch' -print0 | sort -z | xargs -t -0 -n 1 patch -p0 -i

查找:查找补丁文件

  • /tmp/patches:搜索补丁文件的目录
  • -type f: 仅限文件
  • -name '*.patch': 以 .patch 结尾的文件
  • -print0:将结果以空字符结尾的字符串列表形式输出到 stdout

排序:对补丁文件进行排序以保持顺序(例如 001 在 002 之前)

  • -z:输入以空字符终止(因为我们使用了 -print0)

xargs:使用 stdin 作为参数调用补丁

  • -t:在运行命令之前打印命令,可以将其删除以减少冗长
  • -0:stdin 是一个以空字符结尾的列表
  • -n 1:对列表中的每个项目再次调用 patch(例如,调用 patch N 次,而不是构建列表并调用一次)
  • -i:补丁的参数,告诉它参数将是补丁文件

答案4

Debian 使用了一个非常好的工具,叫做被子用于其包管理。

在 Debian/Ubuntu 上安装

sudo apt install quilt

看看 Shakthi Kannan 的这个非常好的教程:被子教程,即使年纪稍大一些。

为了提供概述,请查看手册页quilt (1)

被子是一种通过跟踪每个补丁所做的更改来管理大量补丁的工具。可以应用、取消应用、刷新补丁等。关键的哲学概念是您的主要输出是补丁。使用 quilt,所有工作都在单个目录树中进行。可以从源树中的任何位置调用命令。

Quilt 管理补丁堆栈。补丁会逐步应用到基础树和所有先前的补丁之上。它们可以推送到堆栈顶部(quilt push),也可以从堆栈中弹出(quilt pop)。

可以使用命令来查询系列文件的内容(quilt series,见下文)、堆栈的内容(quilt applied、quilt previous、quilt top)以及特定时刻未应用的补丁(quilt next、quilt unapplied)。默认情况下,大多数命令适用于堆栈中最顶部的补丁。

名为的文件series包含补丁文件名列表,该列表定义了补丁的应用顺序。除非有自动生成系列文件的方法,否则它通常与一组补丁一起提供。在此文件中,每个补丁文件名都在单独的行上。补丁文件由相对于补丁目录的路径名标识;补丁可能位于此目录下的子目录中。系列文件中以井号 (#) 开头的行将被忽略。

当 quilt 添加、删除或重命名补丁时,它会自动更新系列文件。quilt 用户可以修改系列文件,同时应用某些补丁,只要应用的补丁保持其原始顺序即可。不同的系列文件可用于以不同的方式组装补丁,例如对应于不同的开发分支。

在应用补丁(或“推送到堆栈”)之前,补丁修改的所有文件的副本都保存到 .pc/patch 目录中。补丁将添加到当前应用的补丁列表(.pc/applied-patches)。稍后,当重新生成补丁(quilt 刷新)时,将使用 GNU diff 将 .pc/patch 中的备份副本与源树中文件的当前版本进行比较。

总而言之,您可以将补丁添加到名为 series 的文件中,并通过多种方式进行管理。您可以添加、删除补丁,并获取已应用补丁的列表,...

相关内容