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.