Subrepos Mercurial - Como você os cria e como eles funcionam?

Situação

Eu tenho duas soluções .NET (Foo eBar) e uma biblioteca comum que contém ProjectA, ProjectB e ProjectC.Foo eBar referenciar um ou mais projetos de biblioteca, mas os projetos de biblioteca não estão localizados dentro doFoo eBar Pastas de solução.

Estrutura de diretório:

-- My Documents*
   -- Development
      -- Libraries
         -- ProjectA
         -- ProjectB
         -- ProjectC
   -- Projects
      -- Foo
         -- Solution
            -- .hg
            -- .hgignore
            -- Foo { Project Folder }
            -- FooTests { Project Folder }
            -- Foo.sln { References ProjectA }
            -- Foo.suo
      -- Bar
         -- Solution
            -- .hg
            -- .hgignore
            -- Bar { Project Folder }
            -- BarTests { Project Folder }
            -- Bar.sln { References ProjectA and ProjectB }
            -- Bar.suo

* infelizmente, ainda estou usando o Windows XP ...

Subrepositórios mercuriais

Objetivo - Quero configurar sub-repositórios para que eu possa armazenar o código-fonte para qualquer projeto de biblioteca referenciado no meuFoo eBar repositórios.

De acordo comesta página (que é literalmente a única documentação que posso encontrar nos sub-repositórios), a configuração de um sub-repositório requer a execução dos seguintes comandos em uma janela do console do DOS:

1| $ hg init main
2| $ cd main
3| $ hg init nested
4| $ echo test > nested/foo
5| $ hg -R nested add nested/foo
6| $ echo nested = nested > .hgsub
7| $ hg add .hgsub
8| $ ci -m "initial commit"

Questões

Qualquer uma ou todas essas etapas podem ser executadas com o TortoiseHG, a partir da versão 0.9.2? Se sim, como? Tenho certeza de que as linhas 1-3 podem, mas não conheço as linhas 4-7. Nada disso parece estar documentado no TortoiseHG.O que o código acima faz (uma explicação linha por linha seria muito apreciada). Aqui estão algumas perguntas específicas que me vieram à mente enquanto eu tentava decifrá-lo:O que> Faz? Tentei pesquisar nos documentos do Mercurial por>, mas não encontrou nada.Na linha 5, eu não entendo o quenested/foo é. Onde fezfoo vem de onde? O que éfoo? Um repositório? Uma pasta?Linha 6 - este aqui me deixa completamente perplexo.Na linha 7, eu assumo.hgsub está sendo adicionado amain? Ou está sendo adicionado anested?Digamos que eu configurei meus sub-repositórios e meuBar o repositório agora está na revisão 10. Se eu tentar atualizar meu diretório de trabalho para a revisão 7, isso causará minhas pastas de biblioteca (My Documents/Development/Libraries/ProjectA e.../Libraries/ProjectB) para atualizar para o que está armazenado na revisão 7 também?

Atualizar

Eu adicionei uma 8a linha de código:ci -m "initial commit". Isso faz duas coisas: (1) adiciona um arquivo .hgsubstate ao repositório principal e (2) confirma todas as alterações, incluindo o novo subrepo no repositório principal (com a mensagem "commit inicial"). O objetivo do arquivo .hgsubstate é acompanhar o estado de todos os sub-repositórios; portanto, se você retornar a uma revisão anterior, ele também obterá a revisão correta de todos os sub-repositórios.

Atualização 2 - algumas instruções

Após mais experimentação, eupensar Agora posso fornecer as etapas para resolver meu problema original (usando principalmente o Windows Explorer e o TortoiseHG):

Criando um subrepo

Libraries/ProjectA, Libraries/ProjectBe os principais repositórios (Projects/Foo/Solution eProjects/Bar/Solution) devem ser repositórios separados.AbrirProjects/Foo/Solution.Clonar deLibraries/ProjectA paraProjects/Foo/Solution.Adicionar, acrescentarProjectA aoFoo repositório.

Use um editor de texto para criar um arquivo chamado.hgsub, contendo o seguinte:

ProjectA = ProjectA

Abra uma janela do console do DOS e digite os seguintes comandos(ver nota abaixo):

cd c:\...\Projects\Foo\Solution
hg ci -m "Committing subrepo "ProjectA"

ParaBar, as etapas são basicamente as mesmas, exceto que o arquivo .hgsub deve conter entradas para os dois projetos, assim:

ProjectA = ProjectA  
ProjectB = ProjectB

Nota: começando com o TortoiseHG 0.10 (previsto para março), você poderá usar oHG Commit comando shell para fazer isso, mas por enquanto, você precisa usar a linha de comando.

Quando tudo está configurado, fica um pouco mais fácil.

Confirmando alterações - confirmar alteraçõesFoo ouBarvocê faz umSynchronize/Pull operação para cada subrepo para sincronizar os subrepostos com as revisões mais recentes nos repositórios de projetos da biblioteca. Então você novamente usa a linha de comando para confirmar as alterações (até a versão 0.10, quando você pode usar o TortoiseHG para confirmar).

Atualizando o diretório de trabalho para uma revisão anterior - Isso parece funcionar normalmente com o TortoiseHG e não parece exigir o uso de nenhum comando do DOS. Para realmente trabalhar com a revisão anterior no Visual Studio, você precisará fazer umaSynchronize/Push operação para colocar a versão mais antiga dos projetos de biblioteca de volta noLibraries/ProjectX pasta.

Por mais que eu goste do TortoiseHG em tarefas simples, provavelmente é melhor gravar arquivos em lote para operações subrepo usadas com freqüência (principalmente atualizações).

Espero que isso ajude alguém no futuro. Se você encontrar algum erro, entre em contato (ou sinta-se à vontade para editar a si mesmo, se puder).

questionAnswers(2)

yourAnswerToTheQuestion