Documentation / howto / setup-git-server-over-http.txton commit score_trees(): fix iteration over trees with missing entries (2ec4150)
   1From: Rutger Nijlunsing <rutger@nospam.com>
   2Subject: Setting up a Git repository which can be pushed into and pulled from over HTTP(S).
   3Date: Thu, 10 Aug 2006 22:00:26 +0200
   4Content-type: text/asciidoc
   5
   6How to setup Git server over http
   7=================================
   8
   9NOTE: This document is from 2006.  A lot has happened since then, and this
  10document is now relevant mainly if your web host is not CGI capable.
  11Almost everyone else should instead look at linkgit:git-http-backend[1].
  12
  13Since Apache is one of those packages people like to compile
  14themselves while others prefer the bureaucrat's dream Debian, it is
  15impossible to give guidelines which will work for everyone. Just send
  16some feedback to the mailing list at git@vger.kernel.org to get this
  17document tailored to your favorite distro.
  18
  19
  20What's needed:
  21
  22- Have an Apache web-server
  23
  24  On Debian:
  25    $ apt-get install apache2
  26    To get apache2 by default started,
  27    edit /etc/default/apache2 and set NO_START=0
  28
  29- can edit the configuration of it.
  30
  31  This could be found under /etc/httpd, or refer to your Apache documentation.
  32
  33  On Debian: this means being able to edit files under /etc/apache2
  34
  35- can restart it.
  36
  37  'apachectl --graceful' might do. If it doesn't, just stop and
  38  restart apache. Be warning that active connections to your server
  39  might be aborted by this.
  40
  41  On Debian:
  42    $ /etc/init.d/apache2 restart
  43  or
  44    $ /etc/init.d/apache2 force-reload
  45    (which seems to do the same)
  46  This adds symlinks from the /etc/apache2/mods-enabled to
  47  /etc/apache2/mods-available.
  48
  49- have permissions to chown a directory
  50
  51- have Git installed on the client, and
  52
  53- either have Git installed on the server or have a webdav client on
  54  the client.
  55
  56In effect, this means you're going to be root, or that you're using a
  57preconfigured WebDAV server.
  58
  59
  60Step 1: setup a bare Git repository
  61-----------------------------------
  62
  63At the time of writing, git-http-push cannot remotely create a Git
  64repository. So we have to do that at the server side with Git. Another
  65option is to generate an empty bare repository at the client and copy
  66it to the server with a WebDAV client (which is the only option if Git
  67is not installed on the server).
  68
  69Create the directory under the DocumentRoot of the directories served
  70by Apache. As an example we take /usr/local/apache2, but try "grep
  71DocumentRoot /where/ever/httpd.conf" to find your root:
  72
  73    $ cd /usr/local/apache/htdocs
  74    $ mkdir my-new-repo.git
  75
  76  On Debian:
  77
  78    $ cd /var/www
  79    $ mkdir my-new-repo.git
  80
  81
  82Initialize a bare repository
  83
  84    $ cd my-new-repo.git
  85    $ git --bare init
  86
  87
  88Change the ownership to your web-server's credentials. Use `"grep ^User
  89httpd.conf"` and `"grep ^Group httpd.conf"` to find out:
  90
  91    $ chown -R www.www .
  92
  93  On Debian:
  94
  95    $ chown -R www-data.www-data .
  96
  97
  98If you do not know which user Apache runs as, you can alternatively do
  99a "chmod -R a+w .", inspect the files which are created later on, and
 100set the permissions appropriately.
 101
 102Restart apache2, and check whether http://server/my-new-repo.git gives
 103a directory listing. If not, check whether apache started up
 104successfully.
 105
 106
 107Step 2: enable DAV on this repository
 108-------------------------------------
 109
 110First make sure the dav_module is loaded. For this, insert in httpd.conf:
 111
 112    LoadModule dav_module libexec/httpd/libdav.so
 113    AddModule mod_dav.c
 114
 115Also make sure that this line exists which is the file used for
 116locking DAV operations:
 117
 118  DAVLockDB "/usr/local/apache2/temp/DAV.lock"
 119
 120  On Debian these steps can be performed with:
 121
 122    Enable the dav and dav_fs modules of apache:
 123    $ a2enmod dav_fs
 124    (just to be sure. dav_fs might be unneeded, I don't know)
 125    $ a2enmod dav
 126    The DAV lock is located in /etc/apache2/mods-available/dav_fs.conf:
 127      DAVLockDB /var/lock/apache2/DAVLock
 128
 129Of course, it can point somewhere else, but the string is actually just a
 130prefix in some Apache configurations, and therefore the _directory_ has to
 131be writable by the user Apache runs as.
 132
 133Then, add something like this to your httpd.conf
 134
 135  <Location /my-new-repo.git>
 136     DAV on
 137     AuthType Basic
 138     AuthName "Git"
 139     AuthUserFile /usr/local/apache2/conf/passwd.git
 140     Require valid-user
 141  </Location>
 142
 143  On Debian:
 144    Create (or add to) /etc/apache2/conf.d/git.conf :
 145
 146    <Location /my-new-repo.git>
 147       DAV on
 148       AuthType Basic
 149       AuthName "Git"
 150       AuthUserFile /etc/apache2/passwd.git
 151       Require valid-user
 152    </Location>
 153
 154    Debian automatically reads all files under /etc/apache2/conf.d.
 155
 156The password file can be somewhere else, but it has to be readable by
 157Apache and preferably not readable by the world.
 158
 159Create this file by
 160    $ htpasswd -c /usr/local/apache2/conf/passwd.git <user>
 161
 162    On Debian:
 163      $ htpasswd -c /etc/apache2/passwd.git <user>
 164
 165You will be asked a password, and the file is created. Subsequent calls
 166to htpasswd should omit the '-c' option, since you want to append to the
 167existing file.
 168
 169You need to restart Apache.
 170
 171Now go to http://<username>@<servername>/my-new-repo.git in your
 172browser to check whether it asks for a password and accepts the right
 173password.
 174
 175On Debian:
 176
 177   To test the WebDAV part, do:
 178
 179   $ apt-get install litmus
 180   $ litmus http://<servername>/my-new-repo.git <username> <password>
 181
 182   Most tests should pass.
 183
 184A command-line tool to test WebDAV is cadaver. If you prefer GUIs, for
 185example, konqueror can open WebDAV URLs as "webdav://..." or
 186"webdavs://...".
 187
 188If you're into Windows, from XP onwards Internet Explorer supports
 189WebDAV. For this, do Internet Explorer -> Open Location ->
 190http://<servername>/my-new-repo.git [x] Open as webfolder -> login .
 191
 192
 193Step 3: setup the client
 194------------------------
 195
 196Make sure that you have HTTP support, i.e. your Git was built with
 197libcurl (version more recent than 7.10). The command 'git http-push' with
 198no argument should display a usage message.
 199
 200Then, add the following to your $HOME/.netrc (you can do without, but will be
 201asked to input your password a _lot_ of times):
 202
 203    machine <servername>
 204    login <username>
 205    password <password>
 206
 207...and set permissions:
 208     chmod 600 ~/.netrc
 209
 210If you want to access the web-server by its IP, you have to type that in,
 211instead of the server name.
 212
 213To check whether all is OK, do:
 214
 215   curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/HEAD
 216
 217...this should give something like 'ref: refs/heads/master', which is
 218the content of the file HEAD on the server.
 219
 220Now, add the remote in your existing repository which contains the project
 221you want to export:
 222
 223   $ git-config remote.upload.url \
 224       http://<username>@<servername>/my-new-repo.git/
 225
 226It is important to put the last '/'; Without it, the server will send
 227a redirect which git-http-push does not (yet) understand, and git-http-push
 228will repeat the request infinitely.
 229
 230
 231Step 4: make the initial push
 232-----------------------------
 233
 234From your client repository, do
 235
 236   $ git push upload master
 237
 238This pushes branch 'master' (which is assumed to be the branch you
 239want to export) to repository called 'upload', which we previously
 240defined with git-config.
 241
 242
 243Using a proxy:
 244--------------
 245
 246If you have to access the WebDAV server from behind an HTTP(S) proxy,
 247set the variable 'all_proxy' to 'http://proxy-host.com:port', or
 248'http://login-on-proxy:passwd-on-proxy@proxy-host.com:port'. See 'man
 249curl' for details.
 250
 251
 252Troubleshooting:
 253----------------
 254
 255If git-http-push says
 256
 257   Error: no DAV locking support on remote repo http://...
 258
 259then it means the web-server did not accept your authentication. Make sure
 260that the user name and password matches in httpd.conf, .netrc and the URL
 261you are uploading to.
 262
 263If git-http-push shows you an error (22/502) when trying to MOVE a blob,
 264it means that your web-server somehow does not recognize its name in the
 265request; This can happen when you start Apache, but then disable the
 266network interface. A simple restart of Apache helps.
 267
 268Errors like (22/502) are of format (curl error code/http error
 269code). So (22/404) means something like 'not found' at the server.
 270
 271Reading /usr/local/apache2/logs/error_log is often helpful.
 272
 273  On Debian: Read /var/log/apache2/error.log instead.
 274
 275If you access HTTPS locations, Git may fail verifying the SSL
 276certificate (this is return code 60). Setting http.sslVerify=false can
 277help diagnosing the problem, but removes security checks.
 278
 279
 280Debian References: http://www.debian-administration.org/articles/285
 281
 282Authors
 283  Johannes Schindelin <Johannes.Schindelin@gmx.de>
 284  Rutger Nijlunsing <git@wingding.demon.nl>
 285  Matthieu Moy <Matthieu.Moy@imag.fr>