当前位置: 首页 > 工具软件 > Mercurial > 使用案例 >

mercurial使用_使用Mercurial管理源代码

后易安
2023-12-01

UNIX和Linux系统上的源代码管理

识别并跟踪多个开发人员所做的更改,并将其合并到一个最新的代码库中,便可以进行协作的多开发人员项目。 VCS软件(也称为修订控制系统(RCS)或源代码管理(SCM)系统)使多个用户可以将更改提交到相同的文件或项目,而一个开发人员的更改不会意外覆盖另一人的更改。

Linux®和UNIX®系统深深扎根于VCS软件中,从诸如RCS和并发版本系统(CVS)的恐龙到诸如Arch,Bazaar,Git,Subversion和Mercurial的更现代的系统。 像Git一样,Mercurial最初是作为名为BitKeeper的商业源代码管理系统的开源替代品,该系统用于维护和管理Linux内核的源代码。 自成立以来,Mercurial已经发展成为一种流行的VCS系统,许多开放源代码和商业项目都在使用该系统。 使用Mercurial的项目包括Mozilla,IcedTea和MoinMoin Wiki。 请参阅相关主题的链接,这些,还有更多的例子。

VCS系统通常引用每个源代码集合,在其中可以进行更改并作为存储库进行跟踪。 开发人员如何与存储库交互是更传统的VCS系统(例如称为CVC和Subversion)(称为集中式VCS系统)与更灵活的VCS系统(例如Mercurial和Git)(称为分布式VCS系统)之间的主要区别。 开发人员使用客户端/服务器模型与集中式VCS系统进行交互,在该模型中,对源代码的本地副本所做的更改只能推回到中央存储库中。 开发人员使用对等模型与分布式VCS系统进行交互,在该模型中,中央存储库的任何副本本身就是可以向其提交更改并可以与任何其他副本共享更改的存储库。 分布式VCS系统实际上没有中央主存储库的概念,但是几乎总是由策略定义的,因此存在一个用于构建,测试和维护软件主版本的存储库。

为什么选择水银?

Mercurial是一个小型,功能强大的分布式VCS系统,易于入门,同时仍提供VCS高级用户可能需要(或想要)使用的高级命令。 Mercurial的分布式特性使您可以轻松地在本地处理项目,通过本地提交来跟踪和管理您的更改,并在必要时将这些更改推送到远程存储库。

在现代的分布式VCS系统中,最接近Mercurial的VCS系统是Git。 Mercurial和Git之间的一些区别如下:

  • 多个内置的撤消操作 :Mercurial的revertbackoutrollback命令使您可以轻松地返回到特定文件的先前版本或先前提交的更改集。 Git提供了一个内置的revert命令,它具有典型的仅限火箭科学家的语法。
  • 内置的Web服务器 :Mercurial提供了一个简单的集成Web服务器,可以轻松地快速托管资源库,以供其他人使用。 推送需要忽略安全性或支持安全套接字层(SSL)的更复杂的设置。
  • 复制/移动操作期间的历史记录保留 :Mercurial的copymove命令均保留完整的历史记录信息,而Git在任何情况下均不保留历史记录。
  • 分支机构 :Mercurial自动共享所有分支机构,而Git要求每个存储库都设置自己的分支机构(在本地创建分支机构或通过将其映射到远程存储库中的特定分支机构)。
  • 全局和本地标签 :Mercurial支持在存储库之间共享的全局标签,这使共享代码开发中特定点的信息变得容易,而无需分支。
  • Windows平台上的本机支持 :Mercurial用Python编写,Microsoft®Windows®系统支持。 因此,Mercurial可作为Windows可执行文件使用(请参阅参考资料 )。 Windows上的Git更为复杂-您可以选择msysGit,使用Cygwin下的标准git或使用基于Web的托管系统和存储库。
  • 自动存储库打包 :Git要求您显式打包和垃圾回收其存储库,而Mercurial会自动执行其等效操作。 但是,对于相同的代码库,Mercurial存储库往往大于Git存储库。

Mercurial和Git爱好者也很高兴讨论每个VCS系统命令集的学习曲线,优点和可用性。 空格阻止了此处的讨论,但是围绕该主题的网络搜索将提供许多有趣的阅读材料。

创建和使用Mercurial存储库

Mercurial提供了两种为项目的源代码创建本地存储库的基本方法:通过显式创建存储库或克隆现有的远程存储库:

  • 要创建本地存储库 ,请使用hg init [REPO-NAME]命令。 执行此命令时提供存储库名称,将在指定位置为该存储库创建目录。 不提供存储库的名称会将当前工作目录转换为存储库。 当为现有代码库创建Mercurial存储库时,后者非常方便。
  • 要克隆现有存储库 ,请使用hg clone REPO-NAME [LOCALNAME]命令。 Mercurial支持用于访问远程存储库的超文本传输​​协议(HTTP)和安全外壳(SSH)协议。 清单1显示了一个示例hg命令以及通过SSH克隆存储库时产生的结果输出。

    清单1.通过SSH克隆Mercurial存储库
    $ hg clone ssh://codeserver//home/wvh/src/pop3check 
    	wvh@codeserver's password: 
    	destination directory: pop3check
    	requesting all changes
    	adding changesets
    	adding manifests
    	adding file changes
    	added 1 changesets with 12 changes to 12 files
    	updating to branch default
    	12 files updated, 0 files merged, 0 files removed, 0 files unresolved
    	remote: 1 changesets found

注意 :要使用HTTP协议访问Mercurial存储库,必须在该存储库中启动Mercurial的内部Web服务器( hg serve -d ),或者使用Mercurial的hgweb.cgi脚本将Mercurial与现有的Web服务器(例如Apache)集成。 通过HTTP克隆时,通常需要为本地存储库指定一个名称。

创建或克隆存储库并将该存储库设为工作目录之后,就可以开始使用其中包含的代码,添加新文件等了。

在Mercurial获得帮助

Mercurial的主要命令是hg ,它支持一组子命令,这些子命令与其他VCS系统中的子命令相似。 要查看最常用命令的列表,请执行不带参数的hg命令,该命令显示的输出类似于清单2所示。

清单2. Mercurial提供的基本命令
Mercurial Distributed SCM

    basic commands:

    add        add the specified files on the next commit
    annotate   show changeset information by line for each file
    clone      make a copy of an existing repository
    commit     commit the specified files or all outstanding changes
    diff       diff repository (or selected files)
    export     dump the header and diffs for one or more changesets
    forget     forget the specified files on the next commit
    init       create a new repository in the given directory
    log        show revision history of entire repository or files
    merge      merge working directory with another revision
    pull       pull changes from the specified source
    push       push changes to the specified destination
    remove     remove the specified files on the next commit
    serve      export the repository via HTTP
    status     show changed files in the working directory
    summary    summarize working directory state
    update     update working directory

    use "hg help" for the full list of commands or "hg -v" for details

此简短列表仅显示基本的Mercurial命令。 要获取完整列表,请执行hg help命令。

提示 :通过执行hg help COMMAND命令,将COMMAND替换为任何有效的Mercurial命令的名称,您可以获得有关任何Mercurial命令的详细帮助。

检查存储库状态

签入更改是任何VCS系统中最常见的操作。 您可以使用hg status命令查看存储库中文件的所有未决更改。 例如,在创建一个新文件或修改一个现有文件之后,您将看到清单3所示的输出。

清单3. Mercurial的状态输出
$ hg status
    M Makefile
    ? hgrc.example

在这种情况下,Makefile文件是已被修改的现有文件(由该行开头的字母M表示),而hgrc.example文件是一个未被跟踪的新文件(由问题表示)在行的开头标记? )。

将文件添加到存储库

要将hgrc.example文件添加到此存储库中正在跟踪的文件列表中,请使用hg add命令。 将一个或多个文件名指定为参数会将这些文件显式添加到Mercurial跟踪的文件列表中。 如果您未指定任何文件,那么所有新文件都将添加到存储库中,如清单4所示。

清单4.将文件添加到存储库
$ hg add
    adding hgrc.example

提示 :要自动添加所有新文件并标记所有已删除的文件以进行永久删除,可以使用Mercurial的便捷hg addremove命令。

检查存储库的状态表明已添加了新文件(在行首以字母A表示),如清单5所示。

清单5.修改后的存储库状态
$ hg status
    M Makefile
    A hgrc.example

提交变更

签入更改是任何VCS系统中最常见的操作。 进行并测试更改后,您就可以将这些更改提交到本地存储库了。

首次提交更改之前

如果这是您的第一个Mercurial项目,则必须提供一些基本信息,以便Mercurial可以识别提交那些更改的用户。 如果不这样做,则会在abort: no username supplied...的行中看到一条消息abort: no username supplied...当您尝试提交更改时,您的更改将不会提交。

要添加用户信息,请在主目录中创建一个名为.hgrc的文件。 该文件是您的个人Mercurial配置文件。 您至少需要将清单6中所示的基本用户信息添加到此文件中。

清单6.用户的.hgrc文件中的强制性信息
[ui]
    username = Firstname Lastname <user@domain.tld>

与你的姓氏和名字替换名字和姓氏 ; 用您的电子邮件地址替换user@domain.tld ; 保存修改后的文件。

您可以在Linux和UNIX系统上的/ etc / mercurial / hgrc文件以及Microsoft Windows系统上的Mercurial.ini文件中设置适用于所有用户的默认Mercurial配置值(不应包含特定于用户的信息)。文件位于Mercurial安装目录中。

标准提交过程

创建或验证〜/ .hgrc文件后,可以使用hg commit命令来提交更改,通过不提供参数来标识要提交的特定文件或提交所有未决的更改,如以下示例所示:

$ hg commit
    Makefile
    hgrc.example
    committed changeset 1:3d7faeb12722

如该示例输出中所示,Mercurial将与单个提交相关联的所有更改称为changeset 。

提交更改时,Mercurial将启动默认编辑器,以使您能够添加提交消息。 为了避免这种情况,可以在命令行上使用-m "Message.."选项指定提交消息。 要使用其他编辑器,可以在〜/ .hgrc文件的[ui]部分中添加editor条目,并在editor关键字后加上要使用的编辑器名称以及任何关联的命令行选项。 例如,在添加了一个在无窗口模式下使用emacs的条目作为默认编辑器之后,我的〜/ .hgrc文件类似于清单7所示。

清单7.用户的.hgrc文件中的其他自定义
[ui]
    username = William von Hagen <wvh@vonhagen.org>
    editor = emacs -nw

提示 :为了最大程度地利用Mercurial提供有关其活动的信息,可以将verbose = True条目添加到Mercurial配置文件的[ui]部分。

将更改推送到远程存储库

如果使用的是远程存储库的克隆,则在将更改提交到本地存储库后,想要将这些更改推回该存储库。 为此,请使用Mercurial的hg push命令,如清单8所示。

清单8.通过SSH推送更改
$ hg push
    wvh@codeserver's password: 
    pushing to ssh://codeserver//home/wvh/src/pop3check
    searching for changes
    1 changesets found
    remote: adding changesets
    remote: adding manifests
    remote: adding file changes
    remote: added 1 changesets with 2 changes to 2 files

从远程存储库中提取更改

如果您使用的是远程存储库的克隆,而其他用户也使用同一存储库,则要检索他们所做的更改并将其推送到该存储库。 为此,请使用Mercurial的hg pull命令,如清单9所示。

清单9.通过SSH提取更改
$ hg pull
    wvh@codeserver's password: 
    pulling from ssh://codeserver//home/wvh/src/pop3check
    searching for changes
    adding changesets
    adding manifests
    adding file changes
    added 1 changesets with 0 changes to 0 files
    (run 'hg update' to get a working copy)
    remote: 1 changesets found

如该命令的输出所示,该命令仅检索有关远程更改的信息-您必须运行hg update命令以显示本地存储库中的关联更改。 该命令标识了存储库的更新方式,如清单10所示。

清单10.更新存储库以显示更改
$ hg update
    0 files updated, 0 files merged, 1 files removed, 0 files unresolved

撤消Mercurial的更改

Mercurial提供了以下内置命令,这些命令使撤消已提交的更改变得容易:

  • hg backout CHANGESET :撤消特定的变更集并创建一个撤消该变更集的变更集。 除非在执行此命令时指定--merge选项,否则必须将该--merge并到当前修订中,以将其推回远程存储库。
  • hg revert :通过指定文件名来返回一个或多个文件的先前版本,或者通过指定--all命令行选项来返回所有文件的先前版本。
  • hg rollback :撤消上一个Mercurial事务,通常是commit ,从远程存储库中pullpush入该存储库。 您只能撤消单个事务。

在尝试使用所有这些命令之前,请参见联机帮助!

摘要

Mercurial和其他分布式源代码管理系统是未来的潮流。 Mercurial是开源软件,Mercurial的预编译版本可用于Linux,UNIX,Microsoft Windows和MacOS®X系统。 本文重点介绍了如何使用Mercurial执行许多常见的VCS任务,并展示了开始使用Mercurial是多么容易。 为了更高级的目的,Mercurial提供了许多更高级的命令和配置选项,以帮助您管理源代码并自定义与Mercurial安装的交互。


翻译自: https://www.ibm.com/developerworks/aix/library/au-mercurial/index.html

 类似资料: