Software Design

Design de software em C, C++, Java, etc…

Convertendo de SVN para GIT

O SVN é um dos sistemas de versionamento mais usados atualmente, mas tem perdido bastante espaço para sistemas mais modernos como GIT e Mercurial.

Já trabalhei por muito tempo com o GIT e sempre ouvi falar que os repositórios dele são menores do que os do SVN então resolvi testar isso na prática.

Aqui na Suntech utilizamos subversion para controle dos projetos. Para o meu teste resolvi utilizar o repositório de uma biblioteca utilizada internamente e que é uma base bem grande de código.

O resultado foi impressionante: o repositório da biblioteca que no SVN ocupava 284mb passou a ocupar míseros 13mb no GIT. Ou seja, o repositório do git equivale à 4,5% do tamanho do mesmo repositório no SVN. Não sei dizer se essa diferença vai se aplicar à outros projetos porque só testei com 1 mas o resultado é realmente impressionante.

Fiz um teste rápido de integridade e todas as tags e logs estão no repositório do git sem problemas. O comando git tag -l listou todas as tags normalmente. Com o comando git checkout -b test 1.2.9 movi para a tag 1.2.9 ( em um novo branch chamado test ). E claro, utilizando o git diff 1.2.9 também me listou todas as alterações ocorridas desde esta versão.

Conversão passo-a-passo

No final deste post coloquei as referências que eu utilizei como base nessa migração. Não segui à risca os tutoriais gringos porque como era apenas para teste eu pulei alguns passos para ser mais rápido.

No ubuntu é necessário instalar o git-svn:

 sudo apt-get install git-svn

Depois vamos usar essa o git-svn para ‘clonar’ o repositório do SVN, já fazendo a transformação do repositório:

git svn clone http://xyz.com.br/svn/fake/repository \
--no-metadata --stdlayout temp

Pronto, agora temos o diretório temp abaixo do diretório atual contendo o conteúdo do repositório já no formato do git.
O próximo passo é criar um repositório bare, que basicamente é o repositório sem a working-copy. Este é o repositório utilizado como base na hora de clonar.

git init --bare lib.git
cd lib.git
git symbolic-ref HEAD refs/heads/trunk

Agora é só jogar o conteúdo do temp para o bare e remover o temp:

#no diretorio temp:
git remote add bare ../lib.git
git config remote.bare.push 'refs/remotes/*:refs/heads/*'
git push bare
cd ..
rm -rf temp

Neste ponto o nosso repositório bare está quase pronto. Como o repositório está separado em trunk, tags e branches precisamos fazer o merge do trunk do svn para o master do git. Para isso entre no diretório do novo repositório e digite:

git branch -m trunk master

Você deverá receber uma mensagem informando que o branch foi renomeado.

O último passo é fazer a limpeza das tags do svn para ficarem no padrão do git. Encontrei um comando na internet que ajuda com isso. o comando é:

git for-each-ref --format='%(refname)' refs/heads/tags | 
cut -d / -f 4 | 
while read ref; 
  do git tag "$ref" "refs/heads/tags/$ref"; 
  git branch -D "tags/$ref";
done

Pronto. Seu repositório está migrado e provavelmente bem menor do que a versão SVN.

Conclusão:

Para quem nunca utilizou o git, vale a pena conhecê-lo. Ele facilita bastante a vida de quem administra o repositório e tem algumas idéias muito inteligentes na forma de armazenar e lidar com os arquivos em repositório.

A curva de aprendizado talvez seja um pouco maior que a do SVN mas o custo-benefício é bem melhor.

Referências:

http://john.albin.net/git/convert-subversion-to-git

http://git.or.cz/course/svn.html

3 comentários em “Convertendo de SVN para GIT

  1. Marcelo Schambeck
    agosto 23, 2012

    Muito bom saber que além de distribuído ocupa muito menos espaço que o Subversion. Qualquer dia desses vou fazer uns testes no GIT. E quanto a performance dele, muda alguma coisa?

    • filipenf
      agosto 23, 2012

      Nunca fiz um comparativo em relação à performance, mas como trabalhei com GIT por mais tempo do que com SVN posso dizer por experiência que o desempenho do GIT é melhor. Acho que o fato de o GIT trabalhar com compressão dos arquivos e de o repositório ser consideravelmente menor ajuda nesse quesito.

      A parte mais complicada para quem está acostumado com SVN é realmente aprender os comandos básicos do GIT, que no geral são até parecidos mas pela arquitetura distribuída tem algumas diferenças ( ex.: um commit é feito localmente e não enviado para o servidor. No momento que você der o push ele envia todos os commits locais para o servidor )

  2. filipenf
    agosto 27, 2012

    No site: https://git.wiki.kernel.org/index.php/GitSvnComparison tem um bom comparativo GIT vs SVN. Eles citam o exemplo do projeto mozilla, no qual o repositório do GIT ficou 30x menor do que quando era SVN.

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

Informação

Publicado às agosto 22, 2012 por em Versioning e marcado , , , , , .
%d blogueiros gostam disto: