Eu sou outro usuário do Subversion lutando para me reeducar no Tao do controle de versão distribuído.
Ao usar o Subversion, eu era um grande fã da abordagem de projeto menor e, com a maioria dos meus ex-empregadores, estruturamos nossas ramificações de repositório; tags e tronco da seguinte forma:
branches-+
+-personal-+
| +-alice-+
| | +-shinyNewFeature
| | +-AUTOMATED-+
| | +-shinyNewFeature
| +-bob-+
| +-AUTOMATED-+
| +-bespokeCustomerProject
+-project-+
+-shinyNewFeature
+-fixStinkyBug
tags-+
+-m20110401_releaseCandidate_0_1
+-m20110505_release_0_1
+-m20110602_milestone
trunk
Dentro da própria árvore de origem, usaríamos (algo como) a seguinte estrutura:
(src)-+
+-developmentAutomation-+
| +-testAutomation
| +-deploymentAutomation
| +-docGeneration
| +-staticAnalysis
| +-systemTest
| +-performanceMeasurement
| +-configurationManagement
| +-utilities
+-libraries-+
| +-log-+
| | +-build
| | +-doc
| | +-test
| +-statistics-+
| | +-build
| | +-doc
| | +-test
| +-charting-+
| | +-build
| | +-doc
| | +-test
| +-distributedComputing-+
| | +-build
| | +-doc
| | +-test
| +-widgets-+
| +-build
| +-doc
| +-test
+-productLines-+
| +-flagshipProduct-+
| | +-coolFeature
| | +-anotherCoolFeature
| | +-build
| | +-doc
| | +-test
| +-coolNewProduct
+-project-+
+-bigImportantCustomer-+
| +-bespokeProjectOne
| +-bespokeProjectTwo
+-anotherImportantCustomer-+
+-anotherBespokeProject
A idéia era (e ainda é) usar a estrutura do repositório para ajudar a estruturar a comunicação entre a equipe de engenharia; a parte do negócio voltada para o cliente e vários outros interessados e especialistas em domínio.
A saber: os documentos de origem que estão em um dos diretórios "projeto" são usados (e ganham dinheiro) apenas uma vez. Os documentos que estão em um dos diretórios "productLines" ganham dinheiro quantas vezes um produto dessa linha específica é vendido. Os documentos que ficam em um dos diretórios de "bibliotecas" ganham dinheiro tantas vezes quanto os produtos que os utilizam são vendidos.
Isso torna explícita a noção de amortização de custos e ajuda a criar suporte para a reutilização de documentos de origem nos negócios.
Isso também significa que existe uma estrutura comum sobre a qual nossas ferramentas de automação de construção podem operar. (Nossos scripts de construção percorrem a árvore de origem procurando por pastas "construídas", nas quais eles encontram arquivos de configuração que especificam como cada componente deve ser construído; um processo semelhante ocorre para geração e teste de documentação).
Significativamente, os produtos nos quais trabalho normalmente levam muito tempo para executar testes de medição e caracterização de desempenho; de 20 a 200 horas; gerar algo entre vários GB e vários TB de resultados de testes processados / dados intermediários (que devem ser armazenados e vinculados a uma configuração específica do sistema para que a melhoria de desempenho ao longo do tempo possa ser medida). Esse problema torna o gerenciamento de configuração uma consideração importante e também impõe alguns requisitos para centralização, pois geralmente os recursos computacionais necessários para executar os testes de medição e caracterização de desempenho são limitados; (um pequeno cluster de 64 a 128 núcleos).
Como uma nota final; o sistema de integração contínua sabe que precisa acionar uma compilação; análise estática; teste de fumaça e teste de unidade sempre que o tronco é modificado, toda vez que qualquer ramificação "tag" é modificada e cada vez que qualquer ramificação "AUTOMATIZADA" é modificada. Dessa forma, desenvolvedores individuais podem usar o sistema de IC com suas ramificações pessoais, um recurso importante, o IMHO.
Agora, aqui está a minha pergunta: como posso replicar todas as opções acima (e melhorar, se possível) com o Mercurial.
--editar:
Minha linha de pensamento atual é usar um repositório central do Subversion, para definir a estrutura geral, mas permitir o uso do hg como um cliente para que os desenvolvedores possam ter repositórios disponíveis localmente.