Delivering solid user friendly software solutions since the dawn of time.

Practical Mercurial - Notes

Categories: Mercurial

Practical Mercurial by Rob Conery

Mastering mercurial

  • Only merge when you are ready.
  • Git's hostile and unfriendly! GUI Wanker vs l33t snob!
  • Team Foundation Server enforces workflow and needs licenses
  • Subversion needs centralized administrator.


  • Github made git popular
  • Git more powerful but more complex to use
  • You need to tell git to remember an added file
  • More opiniated
  • Allows to alter history more
  • Pluralsight - Git Fundamentals by James Kovacs
  • Git in your browser: http://try.github.com
  • Pro Git Book by Scott Chacon: http://www.git-scm.com/book


  • Http-friendly
  • Visual tools
  • CodePlex
  • Google Code
  • Bitbucket.org
  • Hg is build on top python
  • TortoiseHg
  • VisualHg or Mercurial SCC

Create repository
Settings: merge tool, username (name <email>)
.hgignore (https://gist.github.com/314082)

Connect to remote repo
Sync - Configure - Add (alias)

Webserver select ssl required.

Commit - Open a new named branch
Commit all changes in branch
Select branch you want to merge into (eg. default)
Make sure the current working directory is set to branch you want to merge into
Merge with


syntax: glob

  • Settings - Changelog - Author Coloring
  • Settings - Sync - After pull do update

hgrc are the local repository settings that override your global settings
username = Ken <mail@ken.be>

authorcolor = True
postpull = update

The working directory

  • Use Update to switch between revisions

Fixing mistakes

  • You added a password or connectionstring to the repository
  • Undo last commit
  • There are extensions that allow you to change the history
  • Use revert when not commited

Sharing with google code
Add remote as alias
Allows to add comments inline on the web
Side by side clone (vs github fork)
Naming: author-feature
Push changes to clone
Maintainer needs to pull clone and merge into main repository
All alias for repositories you want to pull from (make sure no update is done in those cases)

Merge conflicts

  • When you edit the conflict in winmerge the tortoisehg will think the merge is done.
  • If not you should click undo after returning from winmerge.
  • Then commit
  • All much faster then reintegrating a branch with subversion.

Working on a team

  • Setup smtp
  • Email patch (or export patch)
  • The patch is not mercurial dependend (hg import)
  • Hg Server (start webserver on port 8000)

Setup on your own iis

  • Download mercurial source + binaries
  • Download python (correct release for mercurial)
  • Install tortoisehg on server (optional)
  • Create directory for mercurial
  • Extract library.zip from source into this folder
  • Copy templates directory into this folder
  • copy hgweb.cgi & hgwebdir.cgi from binaries into this folder
  • Add correct read and execute for these files
  • Create sub directory repositories
  • Add write permissions to repositories directory for the user
  • Add hgweb.config: [paths] projects = \bla\bla\mercurial\repositories\**
  • IIS - Add website
  • Add handler mapping
  • CGI-exe *.exe
  • ISAPI-dll *.dll
  • *.cgi (normally *.py) to python.exe -u %s %s
  • Restrictions - Access - Execute
  • Edit Feature Permissions - Check Execute
  • Default document - hgwebdir.cgi
  • Basic Authentication Enable (disable anonymous)


hg status
hg commit -m "Added another comment"
hg branch
hg branch "Issue13"
hg status
hg commit -m "Fixed 13"
hg update default
hg merge Issue13
hg commit -m "Merged 13"
hgtk log
hg revert --all
hg rollback

Use hg & hgtk as an external tool in visual studio this works easier then visualhg

Check-in notifications

  • Mostly done on the central repository
  • Edit hgrc file
  • Set smtp settings


changegroup.notify = python:hgext.notify.hook

baseurl = http://repo.foo.bar

sources = push
test = False
template = Subject: [webroot|basename]: {desc|strip|firstline}\ndetails: {baseurl}...

config = /notify.config
rob@lala.com = *

* = rob@lala.com


  • will graft the branch onto another, so it is no longer existing.

Add extensions to hgrc

hg help rebase
hg update home_page (goto branch you want to attach)
hg branch (will show the branch you are in)
hg rebase -d default