A extensão hgsubversion torna o Mercurial em um cliente do Subversion. Isto permiteque você faça consolidações offline e todas as outras funcionalidades legais do Mercurial até que você empurre os changesetes de volta ao Subversion.
A extensão precisa das ligações do Python Subversion. As ligações são fornecidas com o TortoiseHg para Windows. No Linux, você precisa procurar por um pacote chamado python-subversion no seu gerenciador de pacotes.
Instale a extensão através do comando:
$ hg clone https://hgsubversion.googlecode.com/hg/ hgsubversion
Acrescente:
[extensions] hgsubversion = path/to/hgsubversion
no seu arquivo de configuração para carregar a extensão. Se você tiver instalado a extensão pelo gerenciador de pacotes, então é praticamente certo que o caminho já está no PYTHONPATH e basta adicionar:
[extensions] hgsubversion =
Use hg help hgsubversion para verificar se a extensão está habilitada.
Nós preparamos um repositório do Subversion com um programa Hello World. Há um repositório para cada grupo, chamado hello1, hello2, …, hello5. Por favor, clone aquele correspondente ao número do seu grupo:
alice$ hg clone http://mercurial.aragost.com/svn/helloX hello-hg [r1] mg: Created initial layout. [r2] mg: First known version by Brian Kernighan, 1974. [r3] mg: Include stdio.h. [r4] mg: Output newline. [r5] mg: Version 1.0. [r6] mg: Capitalized! [r7] mg: Comments are good. [r8] mg: Added README. [r9] mg: Added Makefile. [r10] mg: Ignore compiled program. pulled 9 revisions updating to branch default 4 files updated, 0 files merged, 0 files removed, 0 files unresolved alice$ cd hello-hg
Note
If a http(s):// URL doesn’t work for you, then try with svn+http(s):// instead. That should tell Mercurial in unambiguous terms that you’re cloning from Subversion.
Ela inspeciona o repositório com thg log para ver quais rótulos foram definidos corretamente:
A revisão final do Subversion define a propriedade svn:ignore para hello para ignorar o binário compilado. No Mercurial, padrões a serem ignorados são controlados pelo arquivo .hgignore que fica na raiz da cópia de trabalho. Este arquivo pode ser gerado pelo comando:
alice$ hg svn genignore
Normalmente, alguém pode consolidar o arquivo .hgignore para compartilhar com os outros usuários do repositório. Contudo, uma vez que o Subversion ainda é o controle de versão mestre, você não vai querer por o arquivo .hgignore de volta lá. Por essa razão, este arquivo deve ignorar a si meso. Você pode gerá-lo de tempos em tempos com o comando hg svn genignore --force.
Alice pode editar os arquivos e consolidá-los com o Mercurial:
alice$ echo "/* The End. */" >> hello.c alice$ hg diff diff -r e3314036fa9f hello.c --- a/hello.c Fri Mar 12 10:20:45 2010 +0000 +++ b/hello.c Fri Mar 12 21:20:10 2010 +0000 @@ -7,3 +7,4 @@ printf("Hello, World!\n"); return 0; } +/* The End. */ alice$ hg commit -m "Added footer."
A mudança ainda não está no servidor do Subversion — hg push ainda é necessário. Isto acontece porque o servidor do Subversion é o mestre e quando ele recebe uma consolidação é estabelecido um nome de usuário e timestamp para a revisão. No lado do Mercurial, o changeset é reescrito para refletir o metadado atualizado:
alice$ hg outgoing comparing with http://mercurial.aragost.com/svn/helloX changeset: 9:2dc661f0cdc8 tag: tip user: Alice <alice@example.net> date: Fri Mar 12 21:20:15 2010 +0000 summary: Added footer. alice$ hg push pushing to http://mercurial.aragost.com/svn/helloX searching for changes [r11] alice: Added footer. pulled 1 revisions saved backup bundle to $HOME/hello-hg/.hg/strip-backup/2dc661f0cdc8-backup.hg
Você pode ver o changeset atualizado dessa maneira:
alice$ hg tip changeset: 9:a545b3d1c21d tag: tip user: alice@66d5687c-2042-4ccc-9f0a-7e74790c38a1 date: Fri Mar 12 21:25:00 2010 +0000 summary: Added footer.
Note como o autor e o timestamp mudaram devido à atualização do servidor do Subversion sobre o metadado. Como os changesets são reescritos, você não pode fazer clones adicionais do Mercurial a partir do seu clone original. Se fizer, terá que retirar manualmente as versões antigas dos changesets que foram empurrados ao Subversion.
Alice faz mais algumas mudanças locais no seu clone:
alice$ hg outgoing comparing with http://mercurial.aragost.com/svn/helloX changeset: 10:9a6e43d86b16 user: Alice <alice@example.net> date: Fri Mar 12 21:26:00 2010 +0000 summary: Express greater joy! changeset: 11:f3bd093438f1 tag: tip user: Alice <alice@example.net> date: Fri Mar 12 21:27:00 2010 +0000 summary: Added simple MIT license header.
Enquanto isso, o repositório do Subversion mudou:
alice$ hg incoming incoming changes from http://mercurial.aragost.com/svn/helloX revision: 12 user: alice date: 2010-03-12T21:26:30.0Z message: List email address for bug reports. alice$ hg pull pulling from http://mercurial.aragost.com/svn/helloX [r12] alice: List email address for bug reports. pulled 1 revisions (run 'hg update' to get a working copy)
A nova revisão causou uma bifurcação no histórico:
Quando Alice empurrar, seus dois changesets (7d780c6154fb e 12445668eefc) automaticamente serão recolocados no topo da revisão que ela puxou do Subversion (2099057558d2):
alice$ hg push pushing to http://mercurial.aragost.com/svn/helloX searching for changes [r13] alice: Express greater joy! pulled 1 revisions saved backup bundle to $HOME/hello-hg/.hg/strip-backup/xxxxxxxxxxxx-backup.hg [r14] alice: Added simple MIT license header. pulled 1 revisions saved backup bundle to $HOME/hello-hg/.hg/strip-backup/xxxxxxxxxxxx-backup.hg
De novo, isto é necessário porque o Subversion tem um histórico estritamente linear. O novo histórico fica assim:
A extensão hgsubversion permite que você use o Mercurial como um cliente do Subversion. Isto fornece imediatamente as seguintes vantagens comparadas com um cliente normal do Subversion:
Histórico completo no cliente. Permite usar as técnicas de busca por defeitos oferecidas pelo Mercurial, seja simplesmente procurando o histórico pela introdução de uma string com o comando hg grep ou hg annotate, ou seja pela busca binária avançada feita com o hg bisect.
As pessoas simplesmente começam a trabalhar diferentemente com suas ferramentas quando elas se tornam suficientemente rápidas. O Mercurial é projetado para fazer o acesso local rápido.
Consolidações Locais (offline). Controle de versão é sobre rastrear o desenvolvimento de código. Particularmente, o controle de versão deve permitir que as pessoas experimentem novas ideias e funcionalidades. Para fazer isso, precisamos consolidar com frequência — talvez a cada cinco minutos quando pensam que estão mais próximas de uma solução que funciona.
O Subversion força as pessoas a publicarem essas revisões imediatamente. Por isso, as pessoas tendem a segurar as consolidações, especialmente no trunk, por medo de quebrar a build. Se estiverem trabalhando em um ramo, todas essas consolidações vão poluir o histórico e tornar a revisão difícil.
O Mercurial permite consolidar frequentemente, sempre que se achar necessário. As mudanças podem ser refinadas depois em consolidações maiores e mais significativas que serão fáceis de rever e que evitarão um monte de falsos inícios. Essas consolidações refinadas são então empurradas ao servidor do Subversion.
Desenvolvimento Distribuído. Você viu acima como os changesets são recolocados quando empurrados ao Subversion. Isto torna a colaboração com outros chata se os changesets nos quais eles estiverem trabalhando forem continuamente mudados sob seus pés.
Contudo, é possível trabalhar em um modo distribuído em uma nova funcionalidade. Requer apenas que os colaboradores esperem para publicar no Subversion após estarem prontos. Você pode então fazer quantos clones quiser e empurrar e puxar entre eles livremente. Quando a funcionalidade estiver pronta, você a reintegra no Subversion e pede ao resto da sua equipe para abrir seus clones locais e puxar as mudanças recolocadas do servidor do Subversion.
A extensão hgsubversion também pode ser usada para converter para o Mercurial. O Mercurial já vem com uma extensão de conversão chamada convert, mas o hgsubversion é famoso por converter melhor alguns repositórios e de modo mais preciso.
O principal problema ao se converter do Subversion (ou realmente, qualquer sistema legado) para o Mercurial é a falta de rigor dos sistemas antigos. O Subversion não tem realmente rótulos e ramos, usa uma convenção rígida que diz que a cópia de trunk/ para branches/foo indica a criação de um ramo chamado “foo”. Mas nada impede que alguém copie metade do trunk/ para branches/foo, ou que faça uma consolidação que modifique arquivos em trunk/ e branches/foo simultaneamente.
Este tipo de “prática” não pode ser representada sempre em um modo significativo no Mercurial, mas o hgsubersion ainda faz um bom trabalho interpretando as intenções dos desenvolvedores.