I need to set up a git server with git-over-http (smart http), but the resources available online are a mess, mixing in other apache configuration, missing details or not being explicit enough.
I am answering this question myself based on what I found lacking in the available resources.
First it is necessary to understand that there are 2 components to git-over-http: git and apache. These two are connected through a script with the name of git-http-backend. The challenge is to configure the interface between these two components, so that http requests to git are forwarded by apache.
Note: Security is outside the scope of this guide.
Start out by installing git and apache2 using the package manager of your distribution.
Add the modules needed by apache to enable git-over-http. These are cgi, alias and env
$ a2enmod cgi alias env
/etc/apache2/httpd.conf
(without removing whatever else it contains)<VirtualHost *:80>
SetEnv GIT_PROJECT_ROOT /data/git
SetEnv GIT_HTTP_EXPORT_ALL
SetEnv REMOTE_USER=$REDIRECT_REMOTE_USER
ScriptAliasMatch \
"(?x)^/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
"/usr/lib/git/git-http-backend/$1"
Alias /git /data/git
<Directory /usr/lib/git>
Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
AllowOverride None
Order allow,deny
Allow from all
</Directory>
</VirtualHost>
/data/git
with the parent directory of your git repos on the server (don't worry if you don't have any repos yet, just use the directory where you intend to place it/them)Also replace /usr/lib/git/git-http-backend
with the location of git-http-backend on your system, which can be found using $ find / -name git-http-backend
It may be that on your system REDIRECT_REMOTE_USER
actually overwrites a valid REMOTE_USER
. If this setup doesn't work when finished, try removing that line.
According to this source, it may be necessary to replace the last two lines within the Directory tag by Require all granted
for apache 2.4 and above.
$ apache2ctl -k graceful
Now the apache server is set up, but we're not done yet, there are some important parts of setting up the repos that will affect whether this setup works or not.
$ mkdir myrepo.git
$ cd myrepo.git
$ git init --bare --shared
$ cp hooks/post-update.sample hooks/post-update
$ git update-server-info
$ chown -R wwwrun:www
Here it is important to understand that the last line changes the owner of the repo to the apache2 user. This user may be different on your system. To find the apache user, execute $ ps aux | egrep '(apache|httpd)'
. Then to find the group name of the user, execute $ id user-name
. On my system the user is wwwrun and the group www. Replace accordingly.
In order to use the repo, you need to know the url. For this setup the url is http://server.domain/myrepo.git
Note: https will not work.
When accessing the repo from a client, you just add it as a remote:
$ git remote add origin http://server.domain/myrepo.git
Then you can interact with it like any other git repo.