I revisited an old post that I wrote to see how to host my own private git repository with Apache, but I didn’t write any details and made it hard on myself, so I’ll try to fix that here.
My setup
- Anonymous read access, user/password protected write access
- Ubuntu 14.04
- Apache 2.4
- Git 1.9.1
Step 1. Enable the prerequisite modules.
I had to add symlinks in /etc/apache2/mods-enabled for the rewrite and cgi modules. These are already available with a vanilla install, so look for rewrite.load and cgi.load in the mods-available folder.
In addition, you need to explicitly enable the rewrite module in the virtual host setup in the vanilla apache2 install. I added these lines right under the log defines in sites-enabled/000-default.conf:
RewriteEngine On
RewriteOptions Inherit
Step 2. Set up the git repositories.
I set up all my repositories under /path/to/git, e.g. /path/to/git/project1.git/, etc. The repositories have to be set up in a specific way to enable push. Here’s a script I use:
#!/bin/bash if [[ $# < 1 ]]; then echo Usage: `basename $0` repo-name exit 0 fi cd /path/to/git if [[ -e ${1}.git ]]; then echo ${1}.git exists exit 0 fi mkdir ${1}.git cd ${1}.git git init --bare git config http.receivepack true git update-server-info touch git-daemon-export-ok cd .. sudo chown -R www-data:www-data ${1}.git
Step 3. Set up a users list with htpasswd.
- Install apache2-utils
- htpasswd -c /path/to/git/users.txt username
Step 4. Set up a git config.
Put this in, say, git.conf under /etc/apache2/confs-available, and
SetEnv GIT_PROJECT_ROOT /var/www/git SetEnv GIT_HTTP_EXPORT_ALL ScriptAlias /git/ /usr/lib/git-core/git-http-backend/ RewriteCond %{QUERY_STRING} service=git-upload-pack [OR] RewriteCond %{REQUEST_URI} /git-upload-pack$ RewriteRule ^/git/ - [E=AUTHNOTREQUIRED:yes] <LocationMatch "^/git/"> Require env AUTHNOTREQUIRED AuthType Basic AuthName "Git access" AuthUserFile /path/to/git/users.txt Require valid-user </LocationMatch>
Remarks
I spent way too much time on this because of a mismatch between git and apache documentation. Basically, the authorization directives were specific to Apache 2.2 but I was working with Apache 2.4 – see here under runtime configuration changes where they mention that they have a new authorization module mod_authz_host. Also, because I’m not a sysadmin, I didn’t realize that I had to add “RewriteEngine On” so I was scratching my head about why the environment variable was never getting set.
Anyways, I hope the above saves someone some time. I promise not to write any tutorial blogs that only link to documentation without adding anything because, as you can see, reading manuals does not solve problems.