hg 分布式版本控制(基本使用方法)

  • 内容
  • 评论
  • 相关

02_~ZVTBP0))6O}6}QPILZ4

 

NTX~9O0EC15OT$@~@YD)IVA

 

linux在~/.hgrs文件中建立[ui]段,并在段下添加:

username:youername<youerEmail@mail.com>

username项很好理解,就相当于Bazaar里的whoami命令——我不知道为什么Mercurial没有这个命令,而是默认使用loginname@hostname的形式来标记当前用户,大概它觉得这只是标志,没有什么关系,反正它拥有超强的分支/合并功能。

Mercurial的使用:

完成必要的安装配置工作以后就可以开始使用了。

Mercurial的命令是hg——就是汞。不过说实话,我看到Mercurial这个词想到的是水星。

开始一个项目有两种情况:一是还没有任何Repository的全新项目;二是加入一个已经有的项目——通常已经创建了一个公共的远程Repository。

第一种情况的流程大致是这样:

1、创建本地Repository。在项目的工作目录下运行:

hg init

将会创建一个.hg的目录。

2、配置项目目录(可选)。主要内容有两项,一个是配置.hgignore,把不需要加入管理的文件排除掉;另一个是配置.hgrc,主要是配置ssh(此项仅针对在Windows下用plink进行SSH连接的情况):

.hgignore文件放在项目的根目录上,其内容举例如下:

syntax: glob

*.py[co]
*.swp
*~

使用方法一看就明了,就不解释了。

.hgrc文件放在.hg目录中,其内容举例如下:

[paths]
default = ssh://username@remotehost//home/username/projname
default-push = ssh://username@remotehost//home/username/projname
[ui]
ssh = D:\tools\plink.exe -ssh -pw password

其中paths段里的default/default-push分别是对远程下载上传的默认url,这样在作pull/push操作时可以不必每次输入这个URL。如果SSH不是配置在标准的22端口上,可以在remotehost后面加上(:port)指定端口号。

ui段里的配置与Mercurial.ini是一样的格式和含义。在Windows下使用plink连接SSH需要在这里用-pw选项配置登录密码,以使pull/push操作能够正常工作。

3、检查项目状态。命令为:

hg status

将会列出所有未commit的有效项目文件及其状态——如果在commit以后项目文件未任何修改,此操作将无反馈信息。

比如在刚初始化完以后进行检查,将会列出所有项目文件(被.hgignore排除的文件将不显示),并在前面有一个?标志,表示这些文件尚未被版本管理。

在作完第一次add操作以后检查,则?标志将变为A标志,表示是新增的文件。

如果在commit以后有文件被修改过,则状态检查会列出这些被修改过的文件,并加上M标志。

如果在commit以后有文件被删除或改名,则状态检查会把这些文件加上!标志——改名后的新文件则会作为未管理的新文件而加上?标志。

需要从本地Repository里删除!标志文件则需要使用remove命令,详见后面的说明。

4、将项目文件加入本地Repository。命令很简单:

hg add

即可将项目目录中除了在.hgignore中被排除的文件以外的所有文件都加入到本地Repository中(当然不包括.hg目录,但是会包括.hgignore文件本身)。

5、将变更提交到本地Repository。命令为:

hg commit -m "关于本次提交的说明文本"

6、提交到远程Repository。这里只介绍通过SSH提交的方法,通过HTTP的方法请自行参考相关文档。

首先需要在服务端安装Mercurial,如果是用Linux服务器的话,参考各发行版说明,ubuntu下的安装是很简单的,直接用:

sudo apt-get install mercurial

即可。

然后在服务端的项目目录下创建一个空的Repository(bazaar不需要这样的步骤,它可以用SFTP直接在空目录里远程创建):

cd /home/username/projname
hg init

最后就可以在客户端推送Repository了,在项目目录下运行:

hg push ssh://username@remotehostname//home/username/projname

如果配置了.hgrc里的paths段的default-push,则可以直接用:

hg push

如果提交失败,请检查.hgrc和/或mercurial.ini里是否正确地配置了plink的pw选项,或者是SSH的端口号是否正确。如果配置无误仍然失败,可以用debug选项看一下详细出错信息:

hg push --debug

现在再来看两种情况都需要的一些别的操作:

1、删除文件:

hg remove path/filename

删除后的文件在status命令结果里将被标志为R。需要用通配符删除多个文件时,可以使用-I选项:

hg remove -I path/wildcard .

2、从远程Repository取得别人加入的更新:

hg pull ssh://username@remotehostname//home/username/projname

同样,如果配置了.hgrc,就可以不用输入URL,直接用:

hg pull

取得更新。不过此操作只是更新本地Repository,你还需要用:

hg update

来更新工作目录下的文件。

如果发生变更冲突,此操作会自动进行merge,对于不能自动merge的部分,会弹出默认编辑器(可以在mercurial.ini里配置)要求手工处理。处理完成后会在本地Repository实现自动合并。

3、关于push的补充:

当向一个远程repository作push操作时,如果之前有别人的push内容,本次push将自动产生一个分支,你需要作一次pull操作把所有分支下载到本地repository进行merge。

4、除了status检查工作目录状态以外,还有几个命令用于检查本地Repository状态:

hg head

hg heads

hg log

其中head命令显示当前本地Repository中工作分支的最新版本的提交信息。heads命令显示当前本地Repository中所有未合并分支的最新版本的提交信息。log命令则是显示提交的历史记录。

Mercurial 还有一套很强的变更打包解包功能,即一个开发者可以把自己本地Repository中的变更记录打包发给别人,别的开发者得到这个变更包以后,可以解包到 自己的Repository里,这样就可以连公共的远程Repository也不需要。这样的“分布式”真是太彻底了。

更多关于Mercurial的信息请参考这里