Controle de versão de software: o porquê e como migrar de SVN para GIT - Blog Oobj
Quando falamos em desenvolvimento de software, estamos falando também de evolução. Os sistemas estão em constante aperfeiçoamento e, por isso, são criadas versões a cada atualização com melhorias ou mesmo correções de erros.
Um desafio para as empresas de TI é controlar o versionamento dos seus projetos. Isso porque, além do volume de alterações ao longo do tempo, diferentes desenvolvedores trabalham no mesmo projeto. O resultado disso é a necessidade de uma organização estruturada para se manter o controle e evitar erros.
Para esse cenário, existem as ferramentas de controle de versão. Elas registram a evolução dos projetos, auxiliam no gerenciamento das atividades em andamento e armazenam o histórico de códigos que, mesmo que não estejam sendo utilizados, podem vir a ser úteis posteriormente.
Entre as várias ferramentas desse tipo, estão o SVN e o GIT e é sobre elas que falaremos.
Por que migrar de SVN para GIT?
Aqui na Oobj, usávamos o SVN há vários anos. Porém, após conhecermos as vantagens do GIT, resolvemos fazer a migração. Entre os benefícios estão o aumento da segurança, facilidade de organização e praticidade no trabalho.
O SVN é uma ferramenta que armazena todos os projetos e suas versões em um servidor único (centralizado). Ao atualizar algum código realizando o commit a alteração já vai direto para este servidor centralizado.
Já o GIT trabalha de forma diferente (distribuído). O trabalho com branches se torna mais simples, sem necessidade de criação de um novo diretório local e clone de todo o código para esse diretório. Ele também possui um passo a mais chamado push, utilizado caso deseje subir qualquer alteração realizada para o servidor.
Outro ponto importantíssimo é que, antes de mesclar qualquer atualização, é necessária uma solicitação de validação, chamada de pull-request. O GIT só irá colocar em produção commits previamente revisados. O pull-request demanda uma validação das alterações, não somente pelo desenvolvedor que a criou, mas por um segundo usuário. Isso garante que, pelo menos duas pessoas verifiquem a qualidade da atualização e a existência de erros, tornando o controle de versões bem mais seguro.
Foi com base nessas vantagens que vimos essa migração como a melhor opção. Porém, qualquer troca de sistema necessita de cuidado para que não haja perda de dados históricos pelo caminho. Tenho notado que essa perda é uma situação comum e que preocupa as empresas que decidem por essa migração. E é por isso que resolvi escrever esse artigo.
Vou mostrar abaixo como migrar um repositório robusto, com 10 anos no SVN para o GIT, mantendo todo o histórico de commits.
Fazendo a migração do SVN para GIT em 5 passos
Antes de tudo, o primeiro ponto a se atentar é utilizar o Linux para a migração do repositório. Através dele, é possível seguir com as etapas:
1º Configuração do ambiente
O script de migração para se utilizar é o disponibilizado pela Atlassian: svn-migration-scripts.jar. Também é necessário que o script do Java Runtime Environment, Git, Subversion e o utilitário git-svn estejam instalados.
Para verificar se está tudo correto, abra um prompt de comando e execute o seguinte comando:
2º Criação do arquivo authors.txt
No SVN, os usuários são identificados apenas pelo nome do usuário <nome.sobrenome>, já no GIT temos o nome de usuário e também o e-mail <nome sobrenome, nome@mail.com>. Portanto, é necessário criar um arquivo que chamaremos de authors.txt para realizarmos esse DE-PARA.
java -jar svn-migration-scripts.jar authors <URL repo SVN> > authors.txt
3º Realização do clone do repositório do SVN para o GIT
Quando falamos de SVN, devemos levar em consideração que cada um pode estar utilizando um padrão diferente. Ou seja, o padrão de repositórios como " — trunk", " — fix" ou " — prod".
Se você utiliza algum desses padrões acima, durante o procedimento deverá usar o "— stdlayout" para realizar o clone.
Agora, se você utiliza um padrão diferente desses, é possível passar para o comando os parâmetros informando qual a nomenclatura do seu repositório, como por exemplo:
git svn clone –prefix='' –trunk=/<pasta relativa> –authors-file=authors.txt <URL repo SVN> <nome do novo repo git>
Nesse caso, a sugestão é utilizar o "— prefix='' " pois, se desejar atualizar este repositório futuramente, irá prevenir alguns problemas, porque o comando utilizado para realizar a atualização espera que exista esse prefix.
git svn clone –stdlayout –authors-file=authors.txt <URL repo SVN> <nome do novo repositório git>
Essa etapa pode demorar bastante tempo dependendo do tamanho do repositório, pois irá migrar revisão uma por uma para o GIT.
4º Limpeza do novo repositório criado, removendo .svn
Com a execução do SVN clone, algumas coisas são trazidas para o novo repositório GIT. Portanto, deve-se fazer a limpeza dentro desse novo repositório.
Esse comando irá apresentar tudo o que deve ser limpo. Depois, execute-o novamente com "— force" para remover:
java -Dfile.encoding=utf-8 -jar ~/svn-migration-scripts.jar clean-git –force
5º Adicionar remote origin e realizar o push do repositório
Nessa etapa, é necessário executar este comando:
git remote add origin https://URL.git
Após isso, execute o seguinte:
Pronto! Está feita a migração do primeiro repositório SVN para o GIT.
Por fim, para fazer a atualização do repositório com as últimas alterações realizadas ainda no SVN, é preciso executar:
Para sincronizar as novas alterações buscadas no passo anterior, basta executar o comando:
java -Dfile.encoding=utf-8 -jar ~svn-migration-scripts.jar sync-rebase
Após ter feito isso, as novas atualizações irão aparecer. Assim, é preciso executar "git log" para confirmar.
Para finalizar, é necessário executar o 4º passo novamente e realizar o push das novas alterações buscadas.
Tecnologia da Netflix para redução de custo computacional
Se o seu negócio é o de Software House, o lançamento de Notas Técnicas pela Sefaz muito provavelmente é motivo de dor de cabeça. Aproveito então para compartilhar o modelo de trabalho que usamos na Oobj. Com ele, conseguimos organizar todas as etapas do processo, desde a entrada da NT, com a integração das equipes e criação das atividades iniciais, até o desenvolvimento, testes e implementação nos clientes.
Taynan Rezende é um dos responsáveis pelo desenvolvimento de produtos cada vez mais eficientes na Oobj. Ele acredita que praticidade e otimização constante são o segredo do sucesso para as empresas de tecnologia.