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/ProjectB
e 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
ouBar
você 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).