更新:看起来 OpenERP 项目的官方文档现在有关于提出合并建议的指南。我也会把我的版本留在这里,因为它有一些不同的细节。
在玩了几天 Bazaar 和 Launchpad 并提交了一些补丁和合并建议之后,我想我应该写一个我发现的摘要。Launchpad 和 Bazaar 提供了一些强大的工具,特别是对于社区驱动的项目,但我认为新用户还不太可能落入成功的陷阱。有几种方法可以让这个过程变得缓慢和令人沮丧,所以我希望这个演练可以帮助一些人避免一些错误。
这是我为在 Launchpad 上托管的项目进行错误修复并将合并提案提交回团队所学到的工作流程。我正在使用 GNU/Linux 工作站,但我认为 Bazaar 命令在其他平台上是等效的。在此示例中,我正在处理 OpenObject 项目组中的一个项目,称为 OpenObject Addons。维护者的用户名是 openerp。我将把我的工作区放在~/workspace
文件夹中。
如果您想在此处了解有关任何命令的更多信息,请使用bzr help
加号命令名称。
创建共享存储库
因为我要为我想要回馈给项目的每个特性创建一个分支,所以我不希望每个分支都拥有项目整个历史记录的单独副本。为避免这种情况,我创建了一个共享存储库,然后在其中创建每个分支。需要注意的一件事是,您的存储库格式必须与官方分支的格式相匹配,才能使后面的一些步骤正常工作。
检查官方分支上的存储库格式:
bzr info http://bazaar.launchpad.net/~openerp/openobject-addons/5.0
获取代码
现在创建一个工作区文件夹,该文件夹将保存您机器上的任何本地分支 - 我只是在项目之后命名它。然后使用您在官方分支上找到的格式在其中创建一个共享存储库。
cd ~
mkdir workspace
cd workspace
mkdir openobject-addons
cd openobject-addons
bzr init-repo --format=rich-root-pack .
下一步是查看官方分支的源代码。它通常称为主干,但您可能更喜欢使用仅用于修复错误的稳定版本分支。在这个例子中,我将在 5.0 发布分支上工作。
cd ~/workspace/openobject-addons
bzr checkout lp:~openerp/openobject-addons/5.0/ feature-x
这一步可能是大型项目整个过程中最慢的一步,因为您将整个项目的所有代码和所有历史记录复制到硬盘上。请注意,我以我将要处理的功能命名分支。
创建一个分支
此时,您可以尝试在本地工作站上构建和运行代码。您可以更改代码,但您还没有任何地方可以提交它们,因为您可能不允许直接提交到官方分支。要发布您的代码更改,您需要创建一个公共分支。如果您是 Launchpad 的新手,您需要先创建一个帐户并注册一个公钥。
设置帐户后,您可以将自己的分支发布为官方分支的副本,然后开始使用它。该lp-login
命令告诉 bazaar 在启动板站点上使用什么帐户名称,该whoami
命令告诉 bazaar 在您提交的每个修订版上使用什么名称。您使用的电子邮件地址whoami
应与您为 Launchpad 帐户配置的电子邮件地址之一匹配。
cd ~/workspace/openobject-addons/feature-x
bzr lp-login donkirkby
bzr whoami "Don Kirkby <donkirkby@example.com>"
bzr branch --stacked --switch lp:~openerp/openobject-addons/5.0/ lp:~donkirkby/openobject-addons/feature-x
您切换到新分支,以便将提交记录在您的本地历史记录和公共分支中。您可能想了解checkout 和 branch 之间的区别。将其设为堆叠分支意味着创建速度非常快,因为它只包含不在官方分支中的历史记录。这篇博客文章听起来像是公共项目的分支应该默认为堆叠,但这对我不起作用。请注意,我以我想添加的一些功能命名了分支。正如bialix 建议的那样,我为每个功能创建一个单独的分支,我最终会建议将其合并回官方分支。
提交并提出合并提案
现在您有了一个分支,您可以进行代码更改并提交它们。
cd ~/workspace/openobject-addons/feature-x
bzr commit -m "Fixed bug lp:12345 by fleaking the woverbinate() function."
您可以从分支结构中的任何位置提交,默认情况下它会提交整个分支。运行bzr help commit
了解详情。您可能还会发现bzr status
和bzr diff
有用。
一旦您对更改感到满意并且您已将所有内容提交给您的功能分支,您就可以访问 Launchpad 网站并创建一个合并提案。这是一个方便的快捷方式,您可以运行它来启动分支的网页:
cd ~/workspace/openobject-addons/feature-x
bzr lp-open
创建合并提案后,Launchpad 将为它生成一个差异。非常值得回顾一下这个差异。有时我选择了错误的分支作为目标,我只注意到差异的变化比我预期的要多。还有一个bzr send
合并提案的命令,但我没有使用它。
有一个电子邮件界面可以在整个过程中引导您的提案,或者您可以只使用该网站。
将分支附加到错误上也很有用,这样其他人就可以像在自己的系统上使用补丁一样使用它。
持续变化
如果您处理多个功能,并且维护人员在审查您的提案时不是很快,那么可能值得建立自己的主线分支。该分支将您的所有功能收集在一起,并保存您将在服务器上运行的代码。如果官方分支不是很稳定并且您想为您的生产环境稳定一个分支,它也很有用。然后,您可以决定何时升级到最新版本,以及何时为伤害用户的错误使用特定补丁。
第一步是创建另一个堆叠在官方分支上的分支:
cd ~/workspace/openobject-addons
bzr checkout lp:~openerp/openobject-addons/5.0/ main
cd main
bzr branch --stacked --switch lp:~openerp/openobject-addons/5.0/ lp:~donkirkby/openobject-addons/main
现在有两个您需要合并的更改来源。首先,从功能或错误修复分支合并:
cd ~/workspace/openobject-addons/main
bzr merge lp:~donkirkby/openobject-addons/feature-x/
bzr commit -m "Merged feature x"
当然,如果你还有特性分支的本地副本,做本地合并会更快:
cd ~/workspace/openobject-addons/main
bzr merge ../feature-x
bzr commit -m "Merged feature x"
其次,你偶尔会想要合并来自官方分支的最新最好的:
cd ~/workspace/openobject-addons/main
bzr merge --remember lp:~openerp/openobject-addons/5.0/
bzr commit -m "Merged from 5.0 branch"
从官方分支合并时使用后--remember
,可以单独使用bzr merge
从官方分支合并。如果项目使用标签来标记发布点,您可以查看标签列表并从标签合并。
cd ~/workspace/openobject-addons/main
bzr tags -d lp:~openerp/openobject-addons/5.0/
bzr merge -r tag:5.0.7rc2