Ivi*_*ica 16 git version-control mercurial repository bitbucket
我们正在开发一个开源项目,我们正在使用Mercurial进行源代码管理控制.此项目的Mercurial存储库是公共的(我们使用的是Bitbucket).
现在我们有一个客户,我们需要为他们定制我们的开源软件.这些自定义必须保持私有,因此我们可能需要为此客户端创建一个新的Hg存储库; 这个新的存储库将是私有的.
但问题是我们需要[不时]将开放存储库中的更改(例如新功能或错误修复)合并到我们的私有存储库中.
实现这一目标的最佳方法是什么?我读到可以合并两个或多个Mercurial存储库,但历史记录将丢失.由于许多冲突,合并也可能是痛苦的.如果我们将来再获得更多客户,我们应该如何管理他们的存储库呢?我们应该使用一个存储库和多个分支吗?如果两个项目版本开始向不同的方向发展,两个存储库变得越来越不同怎么办?
请分享您的经验.
提前致谢!
Mar*_*ler 13
您所描述的是具有分布式版本控制系统的标准事物:在两个存储库中开发并将一个存储库保持为另一个存储库的子集.首先为私有开发制作一个克隆:
hg clone open private
Run Code Online (Sandbox Code Playgroud)
然后进入private
并在那里制作新功能.正常提交.该private
库现在将包含比更多的变更open
资料库-即新功能.
当错误修正和新功能open
作为常规开源过程的一部分放入存储库时,您将它们拉入private
存储库:
cd private
hg pull
hg merge
Run Code Online (Sandbox Code Playgroud)
这样就可以保持不变量:private
存储库总是包含开放版本中的所有内容,以及私有增强功能.如果您正在处理私有版本并发现错误,那么请记得查看开放版本以查看该错误是否也存在.如果是这样,那么首先在开放版本中修复它并将错误修复合并到私有版本中.如果您错误地修复了私有版本中的错误,则使用hg transplant
将错误修复复制到其他打开版本.
不会有任何历史遗失.当您这样做时,您将不得不像平常那样解决合并hg merge
,并且冲突只会与您的私人更改所需的一样大.
要记住的重要一点是永远不要推动(或拉动)另一种方式,除非你想开始将一些私有变化发布到开源版本中.
您可以使用不同客户端多次使用此设置,如果多个客户端需要相同的私有增强,您还可以根据需要在不同的私有存储库之间推/拉变更集.
原则上基本模型相对简单; 有一个单独的私有存储库,它是公共存储库的克隆(分支),在那里进行所有私有更改,然后定期将公共存储库合并到私有存储库中.关于历史保存没有问题,我不知道为什么你会读到会发生这种情况.
然而,挑战是不要以不可维护的合并地狱结束,而这只能通过严格的纪律来实现.
任何长寿分支的最基本的经验法则是:
保持私有分支尽可能小.最大限度地减少更改量,并保持较小,以免开始重构大部分代码或更改缩进.在像这里这样的单向合并情况下,您修改的任何代码都有可能发生冲突,甚至可能发生冲突.
经常合并.越频繁越好.如果你不这样做,那么当你想要集成来自公共存储库的更改时,你最终会得到一个有大量冲突的超级合并.
此外,您还应该在组织和编写代码时遵守规则,以便于此方案.有明确的规则,关于什么在哪个分支上,以及切断代码片段.
理想情况下,您可以将自定义功能建模为插件或外部库,甚至是单独的项目.这可能并不总是很容易实现,在这种情况下,至少尝试根据您使用工厂方法实例化的原始子类来编写所有私有修改.通过在仅存在于专用分支上的独立文件中进行所有更改,可以最大程度地降低冲突风险.
也写自动化测试.其中很多.否则,您不会立即检测到合并问题(将会发生),并且私有分支通常会被破坏.
最后一个提示:在公共存储库上创建一个推送挂钩,拒绝任何包含您知道的私有变更集的推送; 这将防止意外发布私人代码,并可能为您节省很多麻烦.
归档时间: |
|
查看次数: |
682 次 |
最近记录: |