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:
- Ip do servidor: 10.101.0.11
- 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-daemonComo 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