7

我们的团队经常对随 RHEL/CentOS 分发的各种软件包进行定制。我们的工作流程包括安装 SRPM,执行rpmbuild -bp解压和修补源代码,进行更改并创建要包含在规范文件中的 .patch,以及构建新的自定义 SRPM 以供以后与 mock 一起使用:

$ rpm -i grub-0.97-13.5.1.src.rpm
$ rpmbuild -bp rpmbuild/SPECS/grub.spec
$ cp -a rpmbuild/BUILD/grub-0.97 grub-0.97.orig
$ cd rpmbuild/BUILD/grub-0.97
  # Make modifications, generate .patch against ".orig" copy
$ vim rpmbuild/SPECS/grub.spec
  # Add custom .patch to specfile, update version, etc
$ rpmbuild -bs rpmbuild/SPECS/grub.spec
$ mock -r default-x86_64.cfg rpmbuild/SRPMS/grub-0.97-13.5.1.custom-1.src.rpm

此过程运行良好,但我们目前没有使用任何形式的源代码控制来跟踪我们的修改和规范文件更改。根据我对 git 的(公认的基本)理解,我认为应该可以将它注入到这个工作流中,并利用它的一些功能来优化一些步骤(除了 SCM 的正常好处之外)。

例如,diff我们可以创建上游修补源的初始提交,然后进行修改,而不是创建源的副本以供以后使用。准备就绪后,用于git format-patch创建我们的功能补丁并将其添加到规范文件中。

我也想对规范文件进行版本控制,尽管我不确定如何最好地实现这一点。


所以我的问题有三个:

  1. 有没有人在定制上游包时使用 SCM?
  2. 将 git 集成到我们的工作流程中最有效的方法是什么?
  3. 是否有更好的工作流程更有利于版本控制的自定义 RPM 创作?

额外的功劳:假设一个基于 git 的工作流程,我将如何构建一个中央存储库来接受推送?一个带有子模块的仓库?每个包一个回购?

4

1 回答 1

9

有没有人在定制上游包时使用 SCM?

当然。这很常见。

将 git 集成到我们的工作流程中最有效的方法是什么?是否有更好的工作流程更有利于版本控制的自定义 RPM 创作?

我不知道最有效的,但这就是我所做的。我从以下~/.rpmmacros文件开始:

%_topdir    %(echo ${RPM_TOPDIR:-$HOME/redhat})
%_specdir   %{_topdir}/PACKAGES/%{name}/%{version}
%_sourcedir %{_topdir}/PACKAGES/%{name}/%{version}/sources
%_rpmdir    %{_topdir}/PACKAGES/%{name}/%{version}/rpms

如果我安装了一个包(比如 foo-1.0-1.src.rpm),规范文件 ~/redhat/PACKAGES/foo/1.0/foo.spec~/redhat/PACKAGES/foo/1.0/sources.

现在我将包目录初始化为 git 存储库:

cd ~/redhat/PACKAGES/foo/1.0
git init
git add foo.spec sources/*.patch
git ci -m 'initial commit'

记录对规范文件的更改并没有什么特别之处:

git ci -m 'made some really spiffy changes' foo.spec

如果我需要更改包源文件,我会这样做:

rpmbuild -bp foo.spec

现在我创建一个临时 git 存储库:

cd ~/redhat/BUILD/foo-1.0
git init
git add .
git ci -m 'initial commit'
git tag upstream

从现在开始,如果我进行任何更改,我可以针对上游包生成补丁,如下所示:

git diff upstream

或者如果我做了一系列的提交,我可以使用 git 的format-patch命令来创建一系列的补丁:

$ git format-patch upstream
0001-added-text.patch
0002-very-important-fix.patch

这些可以复制到适当的sources目录并添加到规范文件中。

请注意,我为跟踪构建目录中的更改而创建的临时 git 存储库将在我下次运行时被删除rpmbuild

于 2011-09-24T01:45:28.307 回答