我有一个包含.patch
使用 diff 生成的文件的目录。
我想将所有这些补丁应用patch -p1
到另一个目录。
但是补丁只需要一个文件,除非我cat
。
使用什么命令来应用多个文件xargs
或类似的工具?
答案1
如果cat
有效,为什么不使用它呢?
使用find
和xargs
:
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 的文件中,并通过多种方式进行管理。您可以添加、删除补丁,并获取已应用补丁的列表,...