06ab60c066
Signed-off-by: Jason St. John <jstjohn@purdue.edu> Signed-off-by: Junio C Hamano <gitster@pobox.com>
286 lines
8.4 KiB
Plaintext
286 lines
8.4 KiB
Plaintext
From: Rutger Nijlunsing <rutger@nospam.com>
|
|
Subject: Setting up a Git repository which can be pushed into and pulled from over HTTP(S).
|
|
Date: Thu, 10 Aug 2006 22:00:26 +0200
|
|
Content-type: text/asciidoc
|
|
|
|
How to setup Git server over http
|
|
=================================
|
|
|
|
NOTE: This document is from 2006. A lot has happened since then, and this
|
|
document is now relevant mainly if your web host is not CGI capable.
|
|
Almost everyone else should instead look at linkgit:git-http-backend[1].
|
|
|
|
Since Apache is one of those packages people like to compile
|
|
themselves while others prefer the bureaucrat's dream Debian, it is
|
|
impossible to give guidelines which will work for everyone. Just send
|
|
some feedback to the mailing list at git@vger.kernel.org to get this
|
|
document tailored to your favorite distro.
|
|
|
|
|
|
What's needed:
|
|
|
|
- Have an Apache web-server
|
|
|
|
On Debian:
|
|
$ apt-get install apache2
|
|
To get apache2 by default started,
|
|
edit /etc/default/apache2 and set NO_START=0
|
|
|
|
- can edit the configuration of it.
|
|
|
|
This could be found under /etc/httpd, or refer to your Apache documentation.
|
|
|
|
On Debian: this means being able to edit files under /etc/apache2
|
|
|
|
- can restart it.
|
|
|
|
'apachectl --graceful' might do. If it doesn't, just stop and
|
|
restart apache. Be warning that active connections to your server
|
|
might be aborted by this.
|
|
|
|
On Debian:
|
|
$ /etc/init.d/apache2 restart
|
|
or
|
|
$ /etc/init.d/apache2 force-reload
|
|
(which seems to do the same)
|
|
This adds symlinks from the /etc/apache2/mods-enabled to
|
|
/etc/apache2/mods-available.
|
|
|
|
- have permissions to chown a directory
|
|
|
|
- have Git installed on the client, and
|
|
|
|
- either have Git installed on the server or have a webdav client on
|
|
the client.
|
|
|
|
In effect, this means you're going to be root, or that you're using a
|
|
preconfigured WebDAV server.
|
|
|
|
|
|
Step 1: setup a bare Git repository
|
|
-----------------------------------
|
|
|
|
At the time of writing, git-http-push cannot remotely create a Git
|
|
repository. So we have to do that at the server side with Git. Another
|
|
option is to generate an empty bare repository at the client and copy
|
|
it to the server with a WebDAV client (which is the only option if Git
|
|
is not installed on the server).
|
|
|
|
Create the directory under the DocumentRoot of the directories served
|
|
by Apache. As an example we take /usr/local/apache2, but try "grep
|
|
DocumentRoot /where/ever/httpd.conf" to find your root:
|
|
|
|
$ cd /usr/local/apache/htdocs
|
|
$ mkdir my-new-repo.git
|
|
|
|
On Debian:
|
|
|
|
$ cd /var/www
|
|
$ mkdir my-new-repo.git
|
|
|
|
|
|
Initialize a bare repository
|
|
|
|
$ cd my-new-repo.git
|
|
$ git --bare init
|
|
|
|
|
|
Change the ownership to your web-server's credentials. Use `"grep ^User
|
|
httpd.conf"` and `"grep ^Group httpd.conf"` to find out:
|
|
|
|
$ chown -R www.www .
|
|
|
|
On Debian:
|
|
|
|
$ chown -R www-data.www-data .
|
|
|
|
|
|
If you do not know which user Apache runs as, you can alternatively do
|
|
a "chmod -R a+w .", inspect the files which are created later on, and
|
|
set the permissions appropriately.
|
|
|
|
Restart apache2, and check whether http://server/my-new-repo.git gives
|
|
a directory listing. If not, check whether apache started up
|
|
successfully.
|
|
|
|
|
|
Step 2: enable DAV on this repository
|
|
-------------------------------------
|
|
|
|
First make sure the dav_module is loaded. For this, insert in httpd.conf:
|
|
|
|
LoadModule dav_module libexec/httpd/libdav.so
|
|
AddModule mod_dav.c
|
|
|
|
Also make sure that this line exists which is the file used for
|
|
locking DAV operations:
|
|
|
|
DAVLockDB "/usr/local/apache2/temp/DAV.lock"
|
|
|
|
On Debian these steps can be performed with:
|
|
|
|
Enable the dav and dav_fs modules of apache:
|
|
$ a2enmod dav_fs
|
|
(just to be sure. dav_fs might be unneeded, I don't know)
|
|
$ a2enmod dav
|
|
The DAV lock is located in /etc/apache2/mods-available/dav_fs.conf:
|
|
DAVLockDB /var/lock/apache2/DAVLock
|
|
|
|
Of course, it can point somewhere else, but the string is actually just a
|
|
prefix in some Apache configurations, and therefore the _directory_ has to
|
|
be writable by the user Apache runs as.
|
|
|
|
Then, add something like this to your httpd.conf
|
|
|
|
<Location /my-new-repo.git>
|
|
DAV on
|
|
AuthType Basic
|
|
AuthName "Git"
|
|
AuthUserFile /usr/local/apache2/conf/passwd.git
|
|
Require valid-user
|
|
</Location>
|
|
|
|
On Debian:
|
|
Create (or add to) /etc/apache2/conf.d/git.conf :
|
|
|
|
<Location /my-new-repo.git>
|
|
DAV on
|
|
AuthType Basic
|
|
AuthName "Git"
|
|
AuthUserFile /etc/apache2/passwd.git
|
|
Require valid-user
|
|
</Location>
|
|
|
|
Debian automatically reads all files under /etc/apache2/conf.d.
|
|
|
|
The password file can be somewhere else, but it has to be readable by
|
|
Apache and preferably not readable by the world.
|
|
|
|
Create this file by
|
|
$ htpasswd -c /usr/local/apache2/conf/passwd.git <user>
|
|
|
|
On Debian:
|
|
$ htpasswd -c /etc/apache2/passwd.git <user>
|
|
|
|
You will be asked a password, and the file is created. Subsequent calls
|
|
to htpasswd should omit the '-c' option, since you want to append to the
|
|
existing file.
|
|
|
|
You need to restart Apache.
|
|
|
|
Now go to http://<username>@<servername>/my-new-repo.git in your
|
|
browser to check whether it asks for a password and accepts the right
|
|
password.
|
|
|
|
On Debian:
|
|
|
|
To test the WebDAV part, do:
|
|
|
|
$ apt-get install litmus
|
|
$ litmus http://<servername>/my-new-repo.git <username> <password>
|
|
|
|
Most tests should pass.
|
|
|
|
A command-line tool to test WebDAV is cadaver. If you prefer GUIs, for
|
|
example, konqueror can open WebDAV URLs as "webdav://..." or
|
|
"webdavs://...".
|
|
|
|
If you're into Windows, from XP onwards Internet Explorer supports
|
|
WebDAV. For this, do Internet Explorer -> Open Location ->
|
|
http://<servername>/my-new-repo.git [x] Open as webfolder -> login .
|
|
|
|
|
|
Step 3: setup the client
|
|
------------------------
|
|
|
|
Make sure that you have HTTP support, i.e. your Git was built with
|
|
libcurl (version more recent than 7.10). The command 'git http-push' with
|
|
no argument should display a usage message.
|
|
|
|
Then, add the following to your $HOME/.netrc (you can do without, but will be
|
|
asked to input your password a _lot_ of times):
|
|
|
|
machine <servername>
|
|
login <username>
|
|
password <password>
|
|
|
|
...and set permissions:
|
|
chmod 600 ~/.netrc
|
|
|
|
If you want to access the web-server by its IP, you have to type that in,
|
|
instead of the server name.
|
|
|
|
To check whether all is OK, do:
|
|
|
|
curl --netrc --location -v http://<username>@<servername>/my-new-repo.git/HEAD
|
|
|
|
...this should give something like 'ref: refs/heads/master', which is
|
|
the content of the file HEAD on the server.
|
|
|
|
Now, add the remote in your existing repository which contains the project
|
|
you want to export:
|
|
|
|
$ git-config remote.upload.url \
|
|
http://<username>@<servername>/my-new-repo.git/
|
|
|
|
It is important to put the last '/'; Without it, the server will send
|
|
a redirect which git-http-push does not (yet) understand, and git-http-push
|
|
will repeat the request infinitely.
|
|
|
|
|
|
Step 4: make the initial push
|
|
-----------------------------
|
|
|
|
From your client repository, do
|
|
|
|
$ git push upload master
|
|
|
|
This pushes branch 'master' (which is assumed to be the branch you
|
|
want to export) to repository called 'upload', which we previously
|
|
defined with git-config.
|
|
|
|
|
|
Using a proxy:
|
|
--------------
|
|
|
|
If you have to access the WebDAV server from behind an HTTP(S) proxy,
|
|
set the variable 'all_proxy' to 'http://proxy-host.com:port', or
|
|
'http://login-on-proxy:passwd-on-proxy@proxy-host.com:port'. See 'man
|
|
curl' for details.
|
|
|
|
|
|
Troubleshooting:
|
|
----------------
|
|
|
|
If git-http-push says
|
|
|
|
Error: no DAV locking support on remote repo http://...
|
|
|
|
then it means the web-server did not accept your authentication. Make sure
|
|
that the user name and password matches in httpd.conf, .netrc and the URL
|
|
you are uploading to.
|
|
|
|
If git-http-push shows you an error (22/502) when trying to MOVE a blob,
|
|
it means that your web-server somehow does not recognize its name in the
|
|
request; This can happen when you start Apache, but then disable the
|
|
network interface. A simple restart of Apache helps.
|
|
|
|
Errors like (22/502) are of format (curl error code/http error
|
|
code). So (22/404) means something like 'not found' at the server.
|
|
|
|
Reading /usr/local/apache2/logs/error_log is often helpful.
|
|
|
|
On Debian: Read /var/log/apache2/error.log instead.
|
|
|
|
If you access HTTPS locations, Git may fail verifying the SSL
|
|
certificate (this is return code 60). Setting http.sslVerify=false can
|
|
help diagnosing the problem, but removes security checks.
|
|
|
|
|
|
Debian References: http://www.debian-administration.org/articles/285
|
|
|
|
Authors
|
|
Johannes Schindelin <Johannes.Schindelin@gmx.de>
|
|
Rutger Nijlunsing <git@wingding.demon.nl>
|
|
Matthieu Moy <Matthieu.Moy@imag.fr>
|