【问题标题】:Mercurial for Beginners: The Definitive Practical GuideMercurial 初学者:权威实用指南
【发布时间】:2010-11-13 07:25:32
【问题描述】:

灵感来自Git for beginners: The definitive practical guide

这是关于初学者实用使用 Mercurial 的信息汇编。

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

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

注意事项

  • 解释如何完成某事而不是如何完成某事 已实施。
  • 每个答案处理一个问题。
  • 尽可能简洁明了地回答。
  • 编辑/扩展现有答案,而不是在 同一主题。
  • 请提供指向Mercurial wikiHG Book 的链接以供想要了解更多信息的人使用。

问题:

安装/设置

使用代码

标记、分支、发布、基线

其他

其他 Mercurial 参考

【问题讨论】:

    标签: version-control mercurial


    【解决方案1】:

    如何将其配置为忽略文件?

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

    hg add .hgignore
    

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

    你可以用#添加cmets

    例子:

    # python temporary files
    syntax: glob
    *.pyc
    
    #editor autosaves
    *~
    
    # temporary data
    syntax: regexp
    temp
    

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

    【讨论】:

    • 如果您手动 hg add 忽略的文件 Mercurial 将跟踪它们,这可能会很有用。例如,如果您有一堆文件,如 deploy-test.confdeploy-production.conf 等,并且不想对它们进行版本化(其中可能包含密码),但您确实想要对 @ 版本化987654328@你可以忽略deploy*并手动添加deploy-templace.conf
    【解决方案2】:

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

    查看已更改文件的列表:

    $ hg status
    

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

    • M - 已修改。文件已更改,更改尚未提交。
    • A - 已添加。该文件之前未被跟踪,但如果您提交,Mercurial 将开始跟踪它。
    • R - 已删除。该文件之前被跟踪过,但如果您提交,Mercurial 将在这次和未来的提交中停止跟踪它。
    • ? - 未知。 Mercurial 目前未跟踪该文件。除非您使用hg add 添加它,否则提交不会对其产生任何影响。
    • ! - 不见了。该文件已被跟踪,但 Mercurial 在工作副本中找不到它。

    要查看对文件实际所做的更改:

    $ hg diff
    

    【讨论】:

      【解决方案3】:

      如何创建新项目/存储库?

      $ hg init my-repository
      

      【讨论】:

        【解决方案4】:

        如何与 Subversion 交互?

        有三种方式:


        convert extension 会将现有的 Subversion 存储库克隆到 Mercurial 存储库中。它带有 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 extension。它在许多方面都是最复杂的解决方案,因为它使用 Subversion API 与 Subversion 存储库进行通信。它旨在成为 hg-svn 的桥梁。它允许修订的完整往返(完整克隆、拉取和推送),但是在撰写本文时 [XXX:如果/当它变得不正确时修改]它仍在开发中,并且有尚未正式发布。因此,它仅适用于最新的 Mercurial(撰写本文时为 1.3)。

        • 它映射标签和分支(在所有标签前加上tags/,以将它们与等价命名的分支区分开来)。
        • 它维护一个特殊的分支closed-branches 用于关闭在Subversion 中删除的分支。
        • 要求Subversion 存储库按照主干/分支/标签的约定进行布局。
        • 命令集通常是hg svn &lt;subcommand&gt;,尽管它旨在集成到您不需要'svn'部分的程度(即它希望尽可能像对待任何其他Mercurial存储库一样对待Subversion克隆) .;

        它是这样工作的:

        克隆:

        hg svnclone <Subversion URL> 
        

        OR(仅适用于 svn:// 网址)

        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 实用程序 (bitbucket tree)。直到最近,这只允许您克隆和拉取 Subversion 存储库,但从 hgsvn 0.1.7 开始,它支持推送。 [我不知道它的推动力如何以及。任何有更多经验的人都应该更新它。] 它具有以下显着特点:

        • 它为每个 SVN 标签生成一个 Mercurial 标签。
        • 它在每个变更集上放置一个local标签来标记它的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
        

        【讨论】:

        • 我刚刚使用了hg convert,当您拥有一个包含许多提交的 svn 存储库时,确实需要很长时间。使用svnsync 设置本地存储库有助于加快速度——尤其是当您需要多次执行此操作时,因为您的转换命令中有一些错误的选项。
        • 我认为如果您拥有 SVN 存储库的本地副本,所有这些方法都会更快。但是您不能总是获得完整的存储库,对吗?我认为svnsync 需要访问存储库的实际文件,而不仅仅是 URL。
        • 请注意,hgsvn 现在位于 Maintenance Mode,因此不再积极开发。他们建议改用 hgsubversion。
        【解决方案5】:

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

        两者都使用hg diff。当使用hg diff 时,工作副本中的所有更改都会显示并显示提示(最新提交)。

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

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

        上述命令将显示“file.code”的rev1和rev2之间的差异。

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

        $ hg diff {file.code}
        

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

        :D

        【讨论】:

          【解决方案6】:

          您如何为一组特定文件“标记”、“标记”或“发布”一组特定的修订,以便以后随时可以拉取那个?

          $ hg tag my-tag
          

          你也可以克隆你的仓库来创建一个特殊的tag仓库。

          $ hg clone working-repository my-tag-repository
          

          【讨论】:

            【解决方案7】:

            你如何分支?

            $ hg 分支我的分支

            $ hg clone original-repository my-branch

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

            【讨论】:

            • 这是 git 人总是取笑 Mercurial 人推荐的重量级方式。对初学者来说更轻松、更熟悉的方法是hg branch my-branch
            • 您必须注意,这是两个完全不同的操作。
            • 我发现本指南可能有助于在 Mercurial 中进行分支:stevelosh.com/blog/2009/08/a-guide-to-branching-in-mercurial
            • 对于 hg 中非永久性的轻量级分支(作为 hg 分支),请使用 mercurial 书签扩展
            • GoodEnough 链接的文章提供了另一种使用书签的轻量级方法。对于那些不值得拥有自己的分支的变化来说似乎相当不错
            【解决方案8】:

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

            图形界面

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

            插件

            【讨论】:

              【解决方案9】:

              您如何提交更改?

              从当前本地* mercurial 存储库调用此命令

              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 过滤器。
              • 如果未指定提交消息,则会启动配置的编辑器以提示您输入消息。

              【讨论】:

                【解决方案10】:

                如何设置 Mercurial?

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

                首先,您应该通过在.hgrcmercurial.ini 中输入以下内容来设置 Mercurial 用户名:

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

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

                另见“chapter 2”中的“Creating a Mercurial configuration file”,位于“Mercurial: The Definitive Guide”中。

                【讨论】:

                  【解决方案11】:

                  如何合并分支?

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

                  【讨论】:

                  • 作为一个新的 mercurial 用户,以及作为一般的源代码修订控制新手,我不太明白这个答案。你能澄清和扩展你的帖子吗?我还是不太明白如何使用merge命令。
                  【解决方案12】:

                  如何安装 Mercurial?

                  如果您在 Linux 上从源代码安装,或使用 Windows 安装程序,请好好编辑。

                  Mac OS X 10.4(虎)、10.5(豹)

                  使用 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 installer package(截至 2009 年 7 月 26 日为 1.2.1)抱怨它需要 Python 2.5。从the documentation 看来,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
                  

                  (来自Introducing Mercurial, a distributed version control system

                  窗口

                  有一个binary package of the latest version of MercurialTortoiseHg 是一个 Windows shell 扩展,用于安装 Mercurial。 Cygwin 也可以安装 Mercurial。

                  或者(说明太长,因此在此处链接),您可以从源代码中 build an optimisedpure Python 版本的 Mercurial。

                  【讨论】:

                  • 要从源代码构建 mercurial,需要 Python 标头。为那些使用面向包的发行版安装 python-dev 或 python-devel。
                  【解决方案13】:

                  如何获取最新代码?

                  Mercurial 会记住从哪里克隆存储库(在 .hg/hgrc 中),因此您可以简单地运行:

                  hg pull
                  

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

                  hg update
                  

                  更新工作目录。

                  hg pull -u
                  

                  同时执行拉取和更新。

                  【讨论】:

                  • 在进行克隆时,origin 记录在.hg/hgrc 中,因此您在拉/推时不必指定它。如果需要,您可以在.hg/hgrc 中为[paths] 部分添加更多路径。
                  【解决方案14】:

                  如何签出代码?

                  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 或文件系统目录。例如:

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

                  【讨论】:

                    【解决方案15】:

                    您如何提交更改?

                    $ hg commit -m "Commit message"
                    

                    【讨论】:

                      【解决方案16】:

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

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

                      $ hg outgoing
                      

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

                      $ hg outgoing -p
                      

                      【讨论】:

                        【解决方案17】:

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

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

                        $ hg remove {file(s)}
                        

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

                        $ hg remove -Af {file(s)}
                        

                        或来自 Mercurial 1.3

                        $ hg forget {file(s)}
                        

                        【讨论】:

                          【解决方案18】:

                          如何回到之前版本的代码?

                          来自this question

                          $ hg update [-r REV]
                          

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

                          【讨论】:

                            【解决方案19】:

                            如何恢复变更集?

                            有几个可用的选项

                            Easy Way(撤销单个更改集)

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

                            Hard Way(手动区分和应用)

                            第 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 的内容,您需要查看一下。

                            【讨论】:

                            • 这不是hg backout 的用途吗?
                            • 是的,但是 hg backout 仅支持单个变更集 id 来回退。绝对应该提到,我会相应地更新
                            【解决方案20】:

                            您如何查看文件或存储库的修订历史记录?

                            显示整个存储库或文件的修订历史

                            $ hg log {file(s)}
                            

                            $ hg history {file(s)}
                            

                            还有see the list in reverse order

                            $ hg log -r:
                            

                            【讨论】:

                              【解决方案21】:

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

                              在您的 .hg/hgrc 中启用“移植”扩展

                              [extensions]
                              transplant=
                              

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

                              $ hg transplant -b foo 81
                              

                              【讨论】:

                              • 较新版本的 Mercurial 不需要移植扩展。您可以使用内置的graft 命令来执行相同的操作。 hg help graft 了解更多信息
                              【解决方案22】:

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

                              $ hg export -o patchfile changeset
                              

                              然后您可以将其导入另一个分支:

                              $ hg import patchfile
                              

                              【讨论】:

                                猜你喜欢
                                • 2010-11-25
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 1970-01-01
                                • 2010-09-06
                                • 2012-07-20
                                • 2010-09-23
                                • 1970-01-01
                                相关资源
                                最近更新 更多