Instalando e Configurando o Git + Gitolite + GitWeb + Git-daemon + GitStats + Debian Squeeze

Git é um sistema de controle de versão distribuído com ênfase em velocidade. O Git foi inicialmente projetado e desenvolvido por Linus Torvalds para o desenvolvimento do kernel Linux.

Cada diretório de trabalho Git é um repositório com todos os históricos e habilidade total de controle das revisões, não dependente de acesso a uma rede ou a um servidor central.

A manutenção de software do Git é atualmente supervisionada por Junio Hamano. É distribuído sob os termos da versão 2 da GNU General Public License.

Informações sobre o Git

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Valores utilizados:

  1. Ip do servidor: 10.101.0.11
  2. Ip do cliente: 10.101.0.1

Vamos instalar o core do git no servidor.

aptitude install git-core git-doc -y

Agora vamos instalar o git no cliente

aptitude install git-core git-doc -y

Agora vamos configurar alguns valores globais do git, devemos configurar no cliente.

Vamos configurar o nome do autor dos códigos

git config --global user.name "Douglas Quintiliano dos Santos"

Agora vamos configurar o email do autor dos códigos

git config --global user.email douglas@douglasqsantos.com.br

Agora vamos acertar as variáveis para deixar alguns valores do nosso git coloridos, facilita a visualização.

git config --global color.status auto
git config --global color.branch auto

Podemos visualizar as variáveis globais que configuramos para o git da seguinte forma

git config -l
user.name=Douglas Quintiliano dos Santos
user.email=douglas@douglasqsantos.com.br
color.status=auto
color.branch=auto

Agora no cliente vamos gerar as chaves de ssh tipo rsa que vai ser o nosso acesso ao servidor git

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/douglas/.ssh/id_rsa): #ENTER
Enter passphrase (empty for no passphrase): #ENTER
Enter same passphrase again: #ENTER
Your identification has been saved in /home/douglas/.ssh/id_rsa.
Your public key has been saved in /home/douglas/.ssh/id_rsa.pub.
The key fingerprint is:
c6:55:64:a9:a6:cd:1c:c6:dd:43:c6:15:83:41:2e:04 douglas@ddouglasqsantos.com.br
The key's randomart image is:
+--[ RSA 2048]----+
|         E.o=====o+o|
|          .oo.+ .|
|         ..+ =   |
|       . .* o o  |
|        SB .   . |
|       .. +      |
|                 |
|                 |
|                 |
+-----------------+

Agora vamos copiar a chave do cliente para o servidor git para importarmos com o gitolite

scp ~/.ssh/id_rsa.pub 10.101.0.11:/tmp/douglas.pub
douglas@10.101.0.11's password: 
id_rsa.pub                                    100%  407     0.4KB/s   00:00  

Agora no servidor vamos configurar o gitolite

Agora vamos criar o grupo para o gitolite

groupadd gitolite

Agora vamos criar o usuário para o gitolite

adduser --disabled-password --home /home/gitolite --ingroup gitolite gitolite
Adicionando usuário 'gitolite' ...
Adicionando novo usuário 'gitolite' (1001) com grupo 'gitolite' ...
Criando diretório pessoal '/home/gitolite' ...
Copiando arquivos de '/etc/skel' ...
Modificando as informações de usuário para gitolite
Informe o novo valor ou pressione ENTER para aceitar o padrão
  Nome Completo []: #ENTER
  Número da Sala []: #ENTER
  Fone de Trabalho []: #ENTER
  Fone Doméstico []: #ENTER
  Outro []: #ENTER
A informação está correta? [S/n] s

Agora vamos instalar o gitolite

aptitude install gitolite -y

Agora vamos inserir o gitolite no grupo do apache

usermod -a -G gitolite www-data

Agora vamos configurar o gitolite

Vamos abrir uma sessão com o gitolite

su - gitolite

Vamos acertar as variáveis do nosso git

git config --global user.name "Douglas Quintiliano dos Santos"
git config --global user.email douglas@douglasqsantos.com.br
git config --global color.status auto
git config --global color.branch auto

Agora vamos carregar a chave que criamos no cliente para o gitolite

gl-setup /tmp/douglas.pub 
creating gitolite-admin...
Initialized empty Git repository in /home/gitolite/repositories/gitolite-admin.git/
creating testing...
Initialized empty Git repository in /home/gitolite/repositories/testing.git/
[master (root-commit) d5ac570] start
 2 files changed, 6 insertions(+), 0 deletions(-)
 create mode 100644 conf/gitolite.conf
 create mode 100644 keydir/douglas.pub

Como pode ser notado a chave foi carregada e foram criados dois repositórios um que administramos as configurações do gitolite e um de teste.

Agora precisamos acertar o arquivo que controla as permissões dos repositórios.

sed -i 's/$REPO_UMASK = 0077;/# $REPO_UMASK = 0077;/g' /home/gitolite/.gitolite.rc
sed -i 's/# $REPO_UMASK = 0027;/$REPO_UMASK = 0027;/g' /home/gitolite/.gitolite.rc

Agora vamos acertar as permissões de nossos repositórios

chmod g+r /home/gitolite/projects.list
chmod -R g+rx /home/gitolite/repositories

Agora vamos sair da sessão do gitolite

exit

Vamos criar o diretório e acessar o diretório para armazenarmos os repositórios no cliente

mkdir -p /home/douglas/repositorios
cd /home/douglas/repositorios

Agora na maquina cliente vamos clonar o reposiorio de administração

git clone gitolite@10.101.0.11:gitolite-admin.git
Cloning into gitolite-admin...
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (4/4), done.
Receiving objects: 100% (6/6), 754 bytes, done.
remote: Total 6 (delta 0), reused 0 (delta 0)

Ainda no cliente vamos efetuar algumas configurações no repositório de adm, deixe o arquivo como abaixo.

vim gitolite-admin/conf/gitolite.conf
[...]
     repo    gitolite-admin

repo    testing
      RW+     =   @all
      R       =   daemon
testing "Owner" = "Repositório Teste"

Precisamos efetuar essa alteração para que o gitweb possa ler o repositório ;)

Agora vamos acessar o nosso repositório para adicionarmos as novas configurações do repositório

cd /home/douglas/repositorios/gitolite-admin/

Agora vamos adicionar o nosso arquivo para ser enviado ao repositório

git add conf/gitolite.conf

Agora vamos confirmar a nossa atualização.

git commit -m "Alterando configuração para gitweb e git-daemon"
[master ee806c1] Alterando configuração para gitweb e git-daemon
 1 files changed, 2 insertions(+), 0 deletions(-)

Agora vamos enviar a alteração para o repositório

git push
Counting objects: 7, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 461 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Already on 'master'
To gitolite@10.101.0.11:gitolite-admin.git
   8be6892..ee806c1  master -> master

Agora vamos voltar um diretório para obtermos uma cópia do repositório de teste

cd ..

Agora vamos clonar o repositório testing.git no cliente

git clone gitolite@10.101.0.11:testing.git
Cloning into testing...
warning: You appear to have cloned an empty repository.

Agora vamos acesar o nosso repositório e criar um arquivo de teste

cd testing
echo "README" > README

Agora vamos marcar esse arquivo para ser enviado ao repositório

git add README

Agora vamos confirmar a nossa atualização.

git commit -m "Adicionando README"
[master (root-commit) d8dcf6b] Added README
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README

Agora vamos enviar para o servidor

git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 236 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To gitolite@10.101.0.11:testing.git
 * [new branch]      master -> master

Agora vamos instalar o gitweb no servidor ;)

aptitude install highlight gitweb apache2 -y

Agora precisamos fazer alguns acertos sobre a localização dos repositórios no servidor para que o gitweb possa mapeá-los

sed -i 's,$projectroot = "/var/cache/git";,$projectroot = "/home/gitolite/repositories";,g' /etc/gitweb.conf
sed -i 's,$projects_list = $projectroot;,$projects_list = "/home/gitolite/projects.list";,g' /etc/gitweb.conf

Agora já podemos acessar os nossos repositórios em http://10.101.0.11/gitweb

Agora vamos configurar o git-daemon

aptitude install git-daemon-run -y

Vamos fazer um backup do arquivo do daemon

cp -Rfa /etc/sv/git-daemon/run{,.bkp}

Agora vamos acertar o script de inicilização pois os repositório não estão no local padrão, deixe o arquivo como abaixo.

vim /etc/sv/git-daemon/run
#!/bin/sh
exec 2>&1
echo 'git-daemon starting.'
exec chpst -ugitdaemon:gitolite \
  "$(git --exec-path)"/git-daemon --verbose --base-path=/home/gitolite/repositories /home/gitolite/repositories

Agora vamos inicializar o daemon

sv restart git-daemon
ok: run: git-daemon: (pid 2810) 0s

Agora já podemos utilizar o repositório via git, no cliente vamos fazer um teste.

git clone git://10.101.0.11/testing.git
Cloning into testing...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Receiving objects: 100% (3/3), done.

Agora vamos ajustar as urls do gitweb, quando acessamos por exemplo o READ acessamos http://10.101.0.11/gitweb/testing.git?a=blob_plain;f=gitweb/README vamos ajustar para que ele tenha as urls mais simples ;)

Vamos comentar as linhas do gitweb no servidor.

vim /etc/apache2/conf.d/gitweb
#Alias /gitweb /usr/share/gitweb
#
#<Directory /usr/share/gitweb>
#  Options FollowSymLinks +ExecCGI
#  AddHandler cgi-script .cgi
#</Directory>

Agora vamos criar um virtual host para o nosso git

vim /etc/apache2/sites-available/gitweb
<VirtualHost *:80>
    ServerName gitweb.douglasqsantos.com.br
    ServerAdmin webmaster@douglasqsantos.com.br
    DocumentRoot /usr/share/gitweb

    <Directory /usr/share/gitweb>
        Options FollowSymLinks ExecCGI
        AddHandler cgi-script cgi
        RewriteEngine On
        RewriteCond %{REQUEST_FILENAME} -f
        RewriteCond %{REQUEST_FILENAME} -d
        RewriteRule ^.* /index.cgi/$0 [L,PT]
    </Directory>
</VirtualHost>

Agora vamos carregar o nosso virtualhost, e desabilitar o virtual host default

a2ensite gitweb
a2dissite default

Agora precisamos adicionar algumas linhas no final do arquivo /etc/gitweb.conf

vim /etc/gitweb.conf
[...]
#Adicione no final do arquivo
$feature{'pathinfo'}{'default'} = [1];
$projects_list_description_width = 100;
$feature{'blame'}{'default'} = [1];
$feature{'blame'}{'override'} = 1;

$feature{'pickaxe'}{'default'} = [1];
$feature{'pickaxe'}{'override'} = 1;

$feature{'snapshot'}{'default'} = [1];
$feature{'snapshot'}{'override'} = 1;

$feature{'search'}{'default'} = [1];

$feature{'grep'}{'default'} = [1];
$feature{'grep'}{'override'} = 1;

$feature{'show-sizes'}{'default'} = [1];
$feature{'show-sizes'}{'override'} = 1;

$feature{'avatar'}{'default'} = ['gravatar'];
$feature{'avatar'}{'override'} = 1;

$feature{'highlight'}{'default'} = [1];
$feature{'highlight'}{'override'} = 1;

Eu achei um tema bem bacana para o gitweb, vou mostar como instalar ele.

Vamos fazer backup de alguns arquivos do gitweb

cd /usr/share/gitweb
mv gitweb.js gitweb.js.old
mv gitweb.css gitweb.css.old

Agora vamos obter o tema

cd /tmp
wget -c http://wiki.douglasqsantos.com.br/Downloads/versionamento/gitweb-tema.tar.gz

Agora vamos desempacotar ele e copiar os arquivos para o diretório do gitweb

tar -xzvf gitweb-tema.tar.gz

Agora vamos copiar os arquivos para o diretório do gitweb

cp gitweb.css gitweb.js /usr/share/gitweb/

Vamos carregar o modulo rewrite

a2enmod rewrite

Agora vamos reiniciar o apache

/etc/init.d/apache2 restart

Caso tenha acesso ao servidor dns insira um registro do tipo A e direcione para 10.101.0.11, caso não tenha insira uma entrada no /etc/hosts 10.101.0.11 gitweb.douglasqsantos.com.br que já vai ser possivel acessar ;)

Agora é so acessar http://gitweb.douglasqsantos.com.br

Agora vamos instalar o gitstats ele pode ser instalado no cliente mesmo, pois precisamos do clone do repositório para gerar as statistias ;)

aptitude install gitstats -y

Para gerar o relatório precisamos de um clone, eu vou clonar o repositório teste no /srv/repositorios do servidor, como esse diretório ainda não existe vou criar ele e acessar ele

mkdir -p /srv/repositorios
cd /srv/repositorios

Agora vamos clonar o repositório testing para gerarmos statisticas

git clone git://10.101.0.11/testing.git
Cloning into testing...
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), 235 bytes, done.
remote: Total 3 (delta 0), reused 0 (delta 0)

Agora vamos criar um virtual host para as nossas statisticas

vim /etc/apache2/sites-available/gitstats
<VirtualHost *:80>
        ServerName gitstats.douglasqsantos.com.br
        ServerAdmin webmaster@localhost

        DocumentRoot /var/www/gitstats
        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        <Directory /var/www/gitstats>
                Options Indexes FollowSymLinks MultiViews
                AllowOverride None
                Order allow,deny
                allow from all
        </Directory>
        ErrorLog ${APACHE_LOG_DIR}/error.log
        LogLevel warn        
        CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Agora vamos habilitar o nosso virtual host

a2ensite gitstats

Vamos remover o index.html do site default do apache

rm -rf /var/www/index.html

Agora vamos gerar as statisticas do repositório testing

gitstats /srv/repositorios/testing/ /var/www/gitstats/testing

Agora vamos reiniciar o apache

/etc/init.d/apache2 restart

Caso tenha acesso ao servidor dns insira um registro do tipo A e direcione para 10.101.0.11, caso não tenha insira uma entrada no /etc/hosts 10.101.0.11 gitstats.douglasqsantos.com.br que já vai ser possivel acessar ;)

Agora é so acessar http://gitstats.douglasqsantos.com.br/testing

Agora vamos ver como adicionamos um novo repositório

No cliente vamos acessar o repositório de administração do git

cd ~/repositorios/gitolite-admin/

Agora vamos acrescentar algumas linhas a respeito de nosso novo repositório, vou criar um repositório com o nome de php

vim conf/gitolite.conf
        repo    gitolite-admin
                RW+     =   douglas

        repo    php
                RW+     =  douglas
                R       =   daemon
php "Owner"     = "Repositório php"


        repo    testing
                RW+     =   @all
                R       =   daemon
testing "Owner" = "Repositório Teste"

Agora vamos marcar ele para ser enviado ao servidor.

git add conf/gitolite.conf

Agora vamos configurar que vamos enviar ele para o repositório

git commit -m "Criação do repositório php"

Agora vamos enviar o arquivo para o servidor git

git push
Counting objects: 7, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 439 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Already on 'master'
remote: creating php...
remote: Initialized empty Git repository in /home/gitolite/repositories/php.git/
To gitolite@10.101.0.11:gitolite-admin.git
   e9922e3..edfc1e1  master -> master

Agora no servidor precisamos reiniciar o daemon do git

sv restart git-daemon

Como pode ser notado o gitolite já criou e iniciou o nosso repositório.

Agora vamos clonar ele na ainda na maquina cliente

Vamos acessar a raiz dos repositórios

cd ~/repositorios/

Agora vamos clonar o nosso repositório

git clone gitolite@10.101.0.11:php.git
Cloning into php...
warning: You appear to have cloned an empty repository.

Agora vamos criar um arquivo de teste em nosso repositório

cd php
echo "<?php phpinfo(); ?>" > phpinfo.php

Agora vamos adicionar ele para ser enviado ao repositório

git add phpinfo.php 

Agora vamos confirmar que o arquivo deve ser enviado ao repositório

git commit -m "Adicionando phpinfo.php"
[master (root-commit) 345e9ad] Adicionando phpinfo.php
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 phpinfo.php

Agora vamos enviar para o repositório

git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 256 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To gitolite@192.168.1.10:php.git
 * [new branch]      master -> master

O nosso repositório já pode ser consultado em http://gitweb.douglasqsantos.com.br

Agora vamos clonar o nosso repositório php no servidor para gerarmos as estatísticas

git clone git://10.101.10.11/php.git /srv/repositorios/php

Agora vamos gerar as estatísticas do nosso novo repositório

gitstats /srv/repositorios/php/ /var/www/gitstats/php

Agora podemos acessar os relatórios em http://gitstats.douglasqsantos.com.br/php

Agora vamos ver como adicionamos mais usuários para acesso ao repositório

Vamos gerar a chave rsa

ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/douglas/.ssh/id_rsa): 
Created directory '/home/douglas/.ssh'.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/douglas/.ssh/id_rsa.
Your public key has been saved in /home/douglas/.ssh/id_rsa.pub.
The key fingerprint is:
e0:0c:df:8e:9e:f6:fb:70:21:26:37:d9:71:57:a7:1d douglas@debian
The key's randomart image is:
+--[ RSA 2048]----+
|               Eo|
|               +o|
|    . .   . . o .|
|     = o o o .   |
|      = S o      |
|       * o .     |
|      . o .      |
|     ... o       |
|     .o.oo.      |
+-----------------+

Agora vamos copiar para o cliente que tem os repositório adm

scp /home/douglas/.ssh/id_rsa.pub 10.101.0.1:/tmp/douglas.debian.pub

Agora no cliente que tem os repositórios vamos copiar a chave do tmp para ~/repositorios/gitolite-admin/keydir

cp /tmp/douglas.debian.pub ~/repositorios/gitolite-admin/keydir/

Agora vamos marcar a chave para ser enviada para o repositório

cd ~/repositorios/gitolite-admin
git add keydir/douglas.debian.pub

Agora vamos confirmar a chave que vai ser enviada para o repositório

git commit -m "Adicionando chave"
[master 9ef830c] Adicionando chave
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 keydir/douglas.debian.pub

Agora vamos enviar a chave para o repositório

git push
Counting objects: 6, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 700 bytes, done.
Total 4 (delta 0), reused 0 (delta 0)
remote: Already on 'master'
remote: 
remote:     ''''''* WARNING ''''''*
remote:         the following users (pubkey files in parens) do not appear in the config file:
remote: douglas.debian(douglas.debian.pub)
To gitolite@192.168.1.10:gitolite-admin.git
   195249c..9ef830c  master -> master

Note que apareceu uma mensagem avisando que o douglas.debian não está em nenhum repositório, ele não tem configuração no gitolite.conf, vamos adicionar ele no repositório php.

vim conf/gitolite.conf 
        repo    gitolite-admin
                RW+     =   douglas

        repo    php
                RW+     =  douglas
                RW      =  douglas.debian
                R       =   daemon


php "Owner"     = "Repositório php"

        repo    testing
                RW+     =   @all
                R       =   daemon
testing "Owner" = "Repositório Teste"

Agora vamos marcar o arquivo para ser enviado ao repositório

git add conf/gitolite.conf

Agora vamos configurar ele no repositório

git commit -m "Adicionando usuario ao repositorio php"
[master 97a8c24] Adicionando usuario ao repositorio php
 1 files changed, 2 insertions(+), 0 deletions(-)

Agora vamos enviar para o repositório

git push
Counting objects: 7, done.
Delta compression using up to 6 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (4/4), 407 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
remote: Already on 'master'
To gitolite@10.101.0.11:gitolite-admin.git
   9ef830c..97a8c24  master -> master

Agora com o novo cliente que importamos a chave vamos criar o diretório de repositórios e vamos clonar o repositório php que o cliente tem acesso.

mkdir ~/repositorios
cd ~/repositorios

Agora vamos clonar

git clone gitolite@10.101.0.11:php.git
Cloning into php...
The authenticity of host '192.168.1.10 (192.168.1.10)' can't be established.
RSA key fingerprint is 34:64:a3:f5:8f:ca:2d:30:aa:df:f8:84:38:2f:e2:3d.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.1.10' (RSA) to the list of known hosts.
remote: Counting objects: 3, done.
Receiving objects: 100% (3/3), 255 bytes, done.
remote: Total 3 (delta 0), reused 0 (delta 0)

Vamos acertar as variáveis do nosso git

git config --global user.name "Douglas Debian"
git config --global user.email douglas@douglasqsantos.com.br
git config --global color.status auto
git config --global color.branch auto

Agora vamos acessar o repositório e vamos enviar um arquivo de teste

cd php
echo "<?php echo 'Douglas'; ?>" > douglas.php

Agora vamos marcar o pacote para ser enviado para o repositório

git add douglas.php

Agora vamos confirmar que os arquivos devem ser enviados para o repositório

git commit -m "Teste de permissão"
[master e635eb8] Teste de permissão
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 douglas.php

Agora vamos enviar para o repositório

git push
Counting objects: 4, done.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 316 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To gitolite@192.168.1.10:php.git
   345e9ad..e635eb8  master -> master

Agora podemos acessar http://gitweb.douglasqsantos.com.br para visualizar os arquivos ;)

Agora no primeiro cliente vamos atualizar os arquivos que foram enviados para o repositório

Referências