确定应该应用补丁的顺序的工具?

时间:2016-07-16 05:24:23

标签: ubuntu diff patch rpm deb

背景

我想让Ubuntu在FIPS模式下工作。我需要 FIPSify 的其中一个软件包是openssh。根据CentOS openssh * .spec文件,它们在openssh源代码之上应用的补丁之一是<label id="LblText">NO Text</label> 。但是,debian打包代码根本没有那个补丁,所以我想&#34;借用&#34;它来自CentOS并在Ubuntu上使用。

问题:

不幸的是,由于CentOS在生成之前应用了其他补丁,因此这个openssh-6.6-fips.patch补丁不能完全适用于ubuntu openssh源代码。我有所有的补丁,但是在没有冲突的情况下应用它们并不容易,因为我不知道补丁依赖。

是否有一个可以自动执行此过程的工具,因为输入将从Ubuntu获取openssh源代码,来自CentOS的补丁和&#34; target&#34;我要申请的补丁。然后在输出中它会告诉我是否(以及如何)可以应用这些CentOS补丁而不会引发冲突?

2 个答案:

答案 0 :(得分:1)

用于此的工具是一个版本控制系统,我将展示(完全未经测试的)git命令,说明我将如何操作。

## Create repository ##
$ mkdir workdir
$ cd workdir
$ git init
$ touch .gitignore             # \   Creates a first commit
$ git add .gitignore           #  >  for the branches to
$ git commit -m .gitignore     # /   have in common

## Import debian source code ##
$ git checkout -b debian master
$ tar zxvf /the/debian/source/code.tgz
$ git add .
$ git commit -m "Base debian source code"

## Import centos source code ##
$ git checkout -b centos master
$ tar zxvf /the/centos/source/code.tgz
$ git add .
$ git commit -m "Base centos source code"

## Apply centos rpm patches ##
$ pacth -p1 < /the/file/listed/as/patch1/in/spec/file
$ git add .
$ git commit -m the_pacth1_file_name

$ pacth -p1 < /the/file/listed/as/patch2/in/spec/file
$ git add .
$ git commit -m the_pacth2_file_name

$ # repeat for all the patches up till, including openssh-6.6-fips.patch

到目前为止,除了包含构建包时使用的最终源代码的git存储库之外,该命令除此之外什么都没有。但是,由于补丁存储为单独的提交(这是关键),我们可以进行标准的版本控制操作,并根据需要包含/排除分支的部分。

所以假设openssh-6.6-fips.patch是补丁号5只是为了选择一个数字,你的问题是它不能完全应用于ubuntu源,因为它构建的补丁1到4中做了一些额外的更改在,对吗?

一个正确的版本控制系统跟踪父版本与版本的关系,幸运的是它会找出如何自行解决冲突,或者它可能会放弃,你需要手动解决它,但无论如何,版本控制系统是处理这种情况的最佳工具。

因此,如果您想要从centos源代码中获得的唯一补丁是openssh-6.6-fips.patch,那么您将在基本centos源代码提交之上创建一个仅包含此补丁的新分支,然后将该分支重新绑定到ubuntu分支。那个重新提交的提交将为您提供一个可以完全应用于ubuntu源代码的补丁

$ git checkout -b fips centos
$ git rebase -i master      # Pick only the first base commit
                            # and the openssh-6.6-fips.patch
$ # Resolve conflicts if any and check in

现在你有一个分支fips,它只包含centos基本源代码和fips提交。然后你想把它重新放到ubuntu分支上。

# Rebase from (excluding) one behind the top of fips branch,
# to (including) the tip of the fips branch
$ git rebase --onto ubuntu fips^ fips
# Resolve and check in any conflicts should there be any
$ git format-patch ubuntu..fips

最后一个命令将为您提供一个可以干净地应用的补丁文件,您可以将其添加到打包代码中。

答案 1 :(得分:0)

OpenSSH不是“来自”Ubuntu(或CentOS)。两者都使用特定版本,并对其应用补丁。 RPM规范文件按照应用顺序列出补丁。这些补丁经过调整,可以使用特定版本的OpenSSH作为基础版本。

如果不了解OpenSSH,您会发现将部分补丁修改为不同版本(或不同的打包系统)具有挑战性。

同样,由于OpenSSH被其他软件包使用,您会发现重建软件包并将其替换为Ubuntu系统时会出现问题。

可以使用规范文件作为指南,按顺序应用补丁,并配置OpenSSH的第二个副本以安装在非系统目录中,例如/usr/local/openssh-fips(使用配置脚本的--prefix选项。