首页  > 计算机 >

abort: branch ‘default’ has one head – please merge with an explicit rev

本文按署名·非商业用途·保持一致授权
作者:  ,发表于2012年03月28日02时58分 

如果你在使用Mercurial的时候遇到下面的问题:


hg push
searching for changes
abort: push creates new remote head 8ed45f1d9072!
(you should pull and merge or use push -f to force)

hg merge
abort: branch 'default' has one head - please merge with an explicit rev
(run 'hg heads' to see all heads)

hg merge .
abort: cannot partially commit a merge (do not specify files or patterns)

那么你应该在本地维护两个仓库。

repos-dirty和repos-clean

diry这个,是你的工作目录,在里面你有一些配置文件或者其他文件,是不希望提交到服务器或者push给别人的。也就是说,永远有一些文件是处于modified状态的。

而repos-clean,一般情况下你是不需要用它的。它唯一的作用就是用来merge。

设想这个场景:
1)在repos-dirty工作了大半天,中间commit了不少东西,终于到了一个阶段,打算push到服务器
2)hg push,得到错误”you should pull and merge or use push -f to force”。这是因为有人在你最后一次pull之后,最后一次commit之前,push了一些东西到服务器
3)cd ../repos-clean
4)hg pull
5)hg update
4)hg pull ../repos-dirty
5)hg merge
6)hg ci
7)hg push
8)cd ../repos-dirty
9)hg pull or hg pull ../repos-clean
10)hg update

基本的思想就是,你要merge,就必须在一个干净的仓库里进行。在干净的仓库里,你把dirty目录和服务器的都pull过来,然后做个merge。然后push回服务器和dirty目录。

千万千万不要在dirty目录里尝试merge,你会死得很惨。

其实,软件开发和部署的理想状态是,部署文件(配置文件,编译出来的binary等等)和源代码是在不同的目录里的,这样的话,你的源代码目录永远是干净的,这样你也不需要另外创建一个clean目录来merge。

但是,实际上,就我最近几年的开发经验来看,开发目录不可能是clean的,永远有dirty的文件,可能是配置,可能是为了在本地运行而写的dummy文件。我说的clean,是说已经tracked的文件,都是已经被提交了的。untracked的文件,版本系统并不关心。

我这几年唯一可以保持开发目录clean的一个项目,是以HTTP_HOST来构建配置文件的路径。例如localhost,指向runtimes/localhost.ini。运行项目里的命令行脚本的时候,我也传递一个HTTP_HOST过去 HTTP_HOST=localhost ./cli/myscript。

从我的经验来看,对于web项目,这似乎是一个不错的选择,虽然看似很tricky。不知道为何没见过其他人这么用过,至少主流的框架例如php的codeigniter,python的tornado,没有一个是这样做的。tornado似乎推荐大家在启动web app server的时候,传递命令行参数作为配置。我觉得也是相当不错的一个方式,只是我还没有机会去用tornado进行开发。怕只怕,我真正去开发python的时候,会对所有的主流框架不屑一顾。程序员相轻,在我身上是体现得淋漓尽致。


发表评论

  本站文章若无注明,则以署名·非商业用途·保持一致授权
  桂ICP备05004302号 感谢WordPress提供本程序 本模板下载