Rendering of reStructured text is not possible, please install Docutils.

====================
 Mercurial 学习笔记
====================

:作者: 胡玉新

.. contents:: 目录
   :depth: 2

.. sectnum::
   :depth: 2

Mercurial 一览: 基础
====================

安装
----

Linux
~~~~~

Debian/Ubuntu::

    apt-get install mercurial
    
Fedora Core::

    yum install mercurial

Gentoo::

    emerge mercurial

...

Windows
~~~~~~~

下载并安装。

开始
----

检查安装是否成功::

    hg version

查看帮助::

    hg help init

代码仓库
--------

代码仓库不过是普通一个目录树。

获取代码库的本地拷贝
~~~~~~~~~~~~~~~~~~~~

::

    hg clone http://hg.serpentine.com/tutorial/hello

查看日志
~~~~~~~~

::

    hg log
    hg log -r 3                 # 指定修订号
    hg log -r ff5d7b70a2a9      # changeset identifier
    hg log -r 1 -r 4            # 指定多个修订号
    hg log -r 1:3               # 指定修订号范围
    hg log -r 3:1               # 修改 log 的输出顺序

获取更多信息
~~~~~~~~~~~~

显示详细信息(-v, --verbose)::

    hg log -v -r 3
    
显示修改内容(-p, --patch)::

    hg log -v -p -r 2

修改和查看修改
--------------

用 hg clone 隔离我们的自己修改,值得说明的是:本地克隆不仅速度快,而且通常占用更小的磁盘空间::

    $ cd ..
    $ hg clone hello my-hello
    $ cd my-hello

.. note::

    一般情况下,最好保持远程代码库的一个原始拷贝,你可以从这里克隆多个副本进行修改,各个副本之间互相隔离。

查看修改::

    $ hg status
    $ hg diff

提交修改
--------

设置用户名
~~~~~~~~~~

修改配置文件::

    [ui]
    username = Your Name<Your Email Address>

linux
`````

编辑 .hgrc, 按照前面的说明修改。

Windows
```````

编辑 %USERPROFILE%\Mercurial.ini。

如何找到 %USERPROFILE%:

 * 打开命令行, 缺省的目录通常就是 %USERPROFILE%, 或者用 ECHO %USERPROFILE% 查看
 * 也可以在打开文件的对话框中直接输入 %USERPROFILE%\Mercurial.ini

Mercurial 尝试用户名的顺序
``````````````````````````

    #. hg commit -u "用户名"
    #. HGUSER 环境变量
    #. ~/.hgrc 中的 usernamme
    #. EMAIL 环境变量
    #. 本地用户名 + 主机名

提交信息
~~~~~~~~

由于 hg log 只显示提交信息的第一行,因此最好第一行写得完整、独立。

查看刚才的提交
~~~~~~~~~~~~~~

::

    hg tip -vp

共享修改
--------

从其他代码库获取修改
~~~~~~~~~~~~~~~~~~~~

查看其他代码库做了那些修改::

    hg incomming ../my-hello

获取代码库的修改::

    hg pull ../my-hello
    
更新工作目录
~~~~~~~~~~~~

hg pull 更新了代码库,如果要更新工作目录,还需要执行::

    hg update

hg pull 的 -u 参数可以获取代码库的修改的同时更新工作目录::

    hg pull -u ../my-hello

更新到指定修订版::

    hg update 2
    
[?]查看 parents 修订版::

    hg parents

把修改发布到其他代码库
~~~~~~~~~~~~~~~~~~~~~~

查看本地代码库做了那些修改::

    hg outgoing ../my-hello
    
发布代码库的修改::

    hg push ../my-hello

通过网络共享修改
~~~~~~~~~~~~~~~~

::

    hg outgoing http://hg.serpentine.com/tutorial/hello
    hg push http://hg.serpentine.com/tutorial/hello
    

Mercurial 一览: 合并修改
========================

合并
----

合并步骤,注意查看后面的说明::

    hg pull ../my-hello           # 现在代码库有多个 heads
    hg heads                      # 查看代码库的 heads
    #! hg update                   # 失败! 无法更新工作目录
    #! hg update -C                # 强制更新! 会丢失本地修改
    hg merge                      # 合并修改
    hg parents                    # 可以看到多个 parents
    hg commit -m 'Merged changes' # 提交合并结果

合并冲突
--------

幕后
====

和许多版本控制系统不同, Mercurial 的基础概念简单到很容易理解软件是如何工作的。

Mercurial 的历史记录
--------------------

跟踪单个文件的历史
~~~~~~~~~~~~~~~~~~

Mercurial 把文件保存在文件日志中,文件日志保存在 .hg/store/data 目录。

对于大文件来说,文件日志保存在两个文件中 .d (数据)文件 和 .i (索引)文件, 对于小文件来说只需要一个 .i 文件。

安全高效的存储
~~~~~~~~~~~~~~

高效存储
````````

采用增量机制。

安全操作
````````

Mercurial 只在文件末尾增加数据。另外 Mercurial 把每次写操作作为事务的一部分,保证操作的原子性。

快速读取
````````

采用索引文件。

修订历史、分支、合并
--------------------

<略>

工作目录
--------

工作目录保存代码库的一个快照。

Mercurial 常用用法
==================

添加文件
--------

::

    hg init add-example
    cd add-example
    echo a > a
    hg status
    hg add a
    hg commit -m 'Added one file'
    hg status

Mercurial 跟踪的是文件,不是目录
--------------------------------

Mercurial 跟踪的是文件,不是目录, 因此无法添加一个空目录, 需要空目录时有下面两个方法。

方法一: 添加一个隐含文件::

    mkdir empty
    touch empty/.hidden
    hg add empty
    
方法二: 不要跟踪空目录,要空目录干嘛?需要时自己创建一个得了。

停止跟踪文件
------------

::

    hg remove
    hg remove --force           # 移除已修改/刚添加的文件
    hg remove --after           # 文件已经删除时,可以用

方便的添加/移除文件命令
-----------------------

添加未添加的文件,移除已经删除的文件::

    hg addremove

拷贝文件
--------

太麻烦了,不用也罢。

重命名文件
----------

重命名文件使用拷贝文件的方式实现的,相当于拷贝文件并并删除原文件。

重命名也是比较麻烦的, 因此也要少用。

撤销提交
--------

::

    hg revert

协同工作
========

Mercurial Web 接口
------------------

简单服务器::

    hg serve -p 8080

协作模型
--------

有了合适的工具后, 采用何种工作流是一个文化问题而不是技术问题。 Mercurial 没有太多限制工作流, 因此需要你和你的工作组来确定适合你们自己需要的工作流。

需要考虑的因素
~~~~~~~~~~~~~~

...

发布管理和分支管理
==================

::

    hg tag v1.0
    hg tag -r 1 v1.1
    hg tag -f -r 2 v1.1
    hg log -r v1.0
    hg tag --remove v1.1
    hg tag -r 3 -l 1.1.1        # 本地 tag
    
分支示例::

  myproject
    myproject-1.0
      myproject-1.0.1
        myproject-1.0.1-bugfix
    myproject-new-feature

合并示例::

    hg pull ../myproject-new-feature
    hg merge
    hg commit -m 'Merge bugfix from 1.0.1 branch'
    hg push
    
发现和改正错误
==============

取消上次提交
------------

::

    hg rollback

取消错误的 pull
---------------

::

    hg rollback
    
rollback 的限制
---------------

 * 一旦 push 后, rollback 就没用了
 * 只能 rollback 一次
 
hg revert
---------

示例::

    hg revert foo               # 放弃对 foo 的修改

    hg add bar                  # 错误添加了文件 bar
    hg revert bar               # 取消添加
    hg remove file              # 错误删除了文件 file
    hg revert file              # 好的,恢复了
    rm file                     # 错了,删错了
    hg revert file              # 好的,恢复了
    hg copy file newfile        # 错了
    hg revert newfile           # 改正就行了
    hg rename file newfile      # 错了
    hg revert newfile           # 知错就改

hg backout
----------

复杂的应用

定制 Mercurial 的输出
=====================

::

    hg log --style compact
    hg log --style changelog
    hg log --template 'I saw a changeset: {desc}\n'

常用关键字:

 * author
 * branches
 * date
 * desc
 * files
 * filet_adds     添加的文件列表
 * filet_dels     删除的文件列表
 * node
 * parents
 * rev
 * tags


应用实例
========

用 mercurial 管理你的系统
-------------------------

::

    cd /
    sudo hg init
    sudo sh -c "echo -e 'syntax: glob\n*' > .hgignore"
    sudo chown -R xxx\: .hg .hgignore

其他
====

FAQS
----

查看信息
~~~~~~~~

如何知道当前使用的用户名
````````````````````````

查看当前用户名::

    hg showconfig ui.username
    hg debugconfig ui.username          # debugconfig -- alias of showconfig

查看工作目录的信息
``````````````````

::

    hg parent           # 查看工作目录的信息
    hg id -n            # 查看工作目录的修订版号

导出特定版本
~~~~~~~~~~~~

::

    hg archive -r ...

清空工作目录
~~~~~~~~~~~~

::

    hg update null

backout
~~~~~~~

xs

配置文件
--------

查看配置文件的帮助::

    man hgrc
    
选项
----

 * -v, --verbose
 * -q, --quiet
 * -p, --patch
 * -r, --rev


中英文对照
----------


========================== ==================== ==============
英文                       中文                 说明
========================== ==================== ==============
repository                 代码仓库
pull                       获取
push                       发布
========================== ==================== ==============

MercurialNote (last edited 2009-12-25 07:16:06 by localhost)