Git is an open source, distributed version control system designed to handle everything from small to very large projects with speed and efficiency.

Every Git clone is a full-fledged repository with complete history and full revision tracking capabilities, not dependent on network access or a central server. Branching and merging are fast and easy to do.


Before starting, make sure that:

* You already have a Ubuntu 9.04 or Ubuntu 10.04 (or a newer version) installed on you computer/server.

* You already have a public ssh key on your local machine you can use that to initialize the repository. Don't have one? Look here.

* You have customised an editor by setting the environment variable EDITOR to your favourite editor. (see below)

The following instructions will guide you on how to set up and run a fully managed hosting for projects using git on your server.

WARNING This guide is written for Gitosis, which has been out of active devolpment since 2008, and no is longer available in later versions of Ubuntu such as Version 12.04. Gitosis seems to have been replaced by Gitolite.

Choose an Editor

You may have a favourite text editor that you like to use, so you'll need to specify it by exporting the EDITOR environment variable with the name of the editor binary.

This example sets vim as the editor for use throughout this guide, i.e:

export EDITOR=vim

If you want to use another editor like nano, pico or gedit then you replace vim with either nano, pico or gedit. Remember that gedit (and other Desktop editors like it) requires a valid Xserver display to be available.

Used software

This tutorial was done using Ubuntu 9.04 (Jaunty Jackalope), Ubuntu 10.04 (Lucid Lynx).

We'll be using the latest git package available in the archive.

For git project management will be using Gitosis.

For repository web browsing we will be using ViewGit. The latest version we will clone directly from a git repository: git clone git://

Setting up Git and Project Management

Use your favorite package installer to install git-core and gitosis packages:

sudo apt-get -y install git-core gitosis

Installing the gitosis package will create the user gitosis and the home directory for it at /srv/gitosis, which contains the repositories and configuration information.

Now that you should have both packages installed and a gitosis user, we can set up gitosis.

Initialize gitosis using your key:

sudo -H -u gitosis gitosis-init < initialKeyFileName

where initialKeyFileName name is the name of a copy of the public key from your local machine which is on the server (i.e. the file ending in .pub)

If you saw some output like this: Initialized empty Git repository in ./ Your gitosis is installed.

Once done, you can now checkout the gitosis-admin branch on your local machine:

git clone

...but replace with the actual name of your server. Note that gitosis is an account already on your system that was created when you installed the gitosis package.

If the cloning doesn't work, maybe you have PermitRootLogin no in the SSH server, and you need to allow the gitosis user in sshd_config:

sudo $EDITOR /etc/ssh/sshd_config
AllowUsers gitosis

WARNING This blocks all users other than gitosis from ssh access. Refer to the sshd_config manpage : ... If AllowUsers is specified, login is allowed only for user names that match one of the patterns ...

Use your favorite editor to modify the contents of the gitosis configuration file on your local machine (changes will be pushed back to server in next step):

cd gitosis-admin
$EDITOR gitosis.conf

Adding a new project to the repository

Here is an example of the gitosis configuration file you cloned before. Here it contains the default gitosis entry, and a new project entry:


[group team]
writable = testproject
members = keyfilename

[group gitosis-admin]
writable = gitosis-admin
members = keyfilename

Warning: Be careful with this step, if you mess with the gitosis-admin group you could lock yourself out of the repository.

keyfilename is the name of the public key without .pub extension. Note: This is not necessarily the same filename as initialKeyFileName, but the one in the /keydir folder of gitosis-admin.

After you're done editing, save the file, and commit it back to the server.

git commit -a -m "Added a new project"
git push

Any future projects will be added the same way.

Committing to the first project

To commit the project you just created, initiate a new git project, add files to it, commit it, then push it to your repository with the name you set up in gitosis config file.

mkdir testproject
cd testproject
git init
touch a_text_file.txt
git add .
git commit -a -m "Initial import"
git remote add origin
git push origin master

The project should be committed!

(i) If not, please check your /srv/gitosis/.ssh/authorized_keys file, if that one contains your correct public key!

Adding users

First, gather their public SSH keys, which I'll call "" and "", and drop them into keydir/ of your local gitosis-admin repository. Second, edit gitosis.conf and add them to the "members" list.

cd gitosis-admin
cp ~/ keydir/
cp ~/ keydir/
git add keydir/ keydir/

Note that the key filename must have a ".pub" extension.

gitosis.conf changes:

 [group team]
  writable = testproject
- members =
+ members = kakashi naruto

Commit and push:

git commit -a -m "Granted Kakashi and Naruto commit rights to testproject"
git push

That's it. Kakashi and Naruto can now clone the testproject repository like so:

git clone

Kakashi and Naruto will also have commit rights.

The web browsing interface

Server will need a web server so I recommend you to install Apache with support for php. Once ViewGit can be linked to GeSHI, I also recommend you installing the php-geshi package:

sudo apt-get install apache2 libapache2-mod-php5 php-geshi

(i) For more extended Apache installation we recommend you reading a dedicated page like this ApacheMySQLPHP.

Once done, /var/www/ directory will be created. Go there and clone the latest git version of !ViewGIT:

cd /var/www
sudo git clone
sudo chown -vR www-data:www-data viewgit

After finishing this operation, use your favorite editor to edit the config file for ViewGit:

cd /var/www/viewgit/inc
sudo cp config.php localconfig.php
sudo chown www-data:www-data localconfig.php
sudo $EDITOR localconfig.php

What follows is an example of the ViewGit localconfig.php with !GeSHI and the testproject.git we created.

Although there are two things to note :

* $conf['projects'] will be an array that you explicitly define repositories that viewgit will display. * $conf['projects_glob'] is an array of file-system path patterns that gitweb will use to search for *.git directories. This provides easier inclusion of all your repositories (although it may ignore any gitweb directives in your gitosis.conf)

Both $conf['projects'] and $conf['projects_glob'] will be used to decide what projects to display. So in the following example if you actually created the testproject example in the previous steps, it will show up twice.

$conf['projects'] = array(
        'testproject' => array('repo' => '/srv/gitosis/repositories/testproject.git/'),
// If set, contains an array of globs/wildcards where to include projects.
// Use this if you have a lot of projects under a directory.
$conf['projects_glob'] = array('/srv/gitosis/repositories/*.git');

// Where git is. Default is to search from PATH, but you can use an absolute
// path as well.
$conf['git'] = 'git';

$conf['datetime'] = '%Y-%m-%d %H:%M';

// More complete format for commit page
$conf['datetime_full'] = '%Y-%m-%d %H:%M:%S';

// Maximum length of commit message's first line to show
$conf['commit_message_maxlen'] = 50;

// Maximum number of shortlog entries to show on the summary page
$conf['summary_shortlog'] = 30;

// Maximum number of tags to show on the summary page
$conf['summary_tags'] = 10;

// Whether to show remote labels on shortlog
$conf['shortlog_remote_labels'] = false;

// Allow checking out projects via "git clone"
$conf['allow_checkout'] = true;

// If set, this function is used to obfuscate e-mail addresses of authors/committers
// The 'obfuscate_mail' function simply replaces @ with ' at ' and . with ' dot '
//$conf['mail_filter'] = 'obfuscate_mail';
//$conf['mail_filter'] = create_function('$mail', 'return str_rot13(strtoupper($mail));');

// Whether to use GeSHi for source highlighting
$conf['geshi'] = true;

// Path to geshi.php
$conf['geshi_path'] = 'inc/geshi/geshi.php';
$conf['geshi_path'] = '/usr/share/php-geshi/geshi.php'; // Path on Debian

// Use line numbers in geshi?
// Setting this to "false" disables line numbers
// Using a value of 0 will enable "NORMAL" geshi line numbers
// Using values of 1 or more will enable "FANCY" geshi line numbers
$conf['geshi_line_numbers'] = 5;

// RSS time to live (how often clients should update the feed), in minutes.
$conf['rss_ttl'] = 10;

// RSS: Maximum number of items in feed
$conf['rss_max_items'] = 30;

// RSS item format. Allowed formatting:
$conf['rss_item_title'] = '{SHORTLOG} ({AUTHOR})';
$conf['rss_item_description'] = '<pre>{LOG}</pre><b>{AUTHOR}</b> &lt;{AUTHOR_MAIL}&gt;<br /><pre>{DIFFSTAT}</pre>';

$conf['debug'] = false;

// Includes a small link to the ViewGit homepage on each page
$conf['ad'] = false;

Now you should be able to browse your Git repository by going to http://localhost/viewgit/ if you got problems on accessing repositories, add your web server user to the same group gitosis user is:

adduser www-data gitosis

Making available public cloning of the projects

To make available public access for cloning of the projects, you have to set up git-daemon. git-daemon is a service which runs on port 9418 and handles public requests for project cloning. git-daemon comes together with git-core so no additional installation is required.

To make this service easier to administrate, here is an init script to start and stop the daemon.

It is, however, easier to make git a subservice of xinetd, by editing /etc/xinetd.d/git and changing disable=no}} to {{{disable=yes.

Create the git-daemon init script

sudo $EDITOR /etc/init.d/git-daemon

paste the following

# Taken from here:

DESC="the git daemon"
DAEMON_OPTS="--base-path=/srv/gitosis/repositories --export-all --verbose --syslog --detach --pid-file=$PIDFILE --user=gitosis --group=nogroup"

test -x $DAEMON || exit 0

[ -r /etc/default/git-daemon ] && . /etc/default/git-daemon

. /lib/lsb/init-functions

start_git() {
  start-stop-daemon --start --quiet --pidfile $PIDFILE \
    --startas $DAEMON -- $DAEMON_OPTS

stop_git() {
  start-stop-daemon --stop --quiet --pidfile $PIDFILE
  rm -f $PIDFILE

status_git() {
  start-stop-daemon --stop --test --quiet --pidfile $PIDFILE >/dev/null 2>&1

case "$1" in
  log_begin_msg "Starting $DESC"
  log_end_msg 0
  log_begin_msg "Stopping $DESC"
  log_end_msg 0
  log_begin_msg "Testing $DESC: "
  if status_git
    log_success_msg "Running"
    exit 0
    log_failure_msg "Not running"
    exit 1
  log_begin_msg "Restarting $DESC"
  sleep 1
  log_end_msg 0
  echo "Usage: $0 {start|stop|restart|force-reload|status}" >&2
  exit 1

exit 0

To make it usable, and make possible it's automatic startup on server boot change its permissions and update-rc.d

sudo chmod +x /etc/init.d/git-daemon
sudo update-rc.d git-daemon defaults

The daemon can be controlled in the following manner :

Pre Karmic :

sudo /etc/init.d/git-daemon start
sudo /etc/init.d/git-daemon stop
sudo /etc/init.d/git-daemon restart
sudo /etc/init.d/git-daemon force-reload

Ubuntu 9.10 and later :

sudo service git-daemon start
sudo service git-daemon stop
sudo service git-daemon restart
sudo service git-daemon force-reload

Git (last edited 2012-11-01 14:56:02 by intacc)