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 (.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.
Categories: git, Linux
Tags: Debian, Git, git-daemon-sysvinit, gitweb, gitweb pathinfo, gitweb RewriteEngine, Ubuntu
Comments: No Comments.
