119
+ − 1
<?xml version="1.0" encoding="utf-8"?>
+ − 2
<article xmlns="http://docbook.org/ns/docbook" version="5.0" xml:lang="en">
+ − 3
<info>
+ − 4
<title>Sharing Mercurial repositories with mercurial-server</title>
+ − 5
<author><firstname>Paul</firstname><surname>Crowley</surname></author>
+ − 6
<copyright><year>2009</year><holder>Paul Crowley</holder></copyright>
+ − 7
</info>
+ − 8
<section>
+ − 9
<title>About mercurial-server</title>
+ − 10
<para>
+ − 11
mercurial-server is software for Debian and Ubuntu systems which gives your
+ − 12
developers remote read/write access to <ulink
+ − 13
url="http://hg-scm.org/">Mercurial</ulink> repositories using SSH public
+ − 14
key authentication; it provides convenient and fine-grained key management
+ − 15
and access control.
+ − 16
</para>
+ − 17
<para>
+ − 18
mercurial-server is the easiest and most secure way for several developers
+ − 19
to have read/write access to a central repository, but that's not the only
+ − 20
way for several people to work on the same project using Mercurial; you
+ − 21
should be familiar with the <ulink
+ − 22
url="http://mercurial.selenic.com/wiki/MultipleCommitters">other ways of
+ − 23
handling multiple commiters</ulink> before deciding to use this.
+ − 24
</para>
+ − 25
<para>
+ − 26
Though mercurial-server is currently targeted at Debian-based systems such
+ − 27
as Ubuntu, other users have reported success getting it running on other
+ − 28
Unix-based systems such as Red Hat. Running it on a non-Unix system such as
+ − 29
Windows is not supported. You will need root privileges to install it.
+ − 30
</para>
+ − 31
<section>
+ − 32
<title>Legalese</title>
+ − 33
<para>
+ − 34
This program is free software; you can redistribute it and/or modify it
+ − 35
under the terms of the GNU General Public License as published by the Free
+ − 36
Software Foundation; either version 2 of the License, or (at your option)
+ − 37
any later version.
+ − 38
</para>
+ − 39
<para>
+ − 40
This program is distributed in the hope that it will be useful, but
+ − 41
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
+ − 42
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ − 43
more details.
+ − 44
</para>
+ − 45
<para>
+ − 46
You should have received a copy of the GNU General Public License along
+ − 47
with this program; if not, write to the Free Software Foundation, Inc., 51
+ − 48
Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ − 49
</para>
+ − 50
</section>
+ − 51
</section>
+ − 52
<section>
+ − 53
<title>Step by step</title>
+ − 54
<para>
+ − 55
mercurial-server authenticates users not using passwords but using <ulink url="http://sial.org/howto/openssh/publickey-auth/">SSH public keys</ulink>; everyone who wants access to a mercurial-server repository will need such a key, so you'll need to familiarize yourself with them before proceeding. In combination with <command>ssh-agent</command> (or equivalents such as the Windows program <ulink url="http://the.earth.li/~sgtatham/putty/0.60/htmldoc/Chapter9.html#pageant">Pageant</ulink>), this means that users will not need to type in a password to access the repository.
+ − 56
</para>
+ − 57
<para>
+ − 58
In what follows, we assume that you usually sit at a machine called <systemitem class="systemname">my-workstation</systemitem> and you wish to install mercurial-server on <systemitem class="systemname">repository-host</systemitem>. First, you'll need to create an SSH public key if you haven't already. You should consult your system documentation on how to do this, but it should look something like this.
+ − 59
</para>
+ − 60
<screen>
+ − 61
<computeroutput>user@my-workstation:~$ </computeroutput><userinput>ssh-keygen</userinput>
+ − 62
<computeroutput>Generating public/private rsa key pair.
+ − 63
Enter passphrase (empty for no passphrase):
+ − 64
Enter same passphrase again:
+ − 65
Your identification has been saved in /home/user/.ssh/id_rsa.
+ − 66
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
+ − 67
The key fingerprint is:
+ − 68
8b:aa:0a:98:fe:e7:84:48:a3:fe:5f:31:4b:16:e6:0b user@my-workstation
+ − 69
user@my-workstation:~$ </computeroutput><userinput>ssh-add</userinput>
+ − 70
<computeroutput>Enter passphrase for /home/user/.ssh/id_rsa:
+ − 71
Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
+ − 72
user@my-workstation:~$ </computeroutput></screen>
+ − 73
<para>Now copy the files you're going to need over to your target system, and install mercurial-server</para>
+ − 74
<screen>
+ − 75
<computeroutput>user@my-workstation:~$ </computeroutput><userinput>ssh-copy-id repository-host</userinput>
+ − 76
<computeroutput>user@repository-host's password:
+ − 77
Now try logging into the machine, with "ssh 'repository-host'", and check in:
+ − 78
+ − 79
.ssh/authorized_keys
+ − 80
+ − 81
to make sure we haven't added extra keys that you weren't expecting.
+ − 82
user@my-workstation:~$ </computeroutput><userinput>scp mercurial-server_0.6.1_amd64.deb repository-host:</userinput>
+ − 83
<computeroutput>mercurial-server_0.6.1_amd64.deb 100%
+ − 84
user@my-workstation:~$ </computeroutput><userinput>ssh -A repository-host</userinput>
+ − 85
<computeroutput>user@repository-host:~$ </computeroutput><userinput>sudo dpkg -i ../mercurial-server_0.6.1_amd64.deb</userinput>
+ − 86
<computeroutput>[sudo] password for user:
+ − 87
Selecting previously deselected package mercurial-server.
+ − 88
(Reading database ... 144805 files and directories currently installed.)
+ − 89
Unpacking mercurial-server (from .../mercurial-server_0.6.1_amd64.deb) ...
+ − 90
Setting up mercurial-server (0.6.1) ...
+ − 91
user@repository-host:~$ </computeroutput></screen>
+ − 92
<para>
+ − 93
mercurial-server is now installed on the repository host. Next, we need to give you permission to see its repositories.
+ − 94
</para>
+ − 95
<screen>
+ − 96
<computeroutput>user@repository-host:~$ </computeroutput><userinput>ssh-add -L > my-key</userinput>
+ − 97
<computeroutput>user@repository-host:~$ </computeroutput><userinput>sudo mkdir -p /etc/mercurial-server/keys/root/user</userinput>
+ − 98
<computeroutput>user@repository-host:~$ </computeroutput><userinput>sudo cp my-key /etc/mercurial-server/keys/root/user/my-workstation</userinput>
+ − 99
<computeroutput>user@repository-host:~$ </computeroutput><userinput>sudo -u hg /usr/share/mercurial-server/refresh-auth</userinput>
+ − 100
<computeroutput>user@repository-host:~$ </computeroutput><userinput>exit</userinput>
+ − 101
<computeroutput>Connection to shell closed.
+ − 102
user@my-workstation:~$ </computeroutput></screen>
+ − 103
<para>
+ − 104
You can now create repositories on the remote machine and have complete read-write access to all of them; you need never log on to <systemitem class="systemname">repository-host</systemitem> again.
+ − 105
</para>
+ − 106
<screen>
+ − 107
<computeroutput>user@my-workstation:~$ </computeroutput><userinput>cd my-mercurial-project</userinput>
+ − 108
<computeroutput>user@my-workstation:~/my-mercurial-project$ </computeroutput><userinput>hg clone . ssh://hg@repository-host/repository/name</userinput>
+ − 109
<computeroutput>searching for changes
+ − 110
remote: adding changesets
+ − 111
remote: adding manifests
+ − 112
remote: adding file changes
+ − 113
remote: added 119 changesets with 284 changes to 61 files
+ − 114
user@my-workstation:~/my-mercurial-project$ </computeroutput><userinput>hg pull ssh://hg@repository-host/repository/name</userinput>
+ − 115
<computeroutput>pulling from ssh://hg@repository-host/repository/name
+ − 116
searching for changes
+ − 117
no changes found
+ − 118
user@my-workstation:~/my-mercurial-project$ </computeroutput></screen>
+ − 119
<para>
+ − 120
As things stand, no-one but you has any access to any repositories you create on this system. In order to give anyone else access, you'll need a copy of their SSH public key. Once you have that key, you could give them access by logging into <systemitem class="systemname">repository-host</systemitem>, putting their keys in the right place under <filename class='directory'>/etc/mercurial-server/keys</filename>, and re-running <userinput>sudo -u hg /usr/share/mercurial-server/refresh-auth</userinput>. However, there's a more convenient way.
+ − 121
</para>
+ − 122
<screen>
+ − 123
<computeroutput>user@my-workstation:~/my-mercurial-project$ </computeroutput><userinput>cd ..</userinput>
+ − 124
<computeroutput>user@my-workstation:~$ </computeroutput><userinput>hg clone ssh://hg@repository-host/hgadmin</userinput>
+ − 125
<computeroutput>destination directory: hgadmin
+ − 126
no changes found
+ − 127
updating working directory
+ − 128
0 files updated, 0 files merged, 0 files removed, 0 files unresolved
+ − 129
user@my-workstation:~$ </computeroutput><userinput>cd hgadmin</userinput>
+ − 130
<computeroutput>user@my-workstation:~/hgadmin$ </computeroutput><userinput>mkdir -p keys/users/other-user</userinput>
+ − 131
<computeroutput>user@my-workstation:~/hgadmin$ </computeroutput><userinput>cp ~/other-users-key.pub keys/users/other-user/their-workstation</userinput>
+ − 132
<computeroutput>user@my-workstation:~/hgadmin$ </computeroutput><userinput>hg add</userinput>
+ − 133
<computeroutput>adding keys/users/other-user/their-workstation
+ − 134
user@my-workstation:~/hgadmin$ </computeroutput><userinput>hg commit -m "Add other user"</userinput>
+ − 135
<computeroutput>user@my-workstation:~/hgadmin$ </computeroutput><userinput>hg push</userinput>
+ − 136
<computeroutput>pushing to ssh://hg@repository-host/hgadmin
+ − 137
searching for changes
+ − 138
remote: adding changesets
+ − 139
remote: adding manifests
+ − 140
remote: adding file changes
+ − 141
remote: added 1 changesets with 1 changes to 1 files
+ − 142
user@my-workstation:~/hgadmin$ </computeroutput></screen>
+ − 143
<para>
+ − 144
The new user can now read and write to your <literal>ssh://hg@repository-host/repository/name</literal> repository.
+ − 145
</para>
+ − 146
</section>
+ − 147
</article>
+ − 148