Hosting Your Own Git Repository on fedora 12

This tutorial will covering common feature in git repository

  • commiting via ssh
  • Enable gitweb for web access
  • cloning anonymously using the Git protocol

Install git, git-daemon

# yum -y install git git-daemon gitweb

Create a git user/group

# useradd -U -d /var/cache/git -s /usr/libexec/git-core/git-shell git

Make sure the permissions of the directory are correct

# cd /var/cache
# chown -R git:git git
# chmod 755 git

We’ll be using SSH keys for authenication, so collect the public keys of all the users who need commit access. Then, put the public keys into the right place

# cd /var/cache/git
# mkdir .ssh
# chmod 700 .ssh
# touch .ssh/authorized_keys
# chmod 600 .ssh/authorized_keys
(Put the public keys into authorized_keys, one per line)
# chown -R git:git .ssh/


create init script for git

# vi /etc/init.d/git
#!/bin/sh
#
#   Startup/shutdown script for Git Daemon
#
#   Linux chkconfig stuff:
#
#   chkconfig: 345 56 10
#   description: Startup/shutdown script for Git Daemon
#
. /etc/init.d/functions

DAEMON=/usr/libexec/git-core/git-daemon
ARGS='--base-path=/var/cache/git --detach --syslog --export-all --user=git --group=git'

prog=git-daemon

start () {
 echo -n $"Starting $prog: "

 # start daemon
 daemon $DAEMON $ARGS
 RETVAL=$?
 echo
 [ $RETVAL = 0 ] && touch /var/lock/git-daemon
 return $RETVAL
}

stop () {
 # stop daemon
 echo -n $"Stopping $prog: "
 killproc $DAEMON
 RETVAL=$?
 echo
 [ $RETVAL = 0 ] && rm -f /var/lock/git-daemon
}

restart() {
 stop
 start
}

case $1 in
 start)
 start
 ;;
 stop)
 stop
 ;;
 restart)
 restart
 ;;
 status)
 status $DAEMON
 RETVAL=$?
 ;;
 *)

 echo $"Usage: $prog {start|stop|restart|status}"
 exit 3
esac

exit $RETVAL

save it, change permission, add it to runlevel system services then start it

# chmod 755 /etc/init.d/git
# chkconfig git on
# service git start

now, Let’s create a repo for testing

# cd /var/cache/git/
# mkdir test.git
# cd test.git
# git init --bare
# chown -R git:git ../test.git/

Add short description about test.git

# cd /var/cache/git/test.git/
# echo "test test repo" > description
# vi config
[core]
       repositoryformatversion = 0
       filemode = true
       bare = true

[gitweb]
       owner = Your Name

Create a local repo and commit

$ mkdir ~/test
$ cd ~/test && git init
$ echo 'test' > README
$ git add README
$ git commit -m "initial README file"

Before push it into the remote repo, we should create ssh rsa public key(we’ll add it to authorized_keys on the repository server)

$ ssh-keygen -t rsa -C "yourmail@domain.tld"

Now push it into the remote repo

$ git remote add origin git@git.domain.tld:test.git
$ git push origin master

now, setting up web interface for viewing/accessing via web browser. In fedora 12 there’s already git.conf template for apache, we need to change a bit

# vi /etc/httpd/conf.d/git.conf
Alias /git /var/www/git/
RewriteEngine On
RewriteRule ^git$ git/ [R]

<Directory /var/www/git>
       AllowOverride None
       Options +ExecCGI +Indexes +FollowSymLinks
       Order allow,deny
       Allow from all
       DirectoryIndex gitweb.cgi
       SetEnv GITWEB_CONFIG "/etc/gitweb.conf"
       AddHandler cgi-script .cgi
       RewriteEngine On
       RewriteBase /git/
       RewriteRule ^$ gitweb.cgi  [L]
       RewriteCond %{REQUEST_FILENAME} !-f
       RewriteCond %{REQUEST_FILENAME} !-d
       RewriteRule (.*) gitweb.cgi/$1  [QSA,L]
</Directory>

Adjust gitweb.conf in /etc directory

# vi /etc/gitweb.conf
$feature{'blame'}{'default'} = [undef];
$feature{'pickaxe'}{'default'} = [undef];
$feature{'search'}{'default'} = [undef];
$feature{'grep'}{'default'} = 1;
$feature{'snapshot'}{'default'} = ['tgz', 'gzip', 'zip'];
$feature{'snapshot'}{'override'} = 1;

$site_name = "git.domain.tld - Git";
$projectroot = '/var/cache/git/';
$projects_list_description_width = 50;
$git_temp = "/tmp";
$home_text = "indextext.html";
$site_footer = "indexfooter.html";
$projects_list = $projectroot;
$home_link_str = "http://git.domain.tld / git ";
$stylesheet = "/git/gitweb.css";
$logo = "/git/git-logo.png";
$favicon = "/git/git-favicon.png";

$feature{'pathinfo'}{'default'} = [1];
$my_uri = "http://git.domain.tld/git/";
$home_link = "http://git.domain.tld/git/";

restart Apache/httpd

# service httpd restart

That’s it, we have our own shiny git repository 😀

6 Comments

  1. remke

    Very nice …
    I discoverd 1 error:
     
    cd /var/cache
    mkdir .ssh
     
    -> should be: cd /var/cache/git
    mkdir .ssh
    …etc…etc
     
    N.B. the user is created under /var/cache/git :))

    • admin admin

      whoopss, you’re right. thanks for noticing 🙂

  2. Hi, I’m very interested in Linux but Im a Super Newbie and I’m having trouble deciding on the right distribution for me (Havent you heard this a million times?) anyway here is my problem, I need a distribution that can switch between reading and writing in English and Japanese (Japanese Language Support) with out restarting the operating system.

    • admin admin

      well, i’m not so often dealing with locale, but you can change it in /etc/sysconfig/i18n. (depend on system you are using)
      but as far as i know, user must log out then log in again in order to take the change effective.

  3. khzied

    When i want to push with ssh protocol how can i proceed?

  4. khzied

    when i execute:
    git remote add origin git@git.domain.tld:test.git
    a message is appeared :
    fatal: Not a git repository (or any of the parent directories): .git
    What’s my problem?

    Thanks 🙂

Leave a Reply

Your email address will not be published. Required fields are marked *