Debian Gitweb server
After getting sick of GitHub’s clunky closed-source interface, I decided to migrate my repositories to my own Debian-based server using the gitweb web interface.
Considering that I already have SSH access to the server, I only needed to provide read-only public access. As well as providing this access via the traditional 9418/tcp git protocol port, I wanted to provide access via HTTP too (I sometimes get caught behind firewalls which block 9418/tcp).
For vanity purposes, it was important that a single URL allowed both gitweb access and git cloning. Syntax highlighting for common programming languages is also a nice feature to have when migrating from github.
Finally, it was important that the configuration adhere where possible to the default Debian configuration files. I don’t want the whole thing to fall apart when I upgrade to the next stable release!
The configuration below fulfils all the above requirements.
First, install git and apache if not installed:
apt-get install git gitweb git-daemon-sysvinit apache2 highlight
git-daemon-sysvinit is not available in Squeeze due to a dependency issue. You may either use git-daemon-run instead, compile this package yourself and relax the dependency, or else install the latest version of git from squeeze-backports.
Apache2 Virtual Host - /etc/apache2/sites-available/git.dereenigne.org:
<VirtualHost *:80>
ServerName git.dereenigne.org
DocumentRoot /usr/share/gitweb
SetEnv GITWEB_CONFIG /etc/gitweb.conf
SetEnv GIT_PROJECT_ROOT /var/cache/git
<Directory /usr/share/gitweb>
Options FollowSymLinks +ExecCGI
AddHandler cgi-script .cgi
DirectoryIndex gitweb.cgi
# Pretty gitweb URLs
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.* /gitweb.cgi/$0 [L,PT]
</Directory>
# Enable git clone over HTTP
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-core/git-http-backend/$1
</VirtualHost>
Enable the apache2 site:
a2ensite /etc/apache2/sites-available/git.dereenigne.org
Edit /etc/gitweb.conf:
# path to git projects (<project>.git)
$projectroot = "/var/cache/git";
@git_base_url_list = ("git://git.dereenigne.org", "http://git.dereenigne.org");
# directory to use for temp files
$git_temp = "/tmp";
$site_name = "git.dereenigne.org";
# require export flag
$export_ok = "git-daemon-export-ok";
$strict_export = 1;
# target of the home link on top of all pages
#$home_link = $my_uri || "/";
# html text to include at home page
#$home_text = "indextext.html";
# file with project list; by default, simply scan the projectroot dir.
#$projects_list = $projectroot;
# stylesheet to use
#$stylesheet = "gitweb.css";
# javascript code for gitweb
#$javascript = "gitweb.js";
# logo to use
#$logo = "git-logo.png";
# the 'favicon'
#$favicon = "git-favicon.png";
# enable git blame
$feature{'blame'}{'default'} = [1];
# enable pickaxe search
$feature{'pickaxe'}{'default'} = [1];
# enable snapshot downloads
$feature{'snapshot'}{'default'} = ['zip', 'tgz'];
# enable syntax highlighting
$feature{'highlight'}{'default'} = [1];
# enable pretty URLs
$feature{'pathinfo'}{'default'} = [1];
Edit /etc/default/git-daemon:
# Defaults for git-daemon initscript # sourced by /etc/init.d/git-daemon # installed at /etc/default/git-daemon by the maintainer scripts # # This is a POSIX shell fragment # GIT_DAEMON_ENABLE=true GIT_DAEMON_USER=gitdaemon GIT_DAEMON_BASE_PATH=/var/cache/git GIT_DAEMON_DIRECTORY=/var/cache/git # Additional options that are passed to the Daemon. GIT_DAEMON_OPTIONS=""
Start the git daemon:
/etc/init.d/git-daemon start
To create a new project:
ssh myserver mkdir /var/cache/git/myrepo.git cd /var/cache/git/myrepo.git git init --bare echo "myrepo description" > description touch git-daemon-export-ok
To push to this project:
git add remote myserver user@myserver:/var/cache/git/myrepo.git git push myserver master
While this page is about Debian, the same commands can be used to set up a similar setup on Ubuntu.