Pular para o conteúdo principal

Comparação entre Subversion, Mercurial e Git - Parte 1

Suponha que uma empresa tenha decidido migrar seus projetos comerciais do Subversion para uma ferramenta de controle de versão distribuído (DVCS). Os candidatos possíveis são o Mercurial e o Git. O próximo passo é fazer uma análise comparativa para decidir qual o mais adequado.

A definição dos critérios de comparação depende muito do perfil do projeto. Projetos comerciais têm necessidades diferentes dos projetos open source. A hospedagem externa (Github , Bitbucket etc.), por exemplo, não será um fator decisivo na escolha se o repositório oficial do projeto for mantido internamente na empresa.

Para determinar quais os critérios mais relevantes, é preciso primeiro definir o perfil do projeto. O perfil de um projeto comercial típico que usa Subversion pode ser descrito como:

  • Possui, no máximo, algumas dezenas de desenvolvedores, todos com acesso ao repositório pela rede local.
  • As equipes são formadas, em sua maioria, por desenvolvedores juniores com pouca ou nenhuma capacitação em Subversion e pouco conhecimento de inglês.
  • Os desenvolvedores juniores trabalham apenas no trunk usando apenas operações básicas como add, commit e update.
  • Os projetos evitam usar ramos para não ter de fazer mesclagem. Casos de mesclagem são executados por coordenadores/líderes de projeto, que são nível pleno ou sênior.
  • O ambiente de desenvolvimento é Windows.
  • O repositório central fica armazenado em um servidor na própria empresa.

De acordo com esse perfil, serão apresentados uma série de artigos comparando o Subversion (servindo de referência), Mercurial e o Git de acordo com os seguintes critérios:

  1. Desempenho. É desejável que a ferramenta tenha o melhor desempenho possível. Contudo, só será um fator decisivo se houver uma diferença muito grande entre as ferramentas.
  2. Funcionalidades. Ter muitas funcionalidades é interessante. Mas também só será decisivo se houver muita diferença entre os candidatos.
  3. Complexidade. Quanto mais complexa a ferramenta, mais difícil de aprender e usar. Influencia a produtividade e também aumenta a chance de haver erros de operação durante atividades cotidianas de controle de versão.
  4. Ramificação e Mesclagem. A mesclagem deve ser uma operação elementar se possível. A ramificação deve atender a todos os tipos de ramos possíveis e desejáveis.
  5. Similaridade com o Subversion. Quanto mais próximo do Subversion for o fluxo de trabalho, comandos e modelo mental, menor será o esforço de transição para a nova ferramenta.
  6. Funcionamento no Windows. É importante que a ferramenta funcione bem no ambiente de desenvolvimento. De preferência, com interfaces gráficas e plugins para as IDEs usadas.

Versões Usadas Nas Comparações

No momento em que este artigo foi escrito, as versões mais atuais das ferramentas analisadas eram:

  • Subverion 1.7.5
  • Mercurial 2.2.1
  • Git 1.7.10

No Ubuntu, as versões mais atuais podem ser obtidas através de ppas do Ubuntu, conforme os comandos abaixo:

$ sudo add-apt-repository ppa:dominik-stadler/subversion-1.7
$ sudo add-apt-repository ppa:mercurial-ppa/releases
$ sudo add-apt-repository ppa:git-core/ppa
$ sudo apt-get update
$ sudo apt-get install subversion mercurial git

O Mercurial não vem com os comandos fetch e rebase habilitados por padrão. Como eles serão usados em algumas comparações, é necessário ajustar a configuração conforme o comando abaixo:

$ sudo echo '
fetch =
rebase = ' >> /etc/mercurial/hgrc.d/hgext.rc

Desempenho

A análise de desempenho entre o Subversion, Mercurial e o Git se baseia em um estudo de caso que simula operações cotidianas de controle de versão. O objetivo é definir se as variações nos tempos de execução são grandes o suficiente para ser usadas como critério de escolha.

As operações consideradas no estudo de caso são:

  1. Criação/clonagem de um repositório.
  2. Adição de arquivos
  3. Consolidação
  4. Visualização do estado, histórico e das diferenças
  5. Mesclagem (Merge)
  6. Comunicação entre repositórios (pull, fetch e push)

O estudo de caso está automatizado por um script em bash. As operações manipulam apenas alguns arquivos por vez, pois é o que acontece nas consolidações comumente realizadas por desenvolvedores.

O acesso ao repositório do Subversion é apenas local. Um repositório remoto dificultaria a replicação da experiência e adicionaria fatores não controlados como velocidade da rede à medição. Caso haja algum repositório remoto disponível para testes, o script fornecido pode facilmente ser modificado para acessá-lo e as medições ser refeitas.

Os tempos coletados estão apresentados na tabela abaixo, com a unidade de tempo em milissegundo:

Subversion

Comando Real User Sys
add 234 212 20
checkout 21 4 12
checkout 31 20 8
commit 404 32 20
commit 385 16 20
commit 380 16 20
create 102 0 4
diff 16 4 8
diff 15 4 8
log 13 0 16
mkdir 324 4 12
status 12 8 0
status 11 4 4
update 29 8 16

Mercurial

Comando Real User Sys
add 104 92 8
clone 112 92 16
commit 119 104 12
commit 118 100 16
commit 114 84 28
commit 156 120 32
diff 121 96 24
diff 184 160 20
init 87 72 12
log 100 72 24
merge 123 112 8
pull 122 100 20
push 122 92 28
status 97 80 12
status 102 92 12

Git

Comando Real User Sys
add 9 8 0
checkout 4 0 0
clone 92 0 8
commit 9 8 0
commit 18 8 8
commit 24 16 4
commit 4 0 4
diff 8 4 0
diff 9 8 0
fetch 27 4 12
init 3 0 0
log 3 0 0
merge 21 16 4
push 57 32 8
status 4 0 0
status 4 0 0

Análise

Mesmo o Subversion se saiu muito bem nos testes, com tempo melhores até mesmo que o Mercurial em algumas operações. Certamente os tempos de algumas operações seriam piores caso o repositório fosse remoto e houvesse requisições concorrentes de processamento. Ainda assim, provavelmente os tempos continuariam satisfatórios.

As operações do Mercurial tiveram um tempo de execução bastante uniforme. Parte desse resultado se deve ao fato de o Mercurial ser escrito em Python e, por isso, há um tempo adicional de carregamento inicial do interpretador a cada comando.

Conforme esperado, o Git é extremamente rápido. O Subversion e o Mercurial são mais lentos que o Git em décimos de segundo. Mas em termos absolutos e práticos, essa diferença é insignificante e não tem impacto na produtividade. Sendo assim, pode-se afirmar que todas as ferramentas são satisfatoriamente rápidas na execução das suas operações e, portanto, desempenho não é um critério decisivo para escolha de ferramenta.

Melhor: Empate Técnico

Funcionalidades

O objetivo deste critério é apenas analisar o número de funcionalidades existentes, sem entrar no mérito de cada uma ou se determinada funcionalidade é importante ou não para um certo modo de trabalho. Na análise da "Similaridade com o Subversion" é que esses aspectos serão melhor abordados.

O Subversion possui naturalmente menos funcionalidades que o Mercurial e o Git porque o controle de versão centralizado é um subconjunto do distribuído. Com exceção do travamento de arquivos, que não condiz com o DVCS, as operações feitas pelo Subversion também podem ser feitas pelo Mercurial e pelo Git. Algumas operações não fariam sentido para o Subversion, como push e pull por exemplo. Mas outras talvez pudessem ser incorporadas, como o bisect.

Desde 2005, quando começaram suas atividades, o Mercurial e o Git vêm se influenciando continuamente, com um incorporando características do outro. O Mercurial, por exemplo, implementou o rebase e apontadores para revisões (bookmarks) que eram do Git. O Git, por sua vez, implementou os comandos daemon e bundle equivalentes aos comandos serve e bundle do Mercurial. Atualmente, chegaram a a tal ponto que ambos podem ser considerados equivalentes em termos de funcionalidades.

Por isso, número de funcionalidades também não é um critério decisivo de escolha de ferramenta.

Melhor: Mercurial e Git.

Conclusão da Parte 1

A escolha da ferramenta de DVCS precisa ser baseada em critérios relevantes ao perfil do projeto. Dentre o vários sugeridos, dois critérios já foram apresentados neste primeiro artigo: Desempenho e Funcionalidades. Mas como mostraram as medições, houve empate tanto no desempenho do Subversion (com acesso a um repositório local), Mercurial e Git, quanto no número de funcionalidades do Mercurial e do Git.

Por enquanto, ainda não é há um "vencedor", mas as diferenças começarão a aparecer a partir do próximo critério: Complexidade, na parte 2.

Comentários

Comments powered by Disqus