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