Git over HTTP with Apache
I had a requirement at work recently for our Git repo to be reachable via HTTP. I looked at Gitlab however came to the conclusion that it was probably overkill for our situation. I went with the following setup instead which can be run on the most minimal VM e.g AWS EC2 Nano instance.
The instructions were intended for Centos7 however should work without much modification for other distros.
- Install required packages:
yum install httpd git mod_ssl
- Ensure that ‘mod_cgid’ + ‘mod_alias’ are loaded in your Apache config
- Append the following config to
/etc/httpd/conf/httpd.conf
to force SSL by redirecting non-SSL to SSL:
<VirtualHost *:80>
ServerName gitweb.example.com
Redirect permanent / https://gitweb.example.com/
</VirtualHost>
- Modify
/etc/httpd/conf.d/ssl.conf
and add this to the default vhost:
SetEnv GIT_PROJECT_ROOT /data/git
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/libexec/git-core/git-http-backend/
<LocationMatch "^/git/">
Options +ExecCGI
AuthType Basic
AuthName "git repository"
AuthUserFile /data/git/htpasswd.git
Require valid-user
</LocationMatch>
- Create git repo and give Apache rw permissions:
mkdir /data/git
cd /data/git; git init --bare myrepo
mv myrepo/hooks/post-update.sample myrepo/hooks/post-update
chown apache:apache /data/git -R
File post-update
should now contain:
#!/bin/sh
exec git update-server-info
- Create htpasswd file to protect repo:
htpasswd -c /data/git/htpasswd.git dev
- Update SELinux to allow Apache rw access to repos:
semanage fcontext -a -t httpd_sys_rw_content_t "/data/git(/.*)?"
restorecon -v /data -R
- Start Apache:
systemctl start httpd
systemctl enable httpd
- Push to the repo from your client as follows:
git push https://gitweb.example.com/git/myrepo -f --mirror
- Pull from repo to your client as follows:
git pull https://dev@gitweb.example.com/git/myrepo master