1 From: Rutger Nijlunsing <rutger@nospam.com>
2 Subject: Setting up a Git repository which can be pushed into and pulled from over HTTP(S).
3 Date: Thu, 10 Aug 2006 22:00:26 +0200
4 Content-type: text/asciidoc
6 How to setup Git server over http
7 =================================
9 Since Apache is one of those packages people like to compile
10 themselves while others prefer the bureaucrat's dream Debian, it is
11 impossible to give guidelines which will work for everyone. Just send
12 some feedback to the mailing list at git@vger.kernel.org to get this
13 document tailored to your favorite distro.
18 - Have an Apache web-server
21 $ apt-get install apache2
22 To get apache2 by default started,
23 edit /etc/default/apache2 and set NO_START=0
25 - can edit the configuration of it.
27 This could be found under /etc/httpd, or refer to your Apache documentation.
29 On Debian: this means being able to edit files under /etc/apache2
33 'apachectl --graceful' might do. If it doesn't, just stop and
34 restart apache. Be warning that active connections to your server
35 might be aborted by this.
38 $ /etc/init.d/apache2 restart
40 $ /etc/init.d/apache2 force-reload
41 (which seems to do the same)
42 This adds symlinks from the /etc/apache2/mods-enabled to
43 /etc/apache2/mods-available.
45 - have permissions to chown a directory
47 - have Git installed on the client, and
49 - either have Git installed on the server or have a webdav client on
52 In effect, this means you're going to be root, or that you're using a
53 preconfigured WebDAV server.
56 Step 1: setup a bare Git repository
57 -----------------------------------
59 At the time of writing, git-http-push cannot remotely create a Git
60 repository. So we have to do that at the server side with Git. Another
61 option is to generate an empty bare repository at the client and copy
62 it to the server with a WebDAV client (which is the only option if Git
63 is not installed on the server).
65 Create the directory under the DocumentRoot of the directories served
66 by Apache. As an example we take /usr/local/apache2, but try "grep
67 DocumentRoot /where/ever/httpd.conf" to find your root:
69 $ cd /usr/local/apache/htdocs
70 $ mkdir my-new-repo.git
75 $ mkdir my-new-repo.git
78 Initialize a bare repository
84 Change the ownership to your web-server's credentials. Use "grep ^User
85 httpd.conf" and "grep ^Group httpd.conf" to find out:
91 $ chown -R www-data.www-data .
94 If you do not know which user Apache runs as, you can alternatively do
95 a "chmod -R a+w .", inspect the files which are created later on, and
96 set the permissions appropriately.
98 Restart apache2, and check whether http://server/my-new-repo.git gives
99 a directory listing. If not, check whether apache started up
103 Step 2: enable DAV on this repository
104 -------------------------------------
106 First make sure the dav_module is loaded. For this, insert in httpd.conf:
108 LoadModule dav_module libexec/httpd/libdav.so
111 Also make sure that this line exists which is the file used for
112 locking DAV operations:
114 DAVLockDB "/usr/local/apache2/temp/DAV.lock"
116 On Debian these steps can be performed with:
118 Enable the dav and dav_fs modules of apache:
120 (just to be sure. dav_fs might be unneeded, I don't know)
122 The DAV lock is located in /etc/apache2/mods-available/dav_fs.conf:
123 DAVLockDB /var/lock/apache2/DAVLock
125 Of course, it can point somewhere else, but the string is actually just a
126 prefix in some Apache configurations, and therefore the _directory_ has to
127 be writable by the user Apache runs as.
129 Then, add something like this to your httpd.conf
131 <Location /my-new-repo.git>
135 AuthUserFile /usr/local/apache2/conf/passwd.git
140 Create (or add to) /etc/apache2/conf.d/git.conf :
142 <Location /my-new-repo.git>
146 AuthUserFile /etc/apache2/passwd.git
150 Debian automatically reads all files under /etc/apache2/conf.d.
152 The password file can be somewhere else, but it has to be readable by
153 Apache and preferably not readable by the world.
156 $ htpasswd -c /usr/local/apache2/conf/passwd.git <user>
159 $ htpasswd -c /etc/apache2/passwd.git <user>
161 You will be asked a password, and the file is created. Subsequent calls
162 to htpasswd should omit the '-c' option, since you want to append to the
165 You need to restart Apache.
167 Now go to http://<username>@<servername>/my-new-repo.git in your
168 browser to check whether it asks for a password and accepts the right
173 To test the WebDAV part, do:
175 $ apt-get install litmus
176 $ litmus http://<servername>/my-new-repo.git <username> <password>
178 Most tests should pass.
180 A command line tool to test WebDAV is cadaver. If you prefer GUIs, for
181 example, konqueror can open WebDAV URLs as "webdav://..." or
184 If you're into Windows, from XP onwards Internet Explorer supports
185 WebDAV. For this, do Internet Explorer -> Open Location ->
186 http://<servername>/my-new-repo.git [x] Open as webfolder -> login .
189 Step 3: setup the client
190 ------------------------
192 Make sure that you have HTTP support, i.e. your Git was built with
193 libcurl (version more recent than 7.10). The command 'git http-push' with
194 no argument should display a usage message.
196 Then, add the following to your $HOME/.netrc (you can do without, but will be
197 asked to input your password a _lot_ of times):
203 ...and set permissions:
206 If you want to access the web-server by its IP, you have to type that in,
207 instead of the server name.
209 To check whether all is OK, do:
211 curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/HEAD
213 ...this should give something like 'ref: refs/heads/master', which is
214 the content of the file HEAD on the server.
216 Now, add the remote in your existing repository which contains the project
219 $ git-config remote.upload.url \
220 http://<username>@<servername>/my-new-repo.git/
222 It is important to put the last '/'; Without it, the server will send
223 a redirect which git-http-push does not (yet) understand, and git-http-push
224 will repeat the request infinitely.
227 Step 4: make the initial push
228 -----------------------------
230 From your client repository, do
232 $ git push upload master
234 This pushes branch 'master' (which is assumed to be the branch you
235 want to export) to repository called 'upload', which we previously
236 defined with git-config.
242 If you have to access the WebDAV server from behind an HTTP(S) proxy,
243 set the variable 'all_proxy' to 'http://proxy-host.com:port', or
244 'http://login-on-proxy:passwd-on-proxy@proxy-host.com:port'. See 'man
251 If git-http-push says
253 Error: no DAV locking support on remote repo http://...
255 then it means the web-server did not accept your authentication. Make sure
256 that the user name and password matches in httpd.conf, .netrc and the URL
257 you are uploading to.
259 If git-http-push shows you an error (22/502) when trying to MOVE a blob,
260 it means that your web-server somehow does not recognize its name in the
261 request; This can happen when you start Apache, but then disable the
262 network interface. A simple restart of Apache helps.
264 Errors like (22/502) are of format (curl error code/http error
265 code). So (22/404) means something like 'not found' at the server.
267 Reading /usr/local/apache2/logs/error_log is often helpful.
269 On Debian: Read /var/log/apache2/error.log instead.
271 If you access HTTPS locations, Git may fail verifying the SSL
272 certificate (this is return code 60). Setting http.sslVerify=false can
273 help diagnosing the problem, but removes security checks.
276 Debian References: http://www.debian-administration.org/articles/285
279 Johannes Schindelin <Johannes.Schindelin@gmx.de>
280 Rutger Nijlunsing <git@wingding.demon.nl>
281 Matthieu Moy <Matthieu.Moy@imag.fr>