hgbook
diff en/collab.tex @ 178:1b55292716a4
correct single typo in chpt 5 text
author | Steve Guidon <steve.guidon@gmail.com> |
---|---|
date | Thu Mar 29 19:55:18 2007 +0100 (2007-03-29) |
parents | |
children | 5fc4a45c069f |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/en/collab.tex Thu Mar 29 19:55:18 2007 +0100 1.3 @@ -0,0 +1,236 @@ 1.4 +\chapter{Collaborating with other people} 1.5 +\label{cha:collab} 1.6 + 1.7 +As a completely decentralised tool, Mercurial doesn't impose any 1.8 +policy on how people ought to work with each other. However, if 1.9 +you're new to distributed revision control, it helps to have some 1.10 +tools and examples in mind when you're thinking about possible 1.11 +workflow models. 1.12 + 1.13 +\section{Collaboration models} 1.14 + 1.15 +With a suitably flexible tool, making decisions about workflow is much 1.16 +more of a social engineering challenge than a technical one. 1.17 +Mercurial imposes few limitations on how you can structure the flow of 1.18 +work in a project, so it's up to you and your group to set up and live 1.19 +with a model that matches your own particular needs. 1.20 + 1.21 +\subsection{Factors to keep in mind} 1.22 + 1.23 +The most important aspect of any model that you must keep in mind is 1.24 +how well it matches the needs and capabilities of the people who will 1.25 +be using it. This might seem self-evident; even so, you still can't 1.26 +afford to forget it for a moment. 1.27 + 1.28 +I once put together a workflow model that seemed to make perfect sense 1.29 +to me, but that caused a considerable amount of consternation and 1.30 +strife within my development team. In spite of my attempts to explain 1.31 +why we needed a complex set of branches, and how changes ought to flow 1.32 +between them, a few team members revolted. Even though they were 1.33 +smart people, they didn't want to pay attention to the constraints we 1.34 +were operating under, or face the consequences of those constraints in 1.35 +the details of the model that I was advocating. 1.36 + 1.37 +Don't sweep foreseeable social or technical problems under the rug. 1.38 +Whatever scheme you put into effect, you should plan for mistakes and 1.39 +problem scenarios. Consider adding automated machinery to prevent, or 1.40 +quickly recover from, trouble that you can anticipate. As an example, 1.41 +if you intend to have a branch with not-for-release changes in it, 1.42 +you'd do well to think early about the possibility that someone might 1.43 +accidentally merge those changes into a release branch. You could 1.44 +avoid this particular problem by writing a hook that prevents changes 1.45 +from being merged from an inappropriate branch. 1.46 + 1.47 +\subsection{Informal anarchy} 1.48 + 1.49 +I wouldn't suggest an ``anything goes'' approach as something 1.50 +sustainable, but it's a model that's easy to grasp, and it works 1.51 +perfectly well in a few unusual situations. 1.52 + 1.53 +As one example, many projects have a loose-knit group of collaborators 1.54 +who rarely physically meet each other. Some groups like to overcome 1.55 +the isolation of working at a distance by organising occasional 1.56 +``sprints''. In a sprint, a number of people get together in a single 1.57 +location (a company's conference room, a hotel meeting room, that kind 1.58 +of place) and spend several days more or less locked in there, hacking 1.59 +intensely on a handful of projects. 1.60 + 1.61 +A sprint is the perfect place to use the \hgcmd{serve} command, since 1.62 +\hgcmd{serve} does not requires any fancy server infrastructure. You 1.63 +can get started with \hgcmd{serve} in moments, by reading 1.64 +section~\ref{sec:collab:serve} below. Then simply tell the person 1.65 +next to you that you're running a server, send the URL to them in an 1.66 +instant message, and you immediately have a quick-turnaround way to 1.67 +work together. They can type your URL into their web browser and 1.68 +quickly review your changes; or they can pull a bugfix from you and 1.69 +verify it; or they can clone a branch containing a new feature and try 1.70 +it out. 1.71 + 1.72 +The charm, and the problem, with doing things in an ad hoc fashion 1.73 +like this is that only people who know about your changes, and where 1.74 +they are, can see them. Such an informal approach simply doesn't 1.75 +scale beyond a handful people, because each individual needs to know 1.76 +about $n$ different repositories to pull from. 1.77 + 1.78 +\subsection{A single central repository} 1.79 + 1.80 +For smaller projects, migrating from a centralised revision control 1.81 +tool, perhaps the easiest way to get started is to have changes flow 1.82 +through a single shared central repository. This is also the 1.83 +most common ``building block'' for more ambitious workflow schemes. 1.84 + 1.85 +Contributors start by cloning a copy of this repository. They can 1.86 +pull changes from it whenever they need to, and some (perhaps all) 1.87 +developers have permission to push a change back when they're ready 1.88 +for other people to see it. 1.89 + 1.90 +Under this model, it can still sometimes make sense for people to pull 1.91 +changes directly from each other, without going through the central 1.92 +repository. Consider a case in which I have a tentative bug fix, but 1.93 +I am worried that if I were to publish it to the central repository, 1.94 +it might subsequently break everyone else's trees as they pull it. To 1.95 +reduce the potential for damage, I can ask you to clone my repository 1.96 +into a temporary repository of your own and test it. This lets us put 1.97 +off publishing the potentially unsafe change until it has had a little 1.98 +testing. 1.99 + 1.100 +In this kind of scenario, people usually use the \command{ssh} 1.101 +protocol to securely push changes to the central repository, as 1.102 +documented in section~\ref{sec:collab:ssh}. It's also usual to 1.103 +publish a read-only copy of the repository over HTTP using CGI, as in 1.104 +section~\ref{sec:collab:cgi}. Publishing over HTTP satisfies the 1.105 +needs of people who don't have push access, and those who want to use 1.106 +web browsers to browse the repository's history. 1.107 + 1.108 +\subsection{The Linux kernel model} 1.109 + 1.110 +The development of the Linux kernel has a shallow hierarchical 1.111 +structure, surrounded by a cloud of apparent chaos. Because most 1.112 +Linux developers use \command{git}, a distributed revision control 1.113 +tool with capabilities similar to Mercurial, it's useful to describe 1.114 +the way work flows in that environment; if you like the ideas, the 1.115 +approach translates well across tools. 1.116 + 1.117 +At the center of the community sits Linus Torvalds, the creator of 1.118 +Linux. He publishes a single source repository that is considered the 1.119 +``authoritative'' current tree by the entire developer community. 1.120 +Anyone can clone Linus's tree, but he is very choosy about whose trees 1.121 +he pulls from. 1.122 + 1.123 +Linus has a number of ``trusted lieutenants''. As a general rule, he 1.124 +pulls whatever changes they publish, in most cases without even 1.125 +reviewing those changes. Some of those lieutenants are generally 1.126 +agreed to be ``maintainers'', responsible for specific subsystems 1.127 +within the kernel. If a random kernel hacker wants to make a change 1.128 +to a subsystem that they want to end up in Linus's tree, they must 1.129 +find out who the subsystem's maintainer is, and ask that maintainer to 1.130 +take their change. If the maintainer reviews their changes and agrees 1.131 +to take them, they'll pass them along to Linus in due course. 1.132 + 1.133 +Individual lieutenants have their own approaches to reviewing, 1.134 +accepting, and publishing changes; and for deciding when to feed them 1.135 +to Linus. In addition, there are several well known branches that 1.136 +people use for different purposes. For example, a few people maintain 1.137 +``stable'' repositories of older versions of the kernel, to which they 1.138 +apply critical fixes as needed. 1.139 + 1.140 +This model has two notable features. The first is that it's ``pull 1.141 +only''. You have to ask, convince, or beg another developer to take a 1.142 +change from you, because there are no shared trees, and there's no way 1.143 +to push changes into a tree that someone else controls. 1.144 + 1.145 +The second is that it's based on reputation and acclaim. If you're an 1.146 +unknown, Linus will probably ignore changes from you without even 1.147 +responding. But a subsystem maintainer will probably review them, and 1.148 +will likely take them if they pass their criteria for suitability. 1.149 +The more ``good'' changes you contribute to a maintainer, the more 1.150 +likely they are to trust your judgment and accept your changes. If 1.151 +you're well-known and maintain a long-lived branch for something Linus 1.152 +hasn't yet accepted, people with similar interests may pull your 1.153 +changes regularly to keep up with your work. 1.154 + 1.155 +Reputation and acclaim don't necessarily cross subsystem or ``people'' 1.156 +boundaries. If you're a respected but specialised storage hacker, and 1.157 +you try to fix a networking bug, that change will receive a level of 1.158 +scrutiny from a network maintainer comparable to a change from a 1.159 +complete stranger. 1.160 + 1.161 +To people who come from more orderly project backgrounds, the 1.162 +comparatively chaotic Linux kernel development process often seems 1.163 +completely insane. It's subject to the whims of individuals; people 1.164 +make sweeping changes whenever they deem it appropriate; and the pace 1.165 +of development is astounding. And yet Linux is a highly successful, 1.166 +well-regarded piece of software. 1.167 + 1.168 +\section{The technical side of sharing} 1.169 + 1.170 +\subsection{Informal sharing with \hgcmd{serve}} 1.171 +\label{sec:collab:serve} 1.172 + 1.173 +Mercurial's \hgcmd{serve} command is wonderfully suited to small, 1.174 +tight-knit, and fast-paced group environments. It also provides a 1.175 +great way to get a feel for using Mercurial commands over a network. 1.176 + 1.177 +Run \hgcmd{serve} inside a repository, and in under a second it will 1.178 +bring up a specialised HTTP server; this will accept connections from 1.179 +any client, and serve up data for that repository until you terminate 1.180 +it. Anyone who knows the URL of the server you just started, and can 1.181 +talk to your computer over the network, can then use a web browser or 1.182 +Mercurial to read data from that repository. A URL for a 1.183 +\hgcmd{serve} instance running on a laptop is likely to look something 1.184 +like \Verb|http://my-laptop.local:8000/|. 1.185 + 1.186 +The \hgcmd{serve} command is \emph{not} a general-purpose web server. 1.187 +It can do only two things: 1.188 +\begin{itemize} 1.189 +\item Allow people to browse the history of the repository it's 1.190 + serving, from their normal web browsers. 1.191 +\item Speak Mercurial's wire protocol, so that people can 1.192 + \hgcmd{clone} or \hgcmd{pull} changes from that repository. 1.193 +\end{itemize} 1.194 +In particular, \hgcmd{serve} won't allow remote users to \emph{modify} 1.195 +your repository. It's intended for read-only use. 1.196 + 1.197 +If you're getting started with Mercurial, there's nothing to prevent 1.198 +you from using \hgcmd{serve} to serve up a repository on your own 1.199 +computer, then use commands like \hgcmd{clone}, \hgcmd{incoming}, and 1.200 +so on to talk to that server as if the repository was hosted remotely. 1.201 +This can help you to quickly get acquainted with using commands on 1.202 +network-hosted repositories. 1.203 + 1.204 +\subsubsection{A few things to keep in mind} 1.205 + 1.206 +Because it provides unauthenticated read access to all clients, you 1.207 +should only use \hgcmd{serve} in an environment where you either don't 1.208 +care, or have complete control over, who can access your network and 1.209 +pull data from your repository. 1.210 + 1.211 +The \hgcmd{serve} command knows nothing about any firewall software 1.212 +you might have installed on your system or network. It cannot detect 1.213 +or control your firewall software. If other people are unable to talk 1.214 +to a running \hgcmd{serve} instance, the second thing you should do 1.215 +(\emph{after} you make sure that they're using the correct URL) is 1.216 +check your firewall configuration. 1.217 + 1.218 +By default, \hgcmd{serve} listens for incoming connections on 1.219 +port~8000. If another process is already listening on the port you 1.220 +want to use, you can specify a different port to listen on using the 1.221 +\hgopt{serve}{-p} option. 1.222 + 1.223 +Normally, when \hgcmd{serve} starts, it prints no output, which can be 1.224 +a bit unnerving. If you'd like to confirm that it is indeed running 1.225 +correctly, and find out what URL you should send to your 1.226 +collaborators, start it with the \hggopt{-v} option. 1.227 + 1.228 +\subsection{Using \command{ssh} as a tunnel} 1.229 +\label{sec:collab:ssh} 1.230 + 1.231 +\subsection{Serving HTTP with a CGI script} 1.232 +\label{sec:collab:cgi} 1.233 + 1.234 + 1.235 + 1.236 +%%% Local Variables: 1.237 +%%% mode: latex 1.238 +%%% TeX-master: "00book" 1.239 +%%% End: