如何在Open ERP项目开发中使用bzr工具
问题说明
本文是以Open ERP项目开发来介绍bzr工具的使用,文中介绍的方法也适用于其他的软件项目开发。
Open ERP的项目开发使用了 Launchpad 项目管理平台,其代码的版本管理使用的是bzr工具。我们大概已经知道bzr是一个分布式版本控制工具。那么,对于类似Open ERP这样的大型项目,如何才能充分发挥bzr分布式的优势使代码版本历史清晰,协作开发方便呢?本文通过作者对Open ERP的服务器代码管理的实例来介绍一种较好的使用bzr工具的方法。
Open ERP服务器项目在 Launchpad 上的位置是: http://launchpad.net/openobject-server , 其目前包含三个系列:
- 4.2版本系列,
- 5.0版本系列,
- Trunk版本系列(其包含即将发布的6.0版本)。
一般来说我们对其只有只读权限,就是说我们可以下载代码并修改,但是无法直接提交到其在 Launchpad 上的版本库中。当然我们可以在 Launchpad 上注册自己的修改分支,并通过申请合并的方式,将修改合并到官方分支中. 现在假设我们工作在Trunk版本上,我们可以使用以下命令来创建本地分支:
bzr branch lp:openobject-server server
这样在本地的server目录下就有了Open ERP服务器的完整本地分支了。我们可以直接在这个分支上做代码的调整改进并提交(Commit)到这个本地分支,同时还可以将上游代码的修改合并(Merge)到本地分支。但是,如果我们希望对之前的某个消除bug的代码改进合并到官方的分支中就不是很容易了,因为我们的本地版本已经混合了我们的多个修改了,下面介绍的方法可以让我们提交一个“干净”的针对某bug的代码改进分支,并请求合并到官方分支中
解决方法
创建共享版本库
因为将要使用的是多个任务分支(Task branch)或称为特性分支(Feature branch)的方法。我们希望每个分支中的信息在版本库中共享而不是在每个分支中创建单独的版本历史信息,这样做法的好处是大大的节省了磁盘的使用空间。创建的方法:
bzr init-repo --no-trees server-repo
cd server-repo
上面的命令表示创建一个版本库, --no-trees 选项表示在其中创建的分支将不包含工作树。
创建上游代码的镜像分支
创建一个与上游代码完全一致的本地分支,我们的任何修改都不会提交到该分支,保证该分支“干净”
bzr branch lp:openobject-server server
上面的命令与上一节中提到的创建本地分支的方法完全一样,但是你会发现该命令在本地只创建了一个server目录,目录中并无内容(其实包含一个隐含目录.bzr),这是因为其所在的版本库使用了 --no-trees 选项,这样在创建分支时就不会生成工作树。
如果你之前已经创建了本地分支,现在想使其使用共享版本库,可以将其拷贝到版本库目录下,并进入分支目录中,输入以下命令:
bzr reconfigure --use-shared
这样该分支就会使用共享版本库来管理历史版本信息了。
创建任务分支
现在我们可以创建之前提到的任务或特性分支了,方法是(假设我们现在在版本库目录server-repo下):
bzr branch server trunk
这样我们就基于镜像分支server创建了一个任务分支trunk。我们的修改工作可以在trunk中进行,让镜像分支保持“纯洁”,但是这个trunk分支仍然没有工作树,面对一团空气我们如何做代码修改呀?
轻型检出(lightweight checkout)
bzr checkout --lightweight trunk myserver
cd myserver
#hack hack
bzr commit -m'blah blah'
以上命令将从trunk分支中检出代码在myserver目录中创建工作树,因为使用了 lightweight 选项,所以检出的工作树中不包含任何版本信息,全部通过访问其绑定的分支来获取,这样就又进一步减少了对磁盘的占用。
轻型检出的切换(switch)
假设我们发现了一个bug,这时就可以为解决这个bug创建一个任务分支。因为我们使用了共享版本库,所以创建任务分支是很“轻型”的,很快速也很少占用磁盘空间。对解决不同的bug,或添加不同的功能特性我们都可以用这种快速创建任务分支的办法。这种分支非常的“干净”,只包含针对特定任务的代码改变,非常适合提交给官方分支要求合并。
bzr branch ../server ../bug-fix-1
bzr switch ../bug-fix-1
#hack hack
bzr commit -m'bug1 fixed'
bzr switch ../trunk
以上命令假设我们还在 myserver 这个工作树目录下,创建了 bug-fix-1 这个任务分支,并用 bzr switch ../bug-fix-1 命令切换到这个分支,工作树的内容也会随之改变,Bug解决后,提交改变,并用 switch 切换回 trunk分支。用这种方法在不同的分支切换,不必为每个分支单独创建工作树,使得磁盘空间得到有效的节约,更重要的是我们可以只在一个目录下工作,不用换来换去。
bug解决方案的提交
解决一个bug后我们希望提交给Open ERP核心开发人员,并将其合并到官方分支中。那你首先要在 Launchpad 上注册一个帐号,提交ssh公钥,并且加入 openerp-community 或 openerp-chinese-team 团队(点击左边给出的链接,点击 "Join Team" 按钮加入。 注: 加入 openerp-chinese-team 就会自动加入 openerp-community 团队。)
cd ../bug-fix-1
bzr launchpad-login userid
bzr push lp:~openerp-chinese-team/openobject-server/my-bug-fix
bzr launchpad-login userid 命令只需要输入一次,以后不用输了,其中userid就是你在 Launchpad 上注册的帐号。当你输入完成上面这些命令后,就会在 openerp-chinese-team 的code页面下创建该“远端分支”(remote branch), 同时在 http://code.launchpad.net/openobject-server 下也会显示你的分支。在这个“远端分支”的页面下你可以请求合并(Propose Merge)到官方分支中。这里要注意push命令中,~openerp-chinese-team是团队名称或你注册的用户名,openobject-server是所关联的项目,my-bug-fix是你给这个分支起的名字。
代码更新
cd ../server
bzr pull
server分支更新了来自上游的代码,
cd ../myserver
bzr merge ../server
bzr commit -m'merge official branch'
bzr merge ../bug-fix-1
bzr commit -m'merge bug-fix-1'
以上命令就将上游的更新和bug-fix-1分支的更新合并到了trunk分支














bzr hg git svn 什么的都全用了一遍,发现 git 才是终极解决方案