MeuMySQL Blog is now at http://blog.mdnsolutions.com/.

Tuesday, April 3, 2012

[OFF-TOPIC] O maravilhoso mundo GIT

Olá galera! Quanto tempo desde o último post. Mas isso não significa que eu estava de férias, muito pelo contrário. Venho trabalhando em grandes projetos pessoais e aperfeiçoando várias habilidades tecnicas e que agora quero compartilhar com vocês algumas delas.

Bem, hoje falarei sobre o GIT. Há muitos anos tenho trabalhado com o SUBVERSION e suas ferramentas administrativas tais como o Tortoise, mas desde que resolvi tratar de forma mais seria meu repositório, tal como, controle de branches, tags, manter o versionamento de meus softwares em dia, vi que o modelo CVS não me atenderia muito bem, tendo inclusive algumas decepções (Subversion com merge é terrivel).

Como um bom desenvolverdor, sempre que nos deparamos com um problema qual a primeira atitude a se tomar? Resolvê-lo. Em minhas pesquisas verifiquei que o Git (um sistema de controle de versão distribuído) já vinha sendo utilizado por várias pessoas e empresas e resolvi analisa-la um pouco mais de perto. Entre os vários artigos que li um que recomendo é o do Imasters que da uma ideia comparativa entre GIT e Subversion (leia aqui ou nas referências ao fim do texto).

Uma vez entendido o que é e como funciona sistemas distribuidos vamos ver com funciona na pratica. Você, antes de mais nada pode criar um projeto publico no github (eles possuem uma excelente documentação) ou mesmo em sua máquina local.

Nossa instalação será do git version 1.7 no Ubuntu 11.10. O acesso ao git será via WebDAV ou gitweb.

Instalação do Servidor Git

Estou considerando que você já tenha uma versão do apache instalada em sua máquina. Bem, temos que habilitar o módulo dav em nosso servidor. Para isso vamos criar um link simbólico para esses módulos:

ln -s /etc/apache2/mods-available/dav.load /etc/apache2/mods-enable/dav.load
ln -s /etc/apache2/mods-available/dav_fs.load /etc/apache2/mods-enable/dav_fs.load

Configuração do WebDAV

Criar e editar o arquivo de configuracao git:

touch /etc/apache2/conf.d/git
nano /etc/apache2/conf.d/git

Uma vez criado adicione as seguintes linhas:

<Directory "/var/www/git">
        DAV on
        Options +Indexes +FollowSymLinks
        AllowOverride None
        Order allow,deny
        Allow from all
        AuthType Basic
        AuthName "Private Git Access"
        AuthUserFile /etc/apache2/passwd.git
        Require valid-user
</Directory>

Agora temos que criar um arquivo de senhas para a autenticação do tipo Basic:

htpasswd -c /etc/apache2/passwd.git usuario

Feito isso, criaremos o diretório dos repositórios para testar a autenticação:

mkdir /var/www/git

Reiniciar o Apache e testar o endereço http://localhost/git:

service apache2 restart

Instalação e Configuração do GIT

Instale o git em sua máquina:

apt-get install git

Agora vamos criar um repositório de teste:

mkdir -p /var/www/git/meurepo
cd /var/www/git/meurepo
git --bare init
Initialized empty Git repository in /var/www/git/meurepo/

Teremos que habilitar o hook de post-update para garantir que o nosso recem criado repositório fique sempre atualizado:

cd /var/www/git/meurepo
cp hooks/post-update.sample hooks/post-update
chmod +x hooks/post-update

O conteúdo do hooks/post-update deve ser:

cat hooks/post-update
exec git update-server-info
Executaremos manualmente o hook na primeira vez:
./hooks/post-update

No Ubuntu o usuário Apache é www-data. Vamos dar permissão à ele em nosso diretório:

chown -R www-data:www-data  /var/www/git/meurepo

Reinicie o servidor apache:

service apache2 restart


Instalação e Configuração do gitweb

O Gitweb é a interface web padrão fornecido pelo git e é base para outros scripts tais como cgit, gitosis entre outros. Para instalarmos o gitweb no Server, podemos executar :

apt-get install gitweb

Criar e editar o arquivo gitweb.conf para o Apache:

touch /etc/apache2/conf.d/gitweb
nano /etc/apache2/conf.d/gitweb

Adicione o codigo no arquivo:

Alias /gitweb /var/www/git


<Directory /var/www/git>
  Options +ExecCGI
  AddHandler cgi-script .cgi
  DirectoryIndex gitweb.cgi
</Directory>

Criar arquivo de configuração do gitweb:

cat /etc/gitweb.conf
$projectroot = '/var/www/git/';
@git_base_url_list = ('http://localhost/git')

Reiniciar o Apache e testar o endereço http://localhost/gitweb:

/etc/init.d/httpd restart

Instalação do Cliente Git

No cliente, pode se a mesma máquina ou outra remota, temos que instalar novamente o git .

apt-get  install git

Configuracao mínima do nosso git:

git config --global user.name "My Name"
git config --global user.email "my@email.com"

Configuraremos um usuário e senha para acessar ao servidor git:

nano ~/.netrc

Adicione no arquivo:

machine localhost
login usuario
password senha


Nota para usuários windows


Neste caso é necessário abri seu iniciar > executar e rodar o cmd, dentro dele digite o seguinte comando:


setx HOME %USERPROFILE%


onde %USERPROFILE% é o diretório do seu usuário 'C:/Users/nomedousuario'. Uma vez feito isso, crie um arquivo neste diretório chamado _netrc (uma vez que o Windows não aceita .netrc) e a adicione o mesmo conteúdo usado acima.


Podemos testar o acesso ao servidor via curl:

curl --netrc --location -v http://localhost/git

Clonar o repositório remoto:

git clone http://localhost/git/meurepo
Cloning into meurepo...
warning: You appear to have cloned an empty repository.

Vamos agora adicionar alguma coisa ao nosso  repositório:

cd meurepo
echo hellow world! > teste.txt
git add teste.txt
git commit -m 'Adicionando meu primeiro arquivo'

Enviando os arquivos para o servidor que criamos:

git push origin master
Fetching remote heads...
  refs/
  refs/tags/
  refs/heads/
updating 'refs/heads/master'
  from 0000000000000000000000000000000000000000
  to   87366d467e2dfcc6057bf7d5e112b79ede984861
    sending 3 objects
    done


Bem, é isso galera, espero que esse post seja útil à todos. Assim que eu tiver mais novidades sobre essa maravilhosa ferramenta volto a publicar aqui. Grande abraço!

Referências:

  • http://pt.wikipedia.org/wiki/Git
  • http://pt.wikipedia.org/wiki/Controle_de_versão
  • http://progit.org/
  • http://imasters.com.br/artigo/23356/desenvolvimento/por-que-voce-deveria-mudar-do-subversion-para-git-parte-01


3 comments:

  1. One more tip: to make git ignore mode changes (chmod):

    Just type:

    git config core.filemode false

    ReplyDelete
  2. This comment has been removed by the author.

    ReplyDelete
  3. Caso encontre esse erro:

    error: The requested URL returned error: 401 (curl_result = 22, http_code = 401, sha1 = 7811cde6f0ce2aa534511cc2822a3f52e2e61bbb)
    error: Unable to find 7811cde6f0ce2aa534511cc2822a3f52e2e61bbb under http://git.server.com/projeto.com.git
    Cannot obtain needed commit 7811cde6f0ce2aa534511cc2822a3f52e2e61bbb
    while processing commit 4349a1f37a2f31938431871c651e48b7ff62f215.
    error: Fetch failed.

    Digite git gc no diretorio do projeto no servidor git para corrigi-lo.

    ReplyDelete