你如何pipe理软件的本地叉?

作为系统pipe理员,我经常需要为我的公司修改程序。

例:

我们正在使用一个networking界面来pipe理我们的本地DNS。

从互联网上下载并提取tar.gz文件后,我不得不做一些改变:我添加了一个LDAP连接器,更改了一些模板文件,添加了一些自定义页脚/标题,在数据库中添加了一个额外的表格等。

如此多的修改变得难以追踪。

  • 有没有办法轻松地处理软件更新如此多的修改?
  • 如何在下一个软件版本上保留我的修改?

更多信息:

  • 软件源是倍数(github,sourceforge等)
  • 我们不止一个系统pipe理员
  • 版本控制系统是受欢迎的

有没有办法轻松地处理软件更新如此多的修改?

任何具有良好分支合并function的VCS。 select哪个 – 取决于很多因素和习惯

如何在下一个软件版本上保留我的修改?

在SVN世界里,它被命名为“供应商分支” – 你在一个分支中的变化,在另一个分支的上游,你更新供应商分支并合并到你的(阅读SVN书籍或谷歌关于细节)

在DVCS世界中,您可以使用不同的技术

  • 如SVN中的分支
  • 补丁和补丁pipe理

最简单的方法( 对我来说 ,经过一些testing)是mercurial + MQ:

  • 我的更改是在MQ队列中设置MQ修补程序,repo是上游的纯克隆
  • 对于每一个与上游同步,我删除从回购应用的补丁,拉动源,重新应用补丁(与合并冲突解决,如果需要,并保存编辑补丁),导出提示未版本设置和复制到最终目的地

使用版本控制。

如果有一个当前版本控制系统的开发使用。

如果没有已经存在的地方,请考虑使用git。

为什么是混帐? 根据需要,可以有多less或多lesspipe理费用。 您可以运行中央服务器,或不运行。 随你便。 SVN是一个很好的select(并广泛部署),但维护起来可能会更麻烦。

不pipe你的VCS如何,你都应该build立一个基本的目录结构:

OPS | + -- Systems | | | + -- Server2 | | | + -- etc | | | + -- httpd | | | + httpd.conf | + -- Services | + -- httpd | + -- mods | + -- patches 

我build立了这样的追踪我所有的nagiosconfiguration。 它工作完美。

下面是一个简单的例子,假设你刚刚安装了一个Web服务器,并想要备份configuration。

 cd /etc/httpd/ git init git add . git commit -a -m "Initial baseline" 

现在,每次更改文件(每次更改文件,无论多么微不足道)。 运行这个命令:

 git commit -a -m "Enabled mod_cgi and debugging for ticket 17789" 

您现在将/ etc / httpd文件的多个版本保存在/ etc / httpd目录中(具体位于/etc/http/.git目录中)。 这可以与> 10 git回购,所以我会考虑启动一个git服务器。

作为设置服务器的一个附加好处,您的configuration更改现在可以从任何位置进行推送和拉取。 你不再需要ssh进入一台机器来手动编辑configuration文件,你可以很容易地从任何地方运行差异。 如果您在一个大型团队中工作,还可以跟踪和合并更改。

这里有一些文章让你开始使用git:

Git比你想象的要简单。

参加混帐

git主站点

唯一需要的是一个可重复的构build过程,从上游获取源代码并按顺序应用您的补丁程序,直至获得所需的结果。 (这意味着你需要以修补程序的forms跟踪自己的修改,当然。)

这可以像运行正确命令的shell脚本一样简单,或者可以更多地参与它,并为您构build一个本地.rpm / .deb / whatever包来处理这些步骤。 我通常采取第二种方式,因为我喜欢利用包装还有很多其他的好处。

我build议增量创build您的.patch文件,并将它们保持较小并与特定function位相关,以减less上游发行新版本时合并冲突的影响。 如果你试图用一个巨大的教父补丁(包含你对软件所做的每一个改变)来做到这一点,那么它将永远不会被完全应用。

除此之外,它只是勤勉和注意合并,不工作。 对于你所触及的任何东西写回归testing都不会有什么坏处,但是这是你自己决定的。