Git setup
Server setup | |
← Previous | Next → |
Scanner | Samba |
Git is a distributed version control system. I use Gitolite as a centralised git server. While the repositories reside on the server, administration is done by user@desktop
on the desktop machine. Gitweb is used to give read-only access to some, but not all, repositories. Gitweb will only show repos that have an owner
, desc
, or category
line in gitolite.conf
; other repos will be hidden from Gitweb.
Install Git and Gitolite
Unfortunately, only Gitolite v2 is in the Ubuntu repositories, so I have to download Gitolite from source.
- Install what you can from the Ubuntu repos
root@server:~# aptitude install git git-doc gitweb highlight
- Create the
git
user:
root@server:~# adduser --disabled-password git root@server:~# su - git git@server:~$ mkdir -p bin git@server:~$ logout
- (Logout then log back in again so that the
.profile
script adds~/bin
to thePATH
environment variable.)
- Add git to the list of users allowed to SSH into the server. Modify
/etc/ssh/sshd_config
so theAllowUsers
line includes git:
# Only allow access by certain users AllowUsers user1 user2 git
- then restart sshd:
root@server:~# service ssh restart
- Back on the desktop machine, create a public RSA key for user@desktop (the administrator user Gitolite):
user@desktop:~# ssh-keygen -t rsa
- On the server, copy the key to the git user's home:
root@server:~# scp user@desktop:~/.ssh/id_rsa.pub /home/git/user.pub
- Download and install Gitolite
root@server:~# su - git git@server:~$ git clone git://github.com/sitaramc/gitolite git@server:~$ gitolite/install -to bin git@server:~$ gitolite setup -pk user.pub
- On the desktop machine, clone and modify the
gitolite-admin
repo as you see fit.
user@desktop:~$ git clone git@server:gitolite-admin user@desktop:~$ cd gitolite
Install and setup git-daemon
Git-daemon allows low-resource anonymous cloning of repositories
- Install
git-daemon
root@server:~# aptitude install git-daemon-run
- Modify
/etc/sv/git-daemon/run
, modifying the user group and the paths (the last two lines):
#!/bin/sh exec 2>&1 echo 'git-daemon starting.' exec chpst -ugitdaemon:git \ "$(git --exec-path)"/git-daemon --verbose \ --base-path=/home/git/repositories/ /home/git/repositories/
- Restart git-daemon:
root@server:~# sv restart git-daemon
- For each repo you want accessible by git-daemon, add the
R = daemon
to the repo's config ingitolite.conf
repo testing RW+ = @all R = daemon
- then commit and push the changed admin file.
Setup gitweb
- Modify the
UMASK
setting (to allow gitweb to read the repos) and theGIT_CONFIG_KEYS
setting (to allow Gitolite to set gitweb descriptions) in/home/git/.gitolite.rc
:
UMASK => 0027, GIT_CONFIG_KEYS => 'gitweb\..*',
- Modify
/etc/gitweb.conf
to include:
$projectroot = "/home/git/repositories"; $projects_list = "/home/git/projects.list"; # Allow syntax highlighting $feature{'highlight'}{'default'} = [1];
- Add Apache's user to the git group:
root@server:~# usermod -a -G git www-data
- Check the contents of
/etc/apache2/conf-available/gitweb.conf
:
Alias /gitweb /usr/share/gitweb <Directory /usr/share/gitweb> Options +FollowSymLinks +ExecCGI AddHandler cgi-script .cgi </Directory>
- They should be OK without modification. There's no need to update
/etc/apache2/sites-available/site.domain.tld
.
- Enable the gitweb config and reload Apache:
root@server:~# a2enconf gitweb root@server:~# service apache2 reload
- You should be able to view your repos from
http://site.domain.tld/gitweb/
Gitweb in its own virtual host
Create the file /etc/apache2/sites-available/git.domain.tld
:
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /usr/share/gitweb ServerName git.domain.tld ServerAlias git Alias /gitweb /usr/share/gitweb # Defined in /etc/apache2/conf.d/gitweb # <Directory /usr/share/gitweb> # Options FollowSymLinks +ExecCGI # AddHandler cgi-script .cgi # </Directory> RewriteEngine on # make the front page an internal rewrite to the gitweb script RewriteRule ^/$ /gitweb.cgi # make access for "dumb clients" work RewriteRule ^/(.*\.git/(?!/?(HEAD|info|objects|refs)).*)?$ \ /gitweb.cgi%{REQUEST_URI} [L,PT] # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog /var/log/apache2/git.domain.tld.access.log combined ErrorLog /var/log/apache2/error.log ServerSignature Off </VirtualHost>
- Enable the site:
root@server:~# a2ensite git.domain.tld root@server:~# service apache2 reload
Changing the default template
Modify the standard template if you want changes to affect all new repos created. Do this, for instance, if you want to use Keybase.io to automatically sign all commits by adding the file hooks/pre-commit
:
#!/bin/sh # Run Keybase to sign the commit keybase dir sign -p git git add SIGNED.md
Server side
Modify the contents of /usr/share/git-core/templates/
as you see fit, such as adding the commit hook above.
This should affect all repos created with Gitolite.
Client side
Copy /usr/share/git-core/templates/
to somewhere local, such as ~/.git_template
.
Modify the contents as you see fit.
Tell Git to use this template rather than the default one:
user@desktop:~$ git config --global init.templatedir '~/.git_template'
This should affect all new repos created on the client, outside of Gitolote.
Import prior repos
- Copy them to
/home/git/repositories
- Make them git-writable and gitweb-readable:
root@server:~# chown -R git:git /home/git/repositories root@server:~# chmod -R g+rX ~/repositories/
- On the desktop, modify
gitolite-admin/conf/gitolite.conf
repo repo1 RW+ = user1
- Manually add any existing gitweb descriptions to the desktop's
gitolite-admin/conf/gitolite.conf
file. (You can find the descriptions in/home/git/repositories/existing-repo.git/description
- Commit and push the changes
user@desktop:~/gitolite-admin$ git commit -a -m "Added imported repos" user@desktop:~/gitolite-admin$ git push
Common tasks
- To clone a repo:
git clone git@git.domain.tld:repo.git
- Create a new repo, first create its entry in
gitolite-admin/conf/gitolite.conf
and push the changes. This will create an empty repo on the server. Then clone it on the client machine, ignoring the message about cloning an empty repo.
- To import a repo into Github, use the Github "import repository" functionality, using the url
git://git.domain.tld/repo.git
. Note that you may need to remove files larger than 100Mb, following Github's instructions.
- To add Github as a remote for a repo,
git remote add github git@github.com:neilnjae/foo.git git push github master
- (Use this technique to import a repo on Github if the import doesn't work: create an empty repo on Github, add it as another remote for the existing repo, then push the changes to Github.)
See also
Gitolite 3 docs:
- Gitolite quick install guide
- Adding users in Gitolite
- Creating new repos in Gitolite
- Importing existing repos into Gitolite
Installation walkthroughs: