12—解决repository is unrelated的问题

最后更新于:2022-04-01 06:45:16

## 情景再现 我在服务器上init一个项目ProjectA,无内容。  我在PC1上clone此项目,加入源代码文件commit后,push出错。  我想在PC2上调式错误,就又clone了此项目,而后新增一个文件。  一会儿push问题解决了,我也将PC2上的文件push到服务器上。 接下来,我在PC1上pull代码,出现如下提示: ~~~ $ hg pull pulling from http://localhost/repos/ProjectA/ searching for changes abort: repository is unrelated ~~~ ## 解决方案 这也许是changeset:0冲突造成的,目前我的解决方法是在PC1上重新clone此项目,然后再新增代码,再次push。  虽然粗鲁,但能够解决问题。 大家有好方案,请赐教。
';

11—自搭Server后push遇到的问题

最后更新于:2022-04-01 06:45:14

时隔半年后接着[突击Mercurial SCM(HG)5—Ubuntu下apache+mod_wsgi搭建hg server](http://blog.csdn.net/lincyang/article/details/42779523) 讲述提交代码时遇到的问题。 1.ssl问题 ~~~ $ hg push pushing to http://localhost/repos/welcomePlayer searching for changes abort: HTTP Error 403: ssl required ~~~ 因为我们没有启用SSL,如果只是在局域网中架设服务器,那么可以先禁用ssl即可。在hgweb.config配置如下: ~~~ $ sudo vim /var/www/vhosts/xxx/cgi-bin/hgweb.config ~~~ ~~~ [web] style = coal push_ssl = false ~~~ 2.authorization failed  再次push发生如下错误: ~~~ $ hg push pushing to http://localhost/repos/welcomePlayer searching for changes abort: authorization failed ~~~ 原因是我们没有进行身份认证,一个最简单的办法时允许任何人提交代码,在hgweb.config中添加如下配置: ~~~ [web] style = coal push_ssl = false allow_push = * ~~~ 要进行明确的用户认证管理,请参  考[突击Mercurial SCM(HG)8—hg server 用户认证](http://blog.csdn.net/lincyang/article/details/43835073)
';

10—配置管理一个新项目

最后更新于:2022-04-01 06:45:11

新起一个项目,要从服务端做起。我是用docker搭建的hg server,我的repos目录在~/hg-repos/repos下,那么我可以去此目录init一个项目,然后其他端就可以clone下来。问题是我在此目录做 hg init 操作需要root权限,如下: ~~~ $ sudo hg init linctest $ ll drwxr-xr-x 3 root root 4096 3月 26 17:59 linctest/ ~~~ 那么在push代码时就会发生如下错误: ~~~ $ hg push pushing to http://linc-ubuntu/linctest searching for changes http authorization required for http://linc-ubuntu/linctest realm: Repositories user: linc password: abort: HTTP Error 500: Permission denied ~~~ 原来阿,还是目录权限的问题,或者说是目录的所有者问题。  看看其他项目就知道了。 ~~~ $ ll drwxrwxr-x 3 www-data www-data 4096 1月 30 14:18 xxxxx ~~~ 此时,只需做一下改变就可以了。 ~~~ $ sudo chown www-data:www-data -R linctest ~~~
';

9—hgignore

最后更新于:2022-04-01 06:45:09

项目中有些文件是不想或不应该被托管的,比如Android项目中bin下和gen的文件。 .hgignore文件就是为此而生,如果你的项目路径下无此文件,说明此时还没有人来创建它,那就由你去手动添加吧。 语法 .hgignore的内容不是随便写的,它遵循一定的语法格式。目前有两种语法格式: regexp     Regular expression, Python/Perl syntax. 正则表达式,python/perl语法 glob     Shell-style glob.  shell风格的通配符,这个可读性略差一些。 下面就bin和gen目录下文件忽略问题做个例子。 ~~~ $ hg status   ? gen/com/xxxx/BuildConfig.java   ? gen/com/xxxx/R.java   ? bin/AndroidManifest.xml   ~~~ 在hgignore文件中添加如下内容: ~~~ syntax: regexp   bin/   gen/   ~~~ 此时再运行hg status,这些未纳入管理的文件就不见了。 另外,可以两种语法一起工作,如下: ~~~ syntax: regexp   app/build/   build/   .gradle/   .idea/   .gitignore   syntax: glob   bin/**   ~~~ 参考: http://mercurial.selenic.com/wiki/.hgignore www.selenic.com/mercurial/hgignore.5.html http://blog.yangyubo.com/2010/09/06/mercurial-hgignore/ http://blog.csdn.net/cashey1991/article/details/6886782
';

8—hg server 用户认证

最后更新于:2022-04-01 06:45:07

结合对docker搭建的hg server进行验证,用户认证其实很简单。请先参考《[Docker实践2:用Docker搭建hg-server](http://blog.csdn.net/lincyang/article/details/43450999) 》对docker搭建的hg server有个了解。对于我们自己用apache+hgweb搭建的server也适用,不过我没有亲自验证。 将容器上的/var/hg 挂到主机上的/hg-repos,里面的两个配置文件hgusers和 hgweb.config可以在主机上修改,启动的命令如下: ` sudo docker run -idt -p 80:80 -v /home/linc/hg-repos:/var/hg amclain/hgweb  ` 首先,用htpasswd工具生成用户名和密码 htpasswd是apache的工具,它用改进的MD5对密码加密,安全性很高。 下面给新建用户linc和密码,命令如下: ` $ htpasswd -c /home/linc/hg-repos/hgusers linc  ` 密码设置完成后,看一下hguser文件: ~~~ $ cat hgusers    linc:$apr1$Wmne6Qrr$dylwU3XJYTvdG/yFyVrXw0   ~~~ 第二步,开放push权限 在hgweb.config中[web]下添加用户: ~~~ [web]   # Add users who have repo push access here.   allow_push = linc   ~~~ 这样,用户验证就配置好了。只不过需要每添加一个用户,都要管理员来完成。少了一些人性化。
';

7—not trusting file /opt/tortoisehg/.hg/hgrc

最后更新于:2022-04-01 06:45:04

 有时候我们不同的项目需要用不同的身份获取和提交代码。为了应对这个需要,我们可以在每个项目的.hg目录下创建一个hgrc文件去配置不同的用户名,比如: ~~~ [ui]   username = linc   ~~~ 但刚刚遇到一个问题,在项目路径启动thg,报一个错误: ~~~ $ thg   $ not trusting file /opt/tortoisehg/.hg/hgrc from untrusted user root, group root   ~~~ 这个问题有趣之处在于,我修改的是项目路径下刚刚新建的hgrc,而报错中提到的是thg源码中的hgrc。而此时我们对hgrc修改权限是不起作用的,因为是不信任的用户和组。 不要紧,既然是不信任的,那我们将其纳入信任的范畴就可以啦。 在mercurial的配置中新加一个文件trust.rc,将root加入到信任范畴: ` $ sudo vim /etc/mercurial/hgrc.d/trust.rc  ` 加入如下: ~~~ [trusted]   users = root   groups = root   ~~~ 此时再运行thg,ok,新修改的user出现了。
';

6—图形化工具TortoiseHg

最后更新于:2022-04-01 06:45:02

不得不说,在看提交记录时还是看图形化界面来的方便。用git有gitk,那么hg有什么呢?那就是今天的主题thg。 Tortoise系列在源代码管理圈子中小有名气,[TortoiseHg](http://blog.csdn.net/lincyang/article/details/tortoisehg.bitbucket.org)也是一样,开源,易用。 安装在Windows下自不必说,在Ubuntu上有时还是让人困惑的。 官方不推荐直接apt-get install,因为Ubuntu自带的软件源版本会很低,推荐两种方式安装: #### 一、ppa PPA,表示Personal Package Archives,也就是个人软件包集。有些软件进不去Ubuntu官方软件源,就只有用ppa了。下面是其安装命令: ~~~ sudo add-apt-repository ppa:tortoisehg-ppa/releases      sudo apt-get update      sudo apt-get install tortoisehg   ~~~ 很遗憾,即使用ppa安装也不是最新的版本,由于我使用的是最新的Mercurial 3.3rc,造成thg不支持,使用不了。那么只有用第二种办法,源码安装了。 #### 二、from source code 先把刚刚安装的thg卸载了吧。 #### 1. sudo apt-get remove tortoisehg   编译过程中需要使用一个工具: ~~~ sudo apt-get install pyqt4-dev-tools   ~~~ 下载最新thg: ~~~ sudo hg clone https://bitbucket.org/tortoisehg/thg tortoisehg   ~~~ 下载时间根据个人网速而不同,完成后进入其目录,准备编译。 (官方文档中说是不用编译的,但是不知为何不能用,所以我还是编译了一下) ~~~ $ sudo python setup.py build   $ sudo python setup.py install   ~~~ 使用thg就可以调出图形界面了。 接着做一个链接方便使用: ` ln -s /opt/tortoisehg/thg ~/bin/  ` 我用thg只是用来辅助工作,大部分时间的操作还是喜欢用命令行。每当查看版本历史时都要将其调出,一切变化都一目了然,十分舒适。 参考: http://www.cnblogs.com/huangdingding/archive/2012/09/26/2703664.html http://www.cnblogs.com/khler/archive/2010/08/27/1810365.html https://bitbucket.org/tortoisehg/thg/wiki/thg
';

5—Ubuntu下apache+mod_wsgi搭建hg server

最后更新于:2022-04-01 06:45:00

在《[Publishing Mercurial Repositories](http://mercurial.selenic.com/wiki/PublishingRepositories)》这篇文章中介绍了很多种将我们自己的hg代码库发布/公开的办法。其中最轻量型的办法是使用hg自带的web server发布,只需要在代码库目录下执行命令hg serve就搞定。但是这只是一个临时的方案,如果想要更健壮更安全,官网还是建议使用hgweb脚本+Web server(apache,IIS等)的方式。 查看资料后,我权衡利弊,准备以《[Serving Mercurial repositories with Apache and mod_wsgi](http://mercurial.selenic.com/wiki/modwsgi)》为蓝本再结合其他教程和实践,来搭建自己的hg server供局域网中的小伙伴使用。 #### 1.工具 mod_wsgi:apache和python沟通的桥梁。 apache2:这个家伙仍然在web server领域引领风骚。 python:2.7版本足以。 mercurial:这是我们的主角。 hgweb.wsgi:mercurial给我们提供的。 linc注:我是这WEB方面的门外汉,对cgi和wsgi等概念是一无所知,之前搭建Scrum环境是在Windows下使用傻瓜似工具,根本没机会配置apache。因此,接下来的工作令我苦不堪言。有不足之处也在所难免。更请高手指正。 #### 2.安装 我在Ubuntu下使用apt-get install安装这些工具,十分顺利,闲言少叙。 *sudo apt-get install apache2* 完成后即使不做任何配置,在浏览器中输入localhost,也会出现“It works!”。那么apache就算安装成功。 *sudo apt-get install libapache2-mod-wsgi* 安装后在/usr/lib/apache2/modules/目录下会发现多了mod_wsgi.so ~~~ lrwxrwxrwx 1 root root     15 Nov 19 00:50 mod_wsgi.so -> mod_wsgi.so-2.7   -rw-r--r-- 1 root root 152064 Nov 19 00:50 mod_wsgi.so-2.7   ~~~ #### 3.关于apache目录这件小事 1)/var/www 这个目录是用来放置我们的网站的入口,默认这里会有个index.html,刚才我们打开localhost出现的界面就是这个index.html了。后续我们会在这个目录下做文章。 2)/etc/apache2 我们要在这里做apache的配置,重点文件有apache2.conf,httpd.conf,以及sites-available下的default。 #### 4.配置 按照教程的例子,我也以虚拟主机 “hg.example.net"来完成整个配置。 **第一步,加载mod_wsgi** 我们的配置(user configurations)在/etc/apache2/httpd.conf中进行, 加载mod_wsgi只需添加LoadModule wsgi_module modules/mod_wsgi.so 即可。 linc注:后来我又将此句注释掉,发现依然运行正常。 **第二步,配置apache** 依例子的要求,我们要做以下工作。 1)在www下创建新文件夹 /var/www/vhosts/hg.example.net/cgi-bin /var/www/vhosts/hg.example.net/htdocs 2)修改/etc/apache2/sites-avaiable/default 变成如下: ~~~        ServerName hg.example.net       DocumentRoot /var/www/vhosts/hg.example.net/htdocs          WSGIScriptAliasMatch ^(.*)$ /var/www/vhosts/hg.example.net/cgi-bin/hgweb.wsgi$1                     Options FollowSymlinks           DirectoryIndex index.html           AllowOverride None           Order allow,deny           Allow from all                            Options ExecCGI FollowSymlinks              AddHandler wsgi-script .wsgi           AllowOverride None           Order allow,deny           Allow from all             ~~~ **第三步,配置Mercurial** 1)将hgweb.wsgi文件复制到/var/www/vhosts/hg.example.net/cgi-bin/ sudo cp /usr/share/doc/mercurial-common/examples/hgweb.wsgi /var/www/vhosts/hg.example.net/cgi-bin/ 修改成如下: ~~~ # Path to repo or hgweb config to serve (see 'hg help hgweb')   config = "/var/www/vhosts/hg.example.net/cgi-bin/hgweb.config"      # enable demandloading to reduce startup time   from mercurial import demandimport; demandimport.enable()      from mercurial.hgweb import hgweb   application = hgweb(config)   ~~~ 2)hgweb.config 在/var/www/vhosts/hg.example.net/cgi-bin/新加文件hgweb.config 内如如下: ~~~ [web]   style = coal      [paths]   / = /var/www/vhosts/hg.example.net/htdocs/**   ~~~ 重启apache: *sodu /etc/init.d/apache2 restart* 到此,《Serving Mercurial repositories with Apache and mod_wsgi》便结束了。 **第四步,创建hg代码仓库** 将代码放在哪里?一直没有好主意,看到有人将其放在/var下了,姑且我也这样吧。 新建目录/var/hg/repos/test, *mkdir /var/hg/repos/test; cd /var/hg/repos/test; hg init* 一个临时的代码仓库就创建完了,下面如何跟server联系在一起呢? 回过头来,我们还要修改一下hgweb.config,加入下面两句: ~~~ [collections]   /var/hg = /var/hg   ~~~ 重启apache后,在浏览器中输入:localhost/repos/test 你的代码库就出现了呢。这样就说明我们的工作完成了。你可能要问,直接在浏览器中输入hg.example.net不也可以吗?是这样的,但是我们还要做一项工作,在/etc/hosts文件中加入127.0.0.1   hg.example.net 才行. 好吧,先庆祝一下,下文再说代码提交遇到的问题以及身份认证问题。 参考: http://mercurial.selenic.com/wiki/PublishingRepositories http://mercurial.selenic.com/wiki/modwsgi http://stackoverflow.com/questions/12347373/how-to-setup-mercurial-server-in-ubuntu-to-serve-60-repositories http://thepanz.netsons.org/post/ubuntu-10-4-and-mercurial-server-apache2-mod_wsgi/comment-page-1 http://blog.sina.com.cn/s/blog_4567bb800100whho.html http://blog.csdn.net/tony1130/article/details/5326015 http://blog.csdn.net/kongdaoxian/article/details/7944872
';

4—Merge

最后更新于:2022-04-01 06:44:58

**Scenario:** 当自己修改完代码,准备commit之前做了一次pull+update,做了些解决冲突工作,然后验证代码是否正常工作。 确认一切正常后,执行hg commit,然后执行hg push。但是网络出现问题,push失败。等到网络恢复正常后,发现自己的版本已经不是最新版了, push继续失败。提示: abort: push creates new remote head 8f1da767f592! hint: you should pull and merge or use push -f to force **Merge:** 按照提示所述,我们需要更新代码并做一次merge操作才可以正常提交自己的代码。 执行hg pull后,hg很人性的提示我们: (run 'hg heads' to see heads, 'hg merge' to merge) 当我直接执行hg merge时,hg再次提示我: abort: outstanding uncommitted changes (use 'hg status' to list changes) 看来哪里还是有问题,好吧,先来看看merge的帮助吧。 ~~~ $ hg merge --help   hg merge [-P] [-f] [[-r] REV]      merge working directory with another revision          The current working directory is updated with all changes made in the        requested revision since the last common predecessor revision.          Files that changed between either parent are marked as changed for the        next commit and a commit must be performed before any further updates to       the repository are allowed. The next commit will have two parents.          "--tool" can be used to specify the merge tool used for file merges. It       overrides the HGMERGE environment variable and your configuration files.       See "hg help merge-tools" for options.          If no revision is specified, the working directory's parent is a head       revision, and the current branch contains exactly one other head, the        other head is merged with by default. Otherwise, an explicit revision with       which to merge with must be provided.          "hg resolve" must be used to resolve unresolved files.          To undo an uncommitted merge, use "hg update --clean ." which will check       out a clean copy of the original merge parent, losing all changes.          Returns 0 on success, 1 if there are unresolved files.      options:       -f --force      force a merge with outstanding changes    -r --rev REV    revision to merge    -P --preview    review revisions to merge (no merge is performed)    -t --tool VALUE specify merge tool      use "hg -v help merge" to show more info   ~~~ 尝试一下hg update --clean,看起来不错。 ~~~ $ hg update --clean   8 files updated, 0 files merged, 1 files removed, 0 files unresolved   ~~~ 再次执行merge。 ~~~ $ hg merge   2 files updated, 0 files merged, 0 files removed, 0 files unresolved   (branch merge, don't forget to commit)   ~~~ 看起来成功了,按照提示,再commit一下。此时我们的提交信息只要告知一下这是一次merge操作即可。 然后push,成功。结果是原来的commit还是那时的changeset,最新的commit就是你刚刚提交的,信息为merge的那一条。 至此merge成功!
';

3—撤销操作

最后更新于:2022-04-01 06:44:55

#### 1.撤销add 有时候我们用hg add 没加参数,直接把所以没有纳入版本库的文件都添加进来了。 而有些文件我们不是想添加的,怎么办? 因为我们是add进来,第一个想到的命令是remove。 我们执行一下,hg会给我们如下提示: file has been marked for add (use forget to undo) 对,它推荐使用forget命令。这时forget命令就派上用场了。 ` hg forget xxx.java  ` 唯一的遗憾就是没有--all参数,我们只好一个一个把要撤销的文件加进来。 如果是同一个目录下的要forget,可以用通配符*来做。比如:hg forget app/build/* 对比git,可以使用rm --cached命令来撤销刚add的文件,如 ` $ git rm --cached tags  ` #### 2.撤销commit 当一次提交后,发现还有修改要做,比如我写的comment没有符合统一格式,那么我想修改它怎么办? (如果是comment修改,在git中用git commit --amend 就可以了。) 开始我觉得应该有一个commit参数专门做修改,感觉git好像有。但没有找到,所以只好想其他办法。 revert命令不太适合此种情况,rollback还可以。直白的说,它会把时间带到刚刚最新的那一版。     - commit     - import     - pull     - push (with this repository as the destination)     - unbundle 上述几个命令是可以执行rollback来回滚的。 我直接用rollback做了一次撤销commit的操作,然后进行一些修改,再次commit。 ~~~ hg rollback   hg commit -m "this time is all right."   ~~~
';

2—当前状态

最后更新于:2022-04-01 06:44:53

当我们clone下来代码后,默认会在某个default分支上。 ` hg clone your-src-url  ` 代码库克隆下来后,查看一下当前代码库的状态 ~~~ 14:30linc@Linc-Ubuntu:Demo$ hg summary   parent: 2014:xxxxxxxxxxxxxxx   This is a description.   branch: default   commit: 3 unknown (clean)   update: (current)   ~~~ 上述我们可以看到,最新的版本(changeset)是2014,当前的分支是default,已经update到最新。 或者我们也可以直接查看当前的branch: ~~~ 14:42linc@Linc-Ubuntu:Demo$ hg branch   default   ~~~ 还可以查看parent的详细信息: ~~~ 14:49linc@Linc-Ubuntu:Demo$ hg parents   changeset:   2014:xxxxxxxxxxxxxxx   user:        Linc Yang    date:        Mon Nov 14 15:59:36 2014 +0800   summary:     This is a description.   ~~~ 再看看库中有几个分支: ~~~ 14:42linc@Linc-Ubuntu:Demo$ hg branches   cool_version               2089:xxxxxxxxxx   default                    2014:xxxxxxxxxx   little_thing               1999:xxxxxxxxxx   ~~~ 还有另两个分支,并且我们当前的default也不是最新的。我们变换到cool_version上去看看。 ~~~ 14:58linc@Linc-Ubuntu:Demo$ hg update cool_version   38 files updated, 10 files merged, 7 files removed, 0 files unresolved   14:58linc@Linc-Ubuntu:Demo$ hg branch   cool_version   14:58linc@Linc-Ubuntu:Demo$ hg sum   parent: 2089:xxxxxxxxxx tip    This is my test version.   branch: cool_version   commit: 3 unknown (clean)   update: (current)   ~~~ **另外:** 1\. hg branch + “要创建的分支名”    创建新分支(这里必须进行一次hg commit操作才能真正创建分支) hg branch newbranch 2\. hg push --new-branch ————把在本地创建的branch 上传到远端 hg push --newbranch 3.hg update -r + ”版本号“ ———— 切到指定的版本
';

突击Mercurial SCM(HG)

最后更新于:2022-04-01 06:44:51

这个叫水银的源码管理工具虽然默默无闻,但还是得到了很多团队的使用。为了迎合某些团队的需要,我们也要用它来管理我们的代码。 今天的任务是先突击学习,磨刀不误砍柴工。对工具的掌握越快,工作的效率就会越高。 #### 1.安装 首先从[官网](http://mercurial.selenic.com/)下载最新的版本,我这次做个实验,下载了3.2-rc。 解压到你指定的目录下: ~~~ [linc@localhost mercurial]$ ls   mercurial-3.2-rc.tar.gz   [linc@localhost mercurial]$ tar xzvf mercurial-3.2-rc.tar.gz    ~~~ 安装之前要检查一下是否已经安装了python-dev,这在fedora下叫作python-devel, 如果没有,编译时会出现错误: ~~~ mercurial/base85.c:13:20: fatal error: Python.h: No such file or directory   ~~~ 只要看看/usr/include/python2.7/下有没有上述的头文件就知晓了。 安装也好办,ubuntu下使用: ` sudo apt-get install python-dev  ` fedora下使用: ` [linc@localhost etc]$ sudo yum install python-devel  ` 来到mercurial-3.2-rc路径下,执行: ~~~ [linc@localhost mercurial-3.2-rc]$ make install-home   python setup.py  build    running build   running build_mo   running build_ext   building 'mercurial.base85' extension   ...   ~~~ ~~~ make[1]: *** [hg.1] Error 255   make[1]: Leaving directory `/home/linc/dev/mercurial/mercurial-3.2-rc/doc'   make: *** [doc] Error 2   ~~~ 最后的错误是关于文档的,这里被我无视了,尝试执行hg,得到了反馈,说明基本功能是安装完成了。 ~~~ [linc@localhost mercurial-3.2-rc]$ hg   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         start stand-alone webserver    status        show changed files in the working directory    summary       summarize working directory state    update        update working directory (or switch revisions)      (use "hg help" for the full list of commands or "hg -v" for details)   ~~~ 2.简单的使用 下面就要试着创建一个项目并提交代码。 创建init目录: ~~~ [linc@localhost testHG]$ hg init testMercurial   [linc@localhost testHG]$ ls   testMercurial   [linc@localhost testHG]$ cd testMercurial/   ~~~ 添加我的小项目,将其他目录下的源码拷到这里: ~~~ [linc@localhost testMercurial]$ cp -r ../../hello/* .   [linc@localhost testMercurial]$ ls   Debug  Release  src   ~~~ 查看当前状态: ~~~ [linc@localhost testMercurial]$ hg status   ? Debug/makefile   ? Debug/objects.mk   ? Debug/sources.mk   ? Debug/src/subdir.mk   ? Release/makefile   ? Release/objects.mk   ? Release/sources.mk   ? Release/src/subdir.mk   ? src/hello.c   ~~~ 问号表示还没有纳入版本管理,下面就给它们添加进来: ~~~ [linc@localhost testMercurial]$ hg add   adding Debug/makefile   adding Debug/objects.mk   adding Debug/sources.mk   adding Debug/src/subdir.mk   adding Release/makefile   adding Release/objects.mk   adding Release/sources.mk   adding Release/src/subdir.mk   adding src/hello.c   [linc@localhost testMercurial]$ hg status   A Debug/makefile   A Debug/objects.mk   A Debug/sources.mk   A Debug/src/subdir.mk   A Release/makefile   A Release/objects.mk   A Release/sources.mk   A Release/src/subdir.mk   A src/hello.c   ~~~ A就是add的标识了。下面我们提交这些代码吧。 ~~~ [linc@localhost testMercurial]$ hg commit -m 'initial commit'   abort: no username supplied   (use "hg config --edit" to set your username)   [linc@localhost testMercurial]$ hg config --edit   ~~~ 可惜由于我没有编辑好我的名称在配置文件中,先去添加一下,然后继续提交代码: ~~~ [linc@localhost testMercurial]$ hg commit -m 'initial commit'   [linc@localhost testMercurial]$ hg status   [linc@localhost testMercurial]$ hg log   changeset:   0:23ac3f5bfc59   tag:         tip   user:        Lincoln    date:        Mon Oct 27 21:05:10 2014 +0800   summary:     initial commit   ~~~ 上面的changeset就是git中的commit id,冒号前面的0就是你的changeset id,越靠前表示它的资历越老。 tag中的tip,一般出现在最新的changeset中,这个小技巧你要记住了哦。 最后我们要将提交推到远程库中才算大功告成。与git类似,也是用push命令: ` hg push /the remote repository  ` 我想要看看这一版都修改了那些地方怎么查?记得git中用show命令,hg呢?export就好了: ~~~ [linc@localhost testMercurial]$ hg export 0:23ac3f5bfc59   # HG changeset patch   # User Lincoln    # Date 1414415110 -28800   #      Mon Oct 27 21:05:10 2014 +0800   # Node ID 23ac3f5bfc592c7bd2b293e8ace0f42b9e541ece   # Parent  0000000000000000000000000000000000000000   initial commit      diff -r 000000000000 -r 23ac3f5bfc59 Debug/makefile   --- /dev/null   Thu Jan 01 00:00:00 1970 +0000   +++ b/Debug/makefile    Mon Oct 27 21:05:10 2014 +0800   @@ -0,0 +1,44 @@   ~~~ 这基本的功能就是这样了,后面还会继续merge、conflict等功能。 后记: 2015.1.29 ubuntu上安装: 上述报错是因为doc安装需要python-docutils工具,我们需要安装它: /opt/mercurial-3.3-rc$ sudo apt-get install python-docutils 这次再编译就没有问题了: /opt/mercurial-3.3-rc$ sudo make install 参考: http://mercurial.selenic.com/guide
';

前言

最后更新于:2022-04-01 06:44:49

> 原文出处:[突击Mercurial SCM(HG)](http://blog.csdn.net/column/details/mercurial-learn.html) > 作者:[杨烈](http://blog.csdn.net/lincyang) **本系列文章经作者授权在看云整理发布,未经作者允许,请勿转载!** # 突击Mercurial SCM(HG) > HG的特点是易用功能强大,在众多源代码工具中渐渐崭露头脚。本专栏用于记录博主在团队开发中对HG的经验积累。
';