识别并跟踪多个开发人员所做的更改,并将其合并到一个最新的代码库中,便可以进行协作的多开发人员项目。 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之间的一些区别如下:
revert
, backout
和rollback
命令使您可以轻松地返回到特定文件的先前版本或先前提交的更改集。 Git提供了一个内置的revert
命令,它具有典型的仅限火箭科学家的语法。 copy
和move
命令均保留完整的历史记录信息,而Git在任何情况下均不保留历史记录。 Mercurial和Git爱好者也很高兴讨论每个VCS系统命令集的学习曲线,优点和可用性。 空格阻止了此处的讨论,但是围绕该主题的网络搜索将提供许多有趣的阅读材料。
Mercurial提供了两种为项目的源代码创建本地存储库的基本方法:通过显式创建存储库或克隆现有的远程存储库:
hg init [REPO-NAME]
命令。 执行此命令时提供存储库名称,将在指定位置为该存储库创建目录。 不提供存储库的名称会将当前工作目录转换为存储库。 当为现有代码库创建Mercurial存储库时,后者非常方便。 要克隆现有存储库 ,请使用hg clone REPO-NAME [LOCALNAME]
命令。 Mercurial支持用于访问远程存储库的超文本传输协议(HTTP)和安全外壳(SSH)协议。 清单1显示了一个示例hg
命令以及通过SSH克隆存储库时产生的结果输出。
$ 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的主要命令是hg
,它支持一组子命令,这些子命令与其他VCS系统中的子命令相似。 要查看最常用命令的列表,请执行不带参数的hg
命令,该命令显示的输出类似于清单2所示。
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所示的输出。
$ hg status
M Makefile
? hgrc.example
在这种情况下,Makefile文件是已被修改的现有文件(由该行开头的字母M
表示),而hgrc.example文件是一个未被跟踪的新文件(由问题表示)在行的开头标记?
)。
要将hgrc.example文件添加到此存储库中正在跟踪的文件列表中,请使用hg add
命令。 将一个或多个文件名指定为参数会将这些文件显式添加到Mercurial跟踪的文件列表中。 如果您未指定任何文件,那么所有新文件都将添加到存储库中,如清单4所示。
$ hg add
adding hgrc.example
提示 :要自动添加所有新文件并标记所有已删除的文件以进行永久删除,可以使用Mercurial的便捷hg addremove
命令。
检查存储库的状态表明已添加了新文件(在行首以字母A
表示),如清单5所示。
$ hg status
M Makefile
A hgrc.example
签入更改是任何VCS系统中最常见的操作。 进行并测试更改后,您就可以将这些更改提交到本地存储库了。
如果这是您的第一个Mercurial项目,则必须提供一些基本信息,以便Mercurial可以识别提交那些更改的用户。 如果不这样做,则会在abort: no username supplied...
的行中看到一条消息abort: no username supplied...
当您尝试提交更改时,您的更改将不会提交。
要添加用户信息,请在主目录中创建一个名为.hgrc的文件。 该文件是您的个人Mercurial配置文件。 您至少需要将清单6中所示的基本用户信息添加到此文件中。
[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所示。
[ui]
username = William von Hagen <wvh@vonhagen.org>
editor = emacs -nw
提示 :为了最大程度地利用Mercurial提供有关其活动的信息,可以将verbose = True
条目添加到Mercurial配置文件的[ui]
部分。
如果使用的是远程存储库的克隆,则在将更改提交到本地存储库后,想要将这些更改推回该存储库。 为此,请使用Mercurial的hg push
命令,如清单8所示。
$ 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所示。
$ 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所示。
$ hg update
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
Mercurial提供了以下内置命令,这些命令使撤消已提交的更改变得容易:
hg backout CHANGESET
:撤消特定的变更集并创建一个撤消该变更集的变更集。 除非在执行此命令时指定--merge
选项,否则必须将该--merge
并到当前修订中,以将其推回远程存储库。 hg revert
:通过指定文件名来返回一个或多个文件的先前版本,或者通过指定--all
命令行选项来返回所有文件的先前版本。 hg rollback
:撤消上一个Mercurial事务,通常是commit
,从远程存储库中pull
或push
入该存储库。 您只能撤消单个事务。 在尝试使用所有这些命令之前,请参见联机帮助!
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