Migrando repositórios SVN para o Git

Em post anterior, falamos um pouco sobre a migração de repositórios CVS para o Git usando ferramentas disponíveis no mercado. Neste post iremos explorar um pouco mais o assunto Git, porém tratando da migração de repositórios Subversion, outro formato bastante difundido no mercado corporativo.

Vamos monstrar como migrar um repositório de exemplo:

Preparação do ambiente

Vamos precisar inicialmente de um ambiente Linux qualquer. Siga os seguintes passos para montar o ambiente:

  • Conecte-se como root neste ambiente;
  • Instale o client svn;
  • Instale o client git mais novo –  recomendamos pelo menos a versão 2.x.
  • Instale o pacote git-svn (yum install git-svn)
  • Volte para um usuário sem acesso de root;
  • Configure o PATH para que inclua os clients git e svn;
  • Confira a versão do rodando git –version:
    $ git –version
    git version 2.3.5

Pronto, ambiente instalado. Vamos agora aos passos para executar de fato o processo:

Executando o processo

O primeiro passo a migração consiste em fazer o ‘clone’ do repositório SVN localmente, usando a ferramenta git-svn:

cd /home/git
git svn clone http://svn.www.matera.com/svn/repos/sample-repo/ --no-metadata --stdlayout --username=lsergio --prefix=""

Neste comando, –stdlayout indica que o repositório segue o modelo tradicional, com pastas trunk, tags e branches. Caso seu repositório siga um modelo diferent deste, será necessário consultar a documentação do git-svn. Note também que a url do repositório deve ser a url base, sem incluir a pasta trunk.

Além disso, o parâmetro –username deve indicar um usuário válido no svn, pois o mesmo será usado para checkout do repositório.

Este comando poderá demorar até algumas horas para rodar, pois não se trata apenas de um checkout do código mais recente, mas de um clone, incluindo todo o histórico de commits. Assim, todo o histórico do repositório svn deverá ser avaliado. Ao fim de sua execução teremos um diretório sample-repo com o clone do svn.

Assim que o clone do svn finalizado, criamos o repositório git do tipo bare:

cd /home/git
mkdir sample-repo.git
cd sample-repo.git
git init --bare

E indicamos que o branch atual é o trunk:

git symbolic-ref HEAD refs/heads/trunk

Neste momento temos um clone do repositório svn no diretório sample-repo e um repositório bare do git em sample-repo.git . Está quase tudo pronto, precisamos agora fazer o push do código que está no repositório svn clonado para o repositório git local:

Navegamos até o repositório svn clonado:

cd /home/git
cd sample-dev

Adicionamos o repositório git como remote:

git remote add bare ../sample-repo.git

Configuramos para o que o push para repositório git seja dos branches refs/remotes e dos refs/heads:

git config remote.bare.push 'refs/remotes/*:refs/heads/*'

Executamos o push propriamente dito:

git push bare

Ao fim destes comandos, o repositório svn terá sido copiado para o git, já no formato apropriado.

Precisamos acertar algumas convenções de git. Enquanto no svn o branch principal é o trunk, no git é o master. Desta forma, vamos renomear trunk para master:

cd /home/git/sample-repo.git
git branch -m trunk master

Finalmente precisamos fazer apenas uma limpeza de branches no git. Quando o clone do svn foi feito, todas as tags existentes no svn foram criadas como branches no git. Precisamos então transformar estes branches em tags de fato:

git for-each-ref --format='%(refname)' refs/heads/tags |  # para cada branch em refs/heads/tags
cut -d / -f 4 |
while read ref
do
  git tag "$ref" "refs/heads/tags/$ref";                  # cria-se a tag a partir do branch
  git branch -D "tags/$ref";                              # remove-se a tag
done

Neste momento o repositório já está pronto para ser enviado para o repositório corporativo.

Fazemos inicialmente um clone deste repositório em outra pasta:

mkdir /home/git/tmpdir
cd /home/git/tmpdir
git clone --bare /home/git/sample-repo.git
cd sample-repo.git

Adicionamos agora um repositório remoto, referente ao servidor oficial da empresa, e fazemos push do repositório:

git remote add companyrepo http://username@gitserver/scm/demo/sample-repo.git
git push --all companyrepo
git push --tags companyrepo

Note que a url usada no primeiro comando deve ser obtida na ferramenta no gerenciador de repositórios oficial da empresa.

Finalizados estes passos, o repositório oficial está pronto para uso no git. Bons commits!

Links externos:

Por LUIS SERGIO F. CARNEIRO

Postado em: 26 de junho de 2015

Confira outros artigos do nosso blog

REST não é JSON

21 de agosto de 2017

Bruno Sofiato

[Webinar] Profile de aplicações Java com Oracle Mission Control e Flight Recorder

24 de julho de 2017

Danival Calegari

Criando Mocks de serviços REST com SoapUI

27 de junho de 2017

Monise Costa

JavaScript 6: diferença entre var, let e const

09 de maio de 2017

Otávio Felipe do Prado

Deixe seu comentário