Minimal git server and web interface setup

Git server

There are basically 3 methods to serve git repositories described in progit: http, git and ssh. I happen to find using http to serve another protocol retarded no matter the justification so I will use git and ssh. I'll also be using OpenBSD for the server OS as I find it the most sane option.

Setting up a git daemon to serve your repository is exceedingly easy. On OpenBSD you just need to install git

doas pkg_add git

and append the following line to /etc/rc.conf.local:

gitdaemon_flags="--export-all --reuseaddr --base-path=/var/www/git/ /var/www/git/"

You can read what all the options do in the man page.

man git-daemon

Then start and enable the daemon.

doas rcctl start gitdaemon
doas rcctl enable gitdaemon

To create a repository to serve with the git daemon, initialize a bare repository in the directory specified above.

cd /var/www/git
git init --bare repo-name.git

Then push your repository to it with ssh.

git push server:/var/www/git/repo-name.git

The push command is from the root user of the server you have access to. It's shorthand for scp and comes from a record in ~/.ssh/config like this one:

Host server
    HostName 1.2.3.4
    User root
    port 22

Make sure the git daemon has permision to read the bare repository. Then you can now fetch it like so:

git pull git://domain.tld/repo-name.git

You can change the origin of that repository to the above.

git remote set-url origin git://domain.tld/repo-name.git

If you want more granular access control (for your supposed maintainers), you can create a git user and follow the steps in progit. For most small projects, I find the above setup good enough.

Web interface

I'll be using stagit for the web interface. My first choice was actually cgit but it's a huge pain to setup because it assumes bloat. There are a few things I don't like about stagit, the most important of which is that you can't copy code from the webview without also including the line numbers. Screw it though, that's why it's called a webview. I'll take its simplicity over the bloated alternatives every time.

The first thing we'll need to do is to inatall stagit.

doas pkg_add stagit

The easiest way to create the static files is to use a script provided in the upstream repository. It might be hiding somewhere in the documentation but I couldn't find it. Before you run it you should edit the url, owner and description files in the bare repositories. To get the script, clone the repository

git clone git://git.codemadness.org/stagit

and change the reposdir variable in example_create.sh then run the script in the directory you want the static files to end up. You can use the css, logo and favicon that comes in the repository but I like my css better. You should use it instead.

That's it. You now have a fully functional self-hosted git server. You can use email to process pull requests, just as Linus intended. If you want to look at what the finished product looks like, you can visit my instance.