初学者Mercurial:权威的实用指南


237

受到Git初学者的启发:权威的实用指南

这是有关使用Mercurial面向初学者进行实际使用的信息的汇总。

初学者-接触过源代码控制但并不十分了解的程序员。

实用-涵盖大多数用户经常遇到的情况-创建存储库,分支,合并,从/到远程存储库的拉/推等

注意事项

  • 说明如何完成某件事,而不是如何实现。
  • 每个答案处理一个问题。
  • 尽可能清楚简洁地回答。
  • 编辑/扩展现有答案,而不是针对同一主题创建新答案。
  • 请为想要了解更多信息的人提供指向Mercurial WikiHG Book的链接。

问题:

安装/设置

使用代码

标记,分支,发布,基准

其他

其他水银参考

Answers:


16

如何配置它以忽略文件?

忽略是在存储库根目录中的普通文本文件.hgignore中配置的。像添加普通文件一样添加它:

hg add .hgignore

有两种语法选项可用于文件匹配,即glob和regexp。glob是类unix的文件名扩展,而regexp是正则表达式。您可以通过单独添加syntax: globsyntax: regexp在线来激活它们。接下来的所有行将使用该语法,直到下一个语法标记。您可以根据需要使用任意数量的语法标记。默认语法为regexp,因此,如果仅使用regexp,则不需要任何语法标记。

您可以使用#添加评论

例:

# python temporary files
syntax: glob
*.pyc

#editor autosaves
*~

# temporary data
syntax: regexp
temp

忽略仅适用于非托管文件(即尚未签入的文件)。要忽略受版本控制的文件,可以使用-I和-X开关。


7
值得一提的是,如果您手动hg add忽略了文件,Mercurial将会跟踪它们。例如,如果您有一堆文件(例如deploy-test.confdeploy-production.conf等),并且不想对其进行版本控制(它们中可能包含密码),但是您确实想要进行版本控制deploy-template.conf,则可以忽略deploy*并手动添加deploy-templace.conf
史蒂夫·洛斯

7

您如何查看未提交的内容或当前代码库的状态?

要查看已更改的文件列表:

$ hg status

这将打印每个已更改的文件及其状态,其中包括:

  • M-已修改。文件已更改,并且更改尚未提交。
  • A- 添加。该文件以前没有被跟踪过,但是如果您提交Mercurial,它将开始跟踪它。
  • R-已删除。该文件之前曾被跟踪,但是如果您提交Mercurial,则在此以后的提交中将停止跟踪该文件。
  • ?-不知道 Mercurial当前未跟踪该文件。除非hg add对它进行添加,否则提交不会对其产生任何影响。
  • !- 失踪。已跟踪该文件,但Mercurial在工作副本中找不到它。

要查看对文件实际进行的更改:

$ hg diff

6

您如何创建一个新的项目/存储库?

$ hg init my-repository

5

如何与Subversion交互?

有三种方法:


转换扩展将克隆现有的Subversion版本库到水银之一。它带有Mercurial。它大致如下所示:

hg convert <Subversion URL or directory> <path to new Mercurial repository>

例如,这将抓住SixApart memcached存储库的主干。

hg convert http://code.sixapart.com/svn/memcached/trunk

该扩展可以将新版本从Subversion存储库逐步引入到Mercurial存储库中(有点像pull)。但是,它不支持采用Mercurial修订版本并将其发送回Subversion(不推送)。 [XXX:如果错误,请更正]


hgsubversion扩展。在许多方面,它都是最复杂的解决方案,因为它使用Subversion API与Subversion存储库进行通信。它的目标是成为 HG-SVN桥。它允许对修订版本进行完整的往返操作(完整的克隆,提取和推送),但是在撰写本文时[XXX:如果/如果变得不正确,请对其进行修改]它仍在开发中,尚无正式版本。因此,它仅适用于最新的Mercurial(在撰写本文时为1.3)。

  • 它映射标签和分支(所有标签之前都有,tags/以将它们与等效命名的分支区分开)。
  • 它维护了一个特殊的分支,closed-branches用于关闭在Subversion中删除的分支。
  • 要求按照主干/分支/标签的约定对Subversion存储库进行布局。
  • 通常,命令集hg svn <subcommand>旨在将其集成到不需要'svn'部分的程度(即,它希望像其他Mercurial存储库一样尽可能多地处理Subversion克隆)。

它是这样的:

克隆:

hg svnclone <Subversion URL> 

或(仅适用于svn://URL)

hg clone <svn:// URL>

拉:

hg svn pull

推:

hg svn push

传入:

hg svn incoming

传出:

hg svn outgoing

检出整个存储库:

hg svnclone http://code.sixapart.com/svn/memcached

hgsvn实用程序(到位桶树)。直到最近,这仅允许您克隆和提取Subversion存储库,但从开始hgsvn 0.1.7就支持push。[我不知道如何以及它推。有更多经验的人应该对此进行更新。]它具有以下显着功能:

  • 它为每个SVN标签生成一个Mercurial标签。
  • 它在每个变更集上放置一个本地标记,以标记其SVN版本。
  • 它将每个Mercurial修订版本放在以SVN分支命名的命名分支上。例如branches/some-feature会像hg branch some-feature。它将中继打开trunk(即,Mercurial默认分支上没有任何内容,除非用户明确切换到该分支)。
  • 它将尝试识别分支和标签,并创建它们,但如果不能,则将其跳过。当Subversion存储库不遵循常规的主干/分支/标签布局时,这很方便。

它是这样的:

克隆:

hgimportsvn <Subversion URL>

拉:

hgpullsvn

推:

hgpushsvn

传入:

hgpullsvn -n

传出:

hgpushsvn -n

检出整个存储库:

hgimportsvn http://code.sixapart.com/svn/memcached

仅检查树干:

hgimportsvn http://code.sixapart.com/svn/memcached/trunk

2
我只是用过hg convert,当您拥有一个有很多提交的svn存储库时,确实需要很长时间。设置本地存储库svnsync有助于大大加快操作速度-尤其是当您需要多次执行该操作时,因为convert命令中的选项有误。
Debilski

我认为,如果您有SVN信息库的本地副本,那么所有这些方法都将更快。但是您不能总是获得完整的存储库吗?我认为svnsync需要访问存储库的实际文件,而不仅仅是URL。
夸克

请注意,hgsvn现在处于维护模式,因此不再积极开发它。他们建议改为使用hgsubversion。
乔恩·L.

5

您如何比较文件的两个修订,或者当前文件和先前的修订?

两者都使用hg diff。当hg diff被用在工作副本和尖端(最新提交)所有更改显示。

对于“您如何比较文件的两个修订?”

$ hg diff -r{rev1} -r{rev2} {file.code}

上面的命令将显示“ file.code”的rev1和rev2之间的不同。

对于“如何比较当前文件和以前的版本?”

$ hg diff {file.code}

上面的命令将显示当前版本的“ file.code”和最新修订版(最新提交)之间的差异。

:D


4

如何为一组特定的文件“标记”,“标记”或“发布”一组特定的修订版本,以便您以后可以随时将其拉出?

$ hg tag my-tag

您还可以克隆存储库以创建特殊的标记存储库。

$ hg clone working-repository my-tag-repository

3
为什么不hg tag my-tag呢?
史蒂夫·洛斯

4

您如何分支?

$ hg分支我的分支

要么

$ hg clone原存储库my-branch

尽管应该注意的是,分支创建了一个“虚拟”目录(即文件保持不变,但是hg将它们视为系统内部不同),而克隆创建了实际的完整副本。严格来说,克隆不是分支。


4
这是git人们总是取笑Mercurial人们推荐的重量级方法。对于初学者来说,更轻松,更熟悉的方式是hg branch my-branch
Steve Losh,2009年

8
您必须注意,这是两个完全不同的操作。
stepancheg

2
我发现此指南可能对Mercurial 分支机构
mbillard 2010年

对于不是永久性的hg轻量级分支(如hg分支),请使用mercurial书签扩展名
hultqvist 2010年

由GoodEnough链接的文章提供了另一种使用书签的轻量方法。对于那些
无关紧要的

4

适用于Mercurial的GUI / IDE插件好吗?

图形用户界面

  • TortoiseHg适用于几乎所有操作系统。包括Windows资源管理器集成。它也可以在Linux和其他一些OS(包括Max OS X)上运行。它的界面有点笨拙,一开始使用起来有点麻烦,但是它非常完整且功能强大。
  • Murky在Mac OS X 10.5或更高版本上运行。Murky非常适合浏览存储库和基本命令,但是您还需要知道如何使用命令行。
  • MacHg是一个不错的Mac OS X Gui,它的功能和修饰度比Murky好,但您仍然需要命令行。
  • SourceTree最初是Mac客户端,最近才提供Windows版本。非常漂亮的UI(至少在OS X上),支持大多数Hg功能,包括搁置。

外挂程式


3

您如何提交更改?

从当前的本地*商业资源库调用此命令

hg commit [OPTION]... [FILE]...

别名:ci

  • 本地Mercurial存储库在当前目录中具有.hg

选项可以是:

 -A --addremove     mark new/missing files as added/removed before committing
    --close-branch  mark a branch as closed, hiding it from the branch list
 -I --include       include names matching the given patterns
 -X --exclude       exclude names matching the given patterns
 -m --message       use <text> as commit message
 -l --logfile       read commit message from <file>
 -d --date          record datecode as commit date
 -u --user          record user as committer

一个示例命令是:

hg commit -m "added readme" README

注意事项

  • 如果省略文件列表,则将提交“ hg status”报告的所有更改。
  • 如果要提交合并结果,请不要提供任何文件名或-I / -X过滤器。
  • 如果未指定提交消息,则会启动配置的编辑器,提示您输入消息。

3

如何设置Mercurial?

Mercurial将其配置信息存储~/.hgrc在* nix系统和%UserProfile%\mercurial.iniWindows系统上。(%UserProfile%通常"C:\Documents and Settings\[username]\"在Windows 2000或Windows XP系统上,并且通常C:\Users\[username]\在Windows Vista和Windows 7系统上。)

首先,您应通过在.hgrc或中放置以下内容来设置Mercurial用户名mercurial.ini

# This is a Mercurial configuration file.
[ui]
username = Firstname Lastname <email.address@example.net>

Windows系统上的TortoiseHg用户可以选择运行 hgtk userconfig

另请参阅“ Mercurial:权威指南 ”的第2章中的创建Mercurial配置文件 ” 。


3

您如何合并分支?

$ cd repository-where-i-want-to merge
$ hg pull branch-i-want-to-merge
$ hg merge # if necessary

作为一个新的商业用户,以及一般来说是源代码版本控制的新手,我不太了解这个答案。您能否澄清和扩大您的帖子?我仍然不太了解如何使用merge命令。
Jamin Gray

3

如何安装Mercurial?

如果您是从Linux上的源代码安装的,或者已使用Windows安装程序,请进行良好的编辑。

Mac OS X 10.4(Tiger),10.5(Leopard)

使用Python的easy_install(通过Setuptools):

sudo easy_install mercurial

它会找到最新版本(在撰写本文时为1.3.1),并安装在:

/Library/Frameworks/Python.framework/Versions/2.6/bin/

使用Python 2.6时,它也绕过Mercurial OS X安装程序包(截至2009年7月26日为1.2.1),抱怨它需要Python 2.5。从文档中可以看出,Fink和Macports安装了1.2版。

的Linux

大多数显式Linux软件包似乎都滞后于当前版本,因此请使用easy_install(如上所述)或下载Mercurial tarball,提取档案,更改为mercurial目录并运行:

$ make
$ sudo make install    # do a system-wide install
$ hg debuginstall      # sanity check
$ hg                   # see help

(摘自Mercurial,一个分布式版本控制系统

视窗

有一个最新版本的Mercurial二进制包TortoiseHg是Windows外壳扩展,用于并安装Mercurial。Cygwin也可以安装Mercurial。

或者,(指令太长,因此在此处链接),您可以从源代码构建优化纯Python版本的Mercurial。


1
要从源代码构建商品,将需要Python标头。为使用面向软件包的发行版的用户安装python-dev或python-devel。
Nicolas Dumazet 09年

3

您如何获得最新代码?

Mercurial记得从中克隆存储库的位置(在.hg / hgrc中),因此您可以简单地运行:

hg pull

从原始存储库中提取最新代码。(这不会更新工作目录)

hg update

更新工作目录。

hg pull -u

同时执行拉取和更新。


1
.hg/hgrc进行克隆时,原点会记录在其中,因此在拉/推时无需指定原点。您可以根据需要在[paths]部分中添加更多路径.hg/hgrc
Martin Geisler 2009年

3

您如何签出代码?

hg clone [OPTION]... SOURCE [DEST]

选项可以是:

 -U --noupdate      the clone will only contain a repository (no working copy)
 -r --rev           a changeset you would like to have after cloning
    --pull          use pull protocol to copy metadata
    --uncompressed  use uncompressed transfer (fast over LAN)
 -e --ssh           specify ssh command to use
    --remotecmd     specify hg command to run on the remote side

其中source是位于存储库中的原始文件的源,在此处它可以是远程文件 URL或文件系统目录。例如:

目标是源代码在本地文件系统中的位置。


1

您如何提交更改?

$ hg commit -m "Commit message"

1

您如何看待推送时将哪些更改发送到上游存储库?

使用hg outgoing来获取将被设置为默认存储库的变更列表:

$ hg outgoing

要获得实际的代码更改,请使用-p--patch)。这将完整输出每个变更集:

$ hg outgoing -p

1

如何从存储库中删除文件?

要从存储库中删除文件,并在下次提交时将其删除:

$ hg remove {file(s)}

从存储库中删除文件但不删除它

$ hg remove -Af {file(s)}

或来自Mercurial 1.3

$ hg forget {file(s)}

1

您如何返回到以前的代码版本?

这个问题

$ hg update [-r REV]

@van:如果稍后提交,则将有效地创建一个新分支。然后,您可能只继续在该分支上工作,或者最终将现有分支合并到该分支中。


1

您如何还原变更集?

几个选项可用

简单方法(撤消单个变更集)

$ hg backout -m 'back out second change' tip
reverting myfile
changeset 2:01adc4672142 backs out changeset 1:7e341ee3be7a
$ cat myfile
first change

困难的方式(手动比较和应用)

步骤1:创建补丁文件,以还原版本107和108之间的更改:

hg diff -r107 -r108 --reverse  > revert-change.patch

(或者,不带--reverse的hg diff -r108 -r107将执行相同的操作)

第2步:应用补丁文件:

patch -p1 < revert-change.patch

某些差异可能无法应用,例如:

Hunk #3 FAILED at 517.
1 out of 3 hunks FAILED -- saving rejects to file 'foo/bar.c.rej'

.rej文件将包含未能应用的diff的内容,您需要查看一下。


1
这不是hg backout为了什么吗?
Wim Coenen 2010年

是的,但是hg backout仅支持单个变更集ID进行backout。绝对应该被提及,我会相应地更新
SLF


1

如何将一个分支的部分合并到另一个分支?

在.hg / hgrc中启用“ transplant”扩展名

[extensions]
transplant=

加载目标分支,然后移植目标修订。
例如:从分支'foo'樱桃修订版81到当前分支

$ hg transplant -b foo 81

较新版本的Mercurial不需要移植扩展。您可以使用内置graft命令执行相同的操作。hg help graft有关更多信息
DOOManiac 2012年

1

您如何从特定变更集中提取补丁?

$ hg export -o patchfile changeset

然后可以使用以下命令将其导入另一个分支:

$ hg import patchfile
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.