Differences between revisions 16 and 17
Revision 16 as of 2007-04-25 16:30:31
Size: 3392
Comment: minor syntax nit
Revision 17 as of 2007-07-11 01:08:12
Size: 3432
Editor: ip24-253-80-186
Comment:
Deletions are marked like this. Additions are marked like this.
Line 42: Line 42:
chgrp project-x .hg .hg/*
chmod g+w .hg .hg/*
chmod g+s .hg .hg/data
chgrp project-x .hg .hg/* .hg/store/*
chmod g+w .hg .hg/* .hg/store/*
chmod g+s .hg .hg/store .hg/store/data

How To Handle Multiple Committers

The traditional CVS-like model allows multiple different users to commit to the main repository. Indeed, it's about the only way to do things.

But in Mercurial, in some sense there is no 'main' repository. Users each have their own private repository to commit to and they can pull commits in from other users. This is rather drastically different than the CVS model and it has a number of advantages:

  • it's easier to review the work that's being pulled in before merging
  • it's easier to time or reorder merges for testing or deployment
  • no concept of permissions is needed
  • everything is atomic, no need to wait for locks

It is, of course, also possible to push as well as pull, though this is generally used to publish changes in a public place.

However, it is possible (though not recommended) to set up Mercurial to allow multiple users to push to a single repository. This allows Mercurial to be used in a more CVS-like fashion. Below are a couple possible approaches.

1. The SSH method

The typical way to do create a SSH reachable repository is to create a special account for that project, create the project under that account, then provide each user with an SSH key that's authorized to use that account. See ["SharedSSH"] for general setup details.

2. The HTTPS method

The repository will be shared via a webserver cgi-script, which also allows pushing. The security is webserver security. See HgWebDirStepByStep for general setup details.

3. The filesystem method

The idea here is to create a repository that has a group ID that allows multiple users to access it.

The following steps apply to *nix operating systems.

The first step is to add a new group to /etc/group. The 'kosher' method for accomplishing this varies from system to system, but the end result is a new line in /etc/group like the following:

project-x:x:100001:alice,bob,charlie

Then, we create a repository that's writable by that group:

mkdir /home/mercurial/project-x
cd /home/mercurial/project-x
hg init
chgrp project-x .hg .hg/* .hg/store/*
chmod g+w .hg .hg/* .hg/store/*
chmod g+s .hg .hg/store .hg/store/data

The chgrp command marks the project as belonging to the project-x group. The first chmod command marks the repository data writable by that group. And finally, the second chmod command sets the 'setgid' bit on the project directories, which causes new files created in those directories to be marked as belonging to that group (rather than the user's default group).

Next, it's important that each user's umask be set to 002 or something similar. If it's set to 022, group write privileges will be masked off for files that users create, causing other users to be unable to modify them.

Now you're ready to go:

hg clone /home/mercurial/project-x
cd project-x
[make changes]
hg commit
hg push /home/mercurial/project-x

4. Keeping in sync

You may sometimes get a warning like this when you push:

abort: unsynced remote changes!

This means you should pull the latest changes from project-x before pushing.

You may also get a warning like this:

abort: push creates new remote branches!

This means you've probably forgotten to merge changes you've pulled with the changes you're trying to push.

As always, SyncEarlySyncOften.

MultipleCommitters (last edited 2015-04-29 15:01:20 by mpm)