Usando o Git com um servidor Subversion

No meu último artigo, dei uma dica de como aprender de forma rápida a usar o maravilhoso sistema de controle de versão (SCM) Git. Mas o fato é que atualmente o Subversion (ou SVN) ainda é o SCM mais utilizado no mundo e muitas empresas ainda não migraram para o Git. Mas nem por isso você precisa se desanimar, pois, se quiser, você pode utilizar o Git hoje sem ninguém saber com um servidor Subversion!

O próprio Git fornece uma ferramenta milagrosa chamada “git-svn”. O que o git-svn faz é o seguinte:

Resumidamente, o git-svn faz com o Subversion tudo o que o Git puro faria com um repositório remoto. No entanto, os comandos são um pouco diferentes, mas a documentação pode ser encontrada no “man page” do git-svn. Infelizmente a documentação ainda está um pouco aquém do esperado, mas a seguir vou dar algumas dicas de resolução de problemas pelos quais passei.

Problema 1: Git não consegue clonar o repositório SVN

O primeiro problema pelo qual eu passei foi um erro ao rodar o comando “git svn clone”. O problema é que o histórico do meu projeto no Subversion estava muito grande e o servidor não deu conta do processamento feito pelo git-svn. A solução é não clonar todo o histórico do repositório utilizando o parâmetro “-r”. Um exemplo seria:

git svn clone -r 3000:HEAD http://rodrigocarvalho.blog.br/svn/

Neste exemplo, utilizamos o parâmetro “-r” para clonar o histórico a partir da revisão 3000 do SVN até a útima revisão (HEAD). Não existe uma fórmula para escolher a revisão inicial, sendo que consegui encontrar um valor que funcionou para mim na tentativa e erro.

Problema 2: Os branches do SVN não foram para o Git

Após feito o clone, você poderá se dar falta dos branches que tinha no SVN. Caso a estrutura do seu repositório Subversion seja a padrão (trunk, branches, tags), simplesmente utilize o parâmetro “-s”. O exemplo acima ficaria assim:

git svn clone -s -r 3000:HEAD http://rodrigocarvalho.blog.br/svn/

Desta forma ele vai criar no Git os branches que existiam no seu repositório SVN.

No entanto, se a estrutura do seu repositório não for a padrão, você terá que utilizar os parâmentros “–trunk” ou “-T”, “–tags” ou “-t” e “–branches” ou “-b”. Um exemplo seria:

git svn clone --trunk=trunk/projetox --tags=tags/projetox \
   --branches=branches/projetox -r 3000:HEAD http://rodrigocarvalho.blog.br/svn/

Bonus: Git no Windows

Normalmente, as pessoas trabalham com Git pela linha de comando mesmo. Se você utilizar um sistema UNIX (Linux, OSX, *BSD), você terá à sua disposição o bash, que é uma excelente ferramenta modo texto. Adicione o pacote “bash-completion”, aí que o bash vai te facilitar ainda mais a vida!

Infelimente, sou obrigado a trabalhar todos os dias na empresa com no Windows, sistema operacional que tem um console textual muito fraco e que ele não te ajuda em nada… Mas é para isto que existe o cygwin, que emula um ambiente UNIX no Windows! Portanto, ao utilizar Git no Windows, eu recomendo fortemente o uso do Cygwin.

Sua instalação é muito tranquila e pode ser feita mesmo em computadores onde não se tenha permissões de administrador. É só escolher uma pasta de instalação (uma onde se tenha permissão de escrita, por favor), esperar ele baixar a lista de pacotes disponíveis da Internet (sim, igualzinho ao apt, yum etc \o/) e selecionar para instalar todas as ferramentas que considerar úteis. No nosso caso, você vai querer selecionar pelo menos estas:

  1. “git”;
  2. “git-completion” (que é o pacote do bash-completion para os comandos do Git);
  3. “git-svn”.

Espere a instalação baixar tudo que terá um ambiente Git montado no Windows!

Para deixar ainda melhor, eu recomendo o uso da ferramenta Console2 que é melhor do que a janela de linha de comando do Windows, pois oferece abas e possibilidade de redimencionar a janela. Sua instalação também é muito fácil e, após instalado, você deve configurar para ele rodar o Cygwin ao invés do terminal do Windows. Para fazê-lo, vá em “Edit” -> “Settings”.  No campo “Shell” da aba “Console” escreva:

<pasta_do_cygwin>\bin\bash.exe --login -i

Onde “<pasta_do_cywin>” deve ser substituído pelo caminho onde você instalou o Cygwin.

Pronto você terá um ambiente Git muito mais produtivo do que antes!