Mesclando repositórios SVN

16abr10

Mesclando repositórios SVN

Ontem enfrentei um grande desafio, que me fez relembrar os bons e velhos tempos de missões críticas onde não há espaço para erros. O pior (ou melhor) de tudo é que eu adoro isso! Como eu estava dizendo, ontem fiquei encarregado de unificar cinco repositórios Subversion (SVN), compostos por um principal e quatro módulos,  hospedados no SourceForge (sf.net) referentes ao projeto open-source do Governo Federal. Tomei como base a bíblia: o svn-book.

Fiz o seguinte procedimento em cada um cinco dos projetos, em seus respectivos repositórios: conectei ao shell do sf.net; fiz o primeiro backup; bloqueei o acesso ao repositório; fiz o segundo backup; exportei o dump do repositório e; limpei o repositório depreciado.

1.1) Conectando ao shell do sf.net

O procedimento foi realizado por completo nos servidores do sf.net. A conexão foi estabelecida da seguinte maneira:

ssh -t [usuário],[projeto]@shell.sourceforge.net create

Devidamente conectado ao servidor, iniciei o processo.

1.2) Gerando o primeiro backup

Antes de fazer qualquer modificação, gerei o backup do repositório. Para isso, utilizei a ferramenta rsync:

rsync -av [projeto].svn.sourceforge.net::svn/[projeto]/* ~/svnbkp/[projeto]

O rsync fez uma cópia dos arquivos do repositório diretamente da fonte, basicamente uma cópia completa do repositório como ele é. Feita a primeira cópia de segurança, parti para o lock do repositório.

1.3) Bloqueando o acesso ao repositório

O bloqueio não permitirá que os usuários façam mudanças no repositório durante o processo de migração, evitando perda de informações e inconsistência no repositório. Para isso, o SourceForge oferece uma ferramenta administrativa chamada adminrepo:

adminrepo --checkout svn

Este comando bloqueia o repositório público e o disponibiliza na pasta /svnroot/[projeto].

1.4) Gerando o segundo backup

A segunda cópia de segurança é necessária para “fotografar” o momento em que o repositório está bloqueado, caso seja necessário retornar a este marco:

rsync -av /svnroot/[projeto] ~/svnbkp/[projeto]-locked

Foi utilizado novamente o comando rsync.

1.5) Extraindo o dump do repositório

Com todas as cópias de segunraça em mãos, é hora de gerar o dump. O arquivo dump contém todo o conteúdo versionado do repositório juntamente com todo o seu histórico. Para gerar o arquivo executei o seguinte comando:

svnadmin dump /svnroot/[projeto] > ~/svnbkp/[projeto].dmp

1.6) Limpando o repositório depreciado

Após criar as duas cópias de segurança e o dump, fiz a limpeza do repositório:

rm -rf /svnroot/[projeto]/*
svnadmin create /svnroot/[projeto]

E, finalmente, a consolidação utilizando a ferramenta administrativa do sf.net:

adminrepo --save svn

Após isso tudo, repetido cinco vezes, cheguei à metade do caminho. Faltava ainda mesclar os repositórios.

Tendo o repositório principal no ar, criei cinco pastas para abrigar os cinco dumps. Feito isso, iniciei o processo de carregamento da seguinte forma:

2.1) Carregando o dump dos sub-projetos

Conectado ao shell do projeto principal, fiz o carregamento dos dumps dos quatro sub-projetos:

adminrepo --checkout svn
svnadmin load /svnroot/[projeto] --parent-dir [projeto] < ~/svnbkp/[projeto].dmp
adminrepo --save svn

2.2) Carregando o dump do projeto principal

O carregamento do projeto principal poderia ser idêntico ao dos sub-projetos se não fosse por um detalhe. Era preciso fazer uma filtragem para remover um artefato incoerente do histórico do repositório. Usei a ferramenta svndumpfilter:

adminrepo --checkout svn
svndumpfilter exclude trunk/docs/others/tools < ~/svnbkp/[projeto].dmp > ~/svnbkp/[projeto]-filtered.dmp
svnadmin load /svnroot/[projeto] --parent-dir [projeto] < ~/svnbkp/[projeto]-filtered.dmp
adminrepo --save svn

Agora sim, o trabalho estava finalizado. Se você for fazer isso algum dia, se preocupe pelo menos com estas possibilidades:

  • Lentidão na conexão com o sf.net
  • Queda da conexão com o sf.net durante o processo, podendo acarretar no lock do repositório com eventual intervenção do suporte do sf.net
  • Utilização do ambiente por parte dos usuários durante a execução da atividade

Para mais detalhes da migração, clique aqui. Comigo foi tudo bem, espero que seja para você também 😉

Anúncios


One Response to “Mesclando repositórios SVN”


  1. 1 Unificação dos repositórios Subversion « SourceForge.net: Project demoiselle

E aí, o que você achou? Comenta aí...

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