Acácio Santos

RSS

git git git… migrando do svn para o git na Tribuna do Norte

Antes tarde que nunca, lá na Tribuna do Norte passamos a utilizar git.

O cenário era mais ou menos o seguinte: Existiam vários projetos em andamento, versionados boa parte em um mesmo repositório central utilizando subversion (com alguns poucos separados) e a coisa estava crescendo de uma forma um pouco desorganizada. Durante um dojo que fizemos, eu e Karlisson ( http://hacktoon.com ) demos a ideia de utilizar git. Durante o dojo foi preciso aprender algumas coisas administrativas sobre o git e veio a ideia: Por que não aproveitar agora para migrar de vez do svn e resolver vários problemas sobre versionamento que tinhamos? Dos desdobramentos dessa ideia surgiram alguns requisitos para a migração:

  1. Migrar os commits antigos, feitos no svn
  2. Integrar com uma ferramenta de controle de projetos/desenvolvimento (no nosso caso, o Trac)
  3. Tornar fácil a troca do sistema de versionamento das working copies em produção para o git, sem tocar nos arquivos atuais
  4. Permitir o versionamento diretamente dos servidores onde roda o portal do jornal, já que o git é distribuído (e o portal também)

Vou abordar aqui 2 pontos cruciais desses requisitos, já que o item 2 e o item 4 já são conhecidos e/ou nativos do git.

1 - Migrar os commits antigos do svn para o git:

A receita simples para para importar seus repositórios svn para git:

  • crie um dir para seu repositório

    mkdir meurepos-tmp
    cd meurepos-tmp
    
  • inicie o seu repositório usando o git-svn, que integra os 2. No nosso caso, foi feito diretamente no servidor onde estavam armazenados os repositórios svn

    git-svn init file:///url/no/repos/svn --no-metadata
    
  • importe os commits do svn

    git-svn fetch
    
  • volte ao diretório anterior e faça um clone desse repositório. Porque? Por que sem isso, ainda haverá nos internals do git uma ligação com seu svn. Então simplesmente faça :-)

    git clone meurepos-tmp meurepos
    
  • se quiser deixar disponível para sincronização via ssh (e você quer, acredite), mova apenas a pasta .git dentro do meurepos para um local onde esteja acessível a todos os membros da sua equipe usando ssh e chaves ssh (ou senha, como queira). lembre também de setar as devidas permissões

    mkdir /git # se nao tiver um local já determinado
    mv meurepos/.git /git/meurepos.git
    chown -R usuario_do_ssh:grupo_do_usuario /git/meurepos.git
    
  • pronto! agora você já pode fazer um clone desse repositório em qualquer máquina da equipe e começar a desenvolver:

    git clone ssh://usuario_do_ssh@servidor/git/meurepos.git
    

3 - Converter working copies svn para git

ATENÇÃO: Certifique-se, antes de fazer isso, que você tem:

  • Um backup da working copy, ou:
  • Coragem de fazer sem um backup, ou:
  • Está realmente seguro do que está fazendo

A ideia é simples: O svn adiciona em cada diretório da sua working copy que está versionado, um outro diretório chamado .svn. O que você tem que fazer é remover esses diretórios e depois, colocar o diretório .git, gerado a partir de um clone, na raiz (e apenas na raiz) da sua working copy. A forma como fiz foi a seguinte:

  • entrar no diretório dessa working copy e remover os .svn que tem nela. (leia novamente os requisitos no começo dessa dica)

    cd /dir/da/working/copy
    find . -type d -name .svn -exec rm -rfv {} \; 
    
  • fazer um clone em outro diretório do novo repositório git e mover apenas a pasta .git dele

    git clone ssh://usuario_do_ssh@servidor/git/meurepos.git
    mv meurepos/.git /dir/da/working/copy/
    
  • verificar se deu tudo certo:

    git status
    
  • nesse ponto, você já deve poder ver o que o git confrontou entre a última alteração do svn e o estado atual da sua working copy. Aproveite para ignorar arquivos que não devem estar versionados, inserindo seus nomes/padrões em .gitignore, dentro da working copy.

Pois bem, estes passos foram os base para uma série de outros requisitos que estarão aqui, em breve :-)