使用 quilt 给软件包打补丁

quilt 是一个管理补丁的工具,它使用了栈的概念来管理多个补丁,其管理的补丁一般被放在 patches 目录下,在这个目录下除了补丁文件还有一个 series 文件,这个文件中列出的补丁文件才是真正被打入项目的补丁文件,同时补丁文件在 series 文件中出现的顺序也是它们在栈中的顺序,没有包含在 series 文件中的补丁文件将不会被 quilt 管理,当新增或移除补丁时 quilt 会自动更新 series 文件不需要手动管理。

接触到这个命令是因为要给一个 deb 软件包打上我自己的补丁,但是 quilt 命令的 man 手册比较混乱,没有将相关的子命令放在一起进行介绍,下面将根据子命令之间的相关性总结下用到的和与之相关的子命令。

applied-unapplied

  • applied:列出包含在 series 文件中且已经应用(生效)了的补丁
  • unapplied:列出包含在 series 文件中但没有应用(生效)的补丁

diff

指定一个被打过补丁的项目文件并根据其变动生成一个 diff 文件,如果指定了补丁则只把指定补丁对项目文件的改动生成到 diff 文件,当同一个项目文件被多个补丁改动过,这个参数就有用了,如果不指定补丁则默认使用最顶层的补丁,如果被打过补丁的项目文件也没有指定,则将包含指定补丁或最顶层的补丁导致的所有项目文件变动。

files

列出最顶层的一个或指定的补丁改动了的所有项目文件

patches

列出所有改动了指定的项目文件的补丁

pop-push

  • pop:从栈中移除一个或多个已经生效了的补丁,不会修改 series 文件(使补丁不生效)
  • push:根据 series 文件应用一个或多个补丁,不会修改 series 文件(使补丁生效)

import-delete

  • import:将指定的补丁文件导入到项目的补丁系统中,会修改 series 文件,同时将指定的补丁文件复制到 patches 目录下,但不会将这个补丁应用,因此还需要执行 push 命令来让这个补丁生效
  • delete:从 series 文件中移除指定或最后一行的补丁文件,会修改 series 文件,也可一起将补丁文件从 patches 目录中删除(默认不会删除),在移除前将取消这个补丁的应用,类似执行 pop 命令

add-remove

  • add:将指定的项目文件添加到指定的或顶层的补丁中,一般是为了要使用下面的 edit 命令修改这个文件
  • remove:从指定的或最顶层的补丁中移除指定的项目文件,大概是当一个补丁修改了多个文件时,移除一个指定的文件不让这个补丁修改

fork-edit-refresh

  • fork:使用指定的名字复制一个补丁,并使用复制后的补丁覆盖 series 文件中旧的补丁
  • edit:编辑指定的项目文件,这个项目文件应该先被使用 add 命令添加到当前补丁中
  • refresh:更新指定的或顶层的补丁

fork 通常用于一个补丁应用后又需要被修改,但这个补丁又需要保留这原始内容,这种情况下就可以先复制出来一个副本,然后修改这个副本