Created: 2010-04-29 16:59 Updated: 2010-04-29 16:59

O script a seguir ilustra a minha tentativa de migrar os projetos do meu repositório SVN (Subversion) para o GIT.

Alguém poderia perguntar: "Mas, por que migrar para o Git? O Subversion não é bom?". Eu responderia assim: "Sim, o SVN é muito bom e o tenho usado há vários anos. O que ocorreu foi um pequeno impasse ocorrido numa mudança de ambiente operacional, além da vontade de experimentar uma nova solução.".

Explicando:

Em primeiro lugar, quero deixar claro que esta "migração" foi apenas em caráter de teste e me parece que funcionou. Ainda estou brincando com o Git...

Atualmente, utilizo o SVN para controlar as versões dos softwares que produzo no meu dia-a-dia, que são desenvolvidos apenas por mim, pelo menos por enquanto. O SVN tem me atendido, mas uma coisa muito chata que vejo nele é a execução do backup: é preciso fazer um dump do repositório, o que gera um arquivo relativamente grande. Tudo bem que é possível compactar e aí o tamanho é bem reduzido, dependendo do conteúdo do repositório. Simplesmente copiar o diretório do repositório não funciona, pois a restauração tem manter a ordem dos arquivos, tal qual estava no repositório original. É muito difícil manter isso. eu mesmo já fiz alguns testes, copiando o meu repositório para um outro computador e o resultado foi um repositório corrompido. Que fique claro que nunca tive problemas realizando o dump do repositório e todas as restaurações foram realizadas com sucesso.

Sempre utilizei o SVN em minha estação de trabalho e, periodicamente, eu realizo o dump do repositório e o transfiro para o servidor da empresa. Isto sempre funcionou. Mas eu desejo algo mais adequado para as minhas necessidades: eu queria uma forma de ter o meu repositório local e poder sincronizá-lo com um ou mais repositórios situados em outros servidores e eu gostaria também que o repositório pudesse ser simplesmente copiado como forma de backup, assim, um script simples já seria suficiente para realizar os backups.

Me parece que isto se encaixa na filosofia do Git. Mas o uso do Git vou deixar para outra oportunidade. O objetivo aqui é apenas apresentar o script que usei para o teste de migração. Ele é bastante simples e assume o seguinte:

Além disso, é importante ressaltar que utilizo apenas um repositório SVN para todos os projetos (hoje acho que isso não é bom, mas uso assim desde o CVS). Neste repositório, cada projeto possui um diretório no raiz do repositório, e cada projeto possui sua estrutura tradicional do SVN: trunk, tags e branches.

Como eu disse, este script é experimental, então, use-o por sua própria conta e risco.

O script deve ser executado num diretório vazio, pois o resultado final será um repositório Git para cada projeto encontrado no repositório SVN (na verdade, um repositório Git para cada diretório contido no diretório raiz do repositório SVN)::

    #!/bin/bash

    # Creates all GIT repositories from a single SVN repository
    # considering that the SVN repository contains many "projects"
    # on the repository root and that each project contains the default
    # structure trunk, brances and tags.
    #
    # THIS IS AN EXPERIMENTAL VERSION. USE AT YOUR OWN RISK.
    #

    # Note: svn2git download: http://github.com/nirvdrum/svn2git


    SVNREP=file:///mnt/data/mario/SVN-PROJECTS

    SVN2GIT="/var/lib/gems/1.8/bin/svn2git"
    SVN2GITOPTS="--trunk=trunk --tags=tags --nobranches"


    CDIR=$(pwd)

    for x in $(svn list ${SVNREP}) ; do
      proj=$(echo $x | sed s/"\/"/""/g)

      echo $proj
      mkdir ${proj}
      cd ${proj}

      ${SVN2GIT} ${SVNREP}/${proj} ${SVN2GITOPTS}

      cd ${CDIR}
    done

Até mais,

Marião.