36 votes

Mercurial Subrepos - Comment les créez-vous et comment fonctionnent-ils?

Situation

J'en ai deux .NET solutions (Foo et Bar) et d'une bibliothèque commune qui contient ProjectA, Projetb, et ProjectC. Foo et Bar référence à une ou plusieurs projets de la bibliothèque, mais les projets de la bibliothèque ne sont pas situés dans l' Foo et Bar Solution de dossiers.

Structure de répertoire:

-- 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

*hélas, je suis encore sous Windows XP...

Mercurial Subrepositories

Objectif - je veux mettre en place subrepos de sorte que je peux stocker le code source de tous référencés de la bibliothèque de projets dans ma Foo et Bar des dépôts.

Selon cette page (qui est littéralement la seule documentation que je peux trouver sur subrepos), la création d'un subrepo nécessite l'exécution des commandes suivantes à partir d'une fenêtre de la console 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"

Questions

  1. Pouvez tout ou partie de ces mesures soient exécutées avec TortoiseHG, à partir de la version 0.9.2? Si oui, comment? Je suis sûr que les lignes 1 à 3, mais je ne sais pas sur les lignes 4-7. Rien de tout cela semble être documenté dans TortoiseHG.
  2. Que fait le code ci-dessus n' (ligne par ligne explication serait très apprécié). Voici quelques questions me sont venues à l'esprit pendant que j'essayais de déchiffrer:
    • Qu'est - > faire? J'ai essayé de chercher par le biais de l'Mercurial docs pour >, mais ne trouve rien.
    • Dans la ligne 5, je ne comprends pas ce qu' nested/foo est. Où avez - foo proviennent de? Qu'est - foo? Un référentiel? Un dossier?
    • Ligne 6 - celui-ci me déroute complètement.
    • À la ligne 7, je suppose .hgsub est ajouté à de la main? Ou est-il ajouté à de la nested?
  3. Disons que je reçois mon subrepos mis en place, et mon Bar référentiel est maintenant à la révision 10. Si je tente de mettre à jour mon répertoire de travail pour la révision 7, est-ce la cause de mon dossiers de la bibliothèque (My Documents/Development/Libraries/ProjectA et .../Libraries/ProjectB) de mettre à jour à tout ce qui est stocké dans la révision 7 ainsi?

Mise à jour

J'ai ajouté un 8 ligne de code: ci -m "initial commit". Cela ne signifie deux choses: (1) ajoute une .hgsubstate fichier à la principale repo et (2) valide toutes les modifications, y compris les nouvelles subrepo dans le dépôt principal (avec le message "initial s'engager"). Le but de l' .hgsubstate fichier est de garder une trace de l'état de tous les subrepos, donc si vous revenez à une version antérieure, il va saisir la révision correcte de tous les subrepos ainsi.


Mise à jour 2 - quelques instructions

Après d'autres expériences, je pense que je peux maintenant donner les étapes à suivre pour résoudre mon problème d'origine (en utilisant principalement l'Explorateur Windows et TortoiseHG):

La création d'un subrepo

  1. Libraries/ProjectA, Libraries/ProjectB, et les principaux référentiels (Projects/Foo/Solution et Projects/Bar/Solution) doit être séparé des dépôts.
  2. Ouvrez Projects/Foo/Solution.
  3. Clone Libraries/ProjectA de Projects/Foo/Solution.
  4. Ajouter ProjectA de la Foo référentiel.
  5. Utilisez un éditeur de texte pour créer un fichier appelé .hgsub, contenant les éléments suivants:

    ProjectA = ProjectA
    
  6. Ouvrez une fenêtre de la console DOS et entrez les commandes suivantes (voir la note ci-dessous):

    cd c:\...\Projects\Foo\Solution
    hg ci -m "Committing subrepo "ProjectA"
    
  7. Pour Bar, les étapes sont fondamentalement les mêmes, à l'exception de l' .hgsub fichier doit contenir des entrées pour les deux projets, comme ceci:

    ProjectA = ProjectA  
    ProjectB = ProjectB
    

Remarque: en commençant par TortoiseHG 0.10 (qui est prévue pour le mois de Mars), vous serez en mesure d'utiliser l' HG Commit commande shell pour ce faire, mais pour l'instant, vous devez utiliser la ligne de commande.

Une fois que c'est tous ensemble, ça devient un peu plus facile.

Livrer des changements - de valider les modifications apportées à l' Foo ou Bar, vous faites un Synchronize/Pull opération pour chaque subrepo pour obtenir le subrepos en phase avec les dernières révisions du projet de bibliothèque de référentiels. Ensuite, vous utilisez la ligne de commande pour valider les modifications (jusqu'à la version 0.10, quand vous pouvez simplement utiliser TortoiseHG à valider).

La mise à jour de répertoire de travail à une révision antérieure - Ce qui semble fonctionner assez normalement avec TortoiseHG et ne semble pas nécessiter l'utilisation de toutes les commandes DOS. Travailler avec la version antérieure de Visual Studio, vous aurez besoin de faire un Synchronize/Push opération pour mettre l'ancienne version de la bibliothèque de projets de retour dans l' Libraries/ProjectX le dossier.

Autant que j'aime TortoiseHG pour les tâches simples, il est probablement mieux d'écrire des fichiers batch sont le plus fréquemment utilisé subrepo opérations (en particulier de la mise à jour).

Espérons que cela aide quelqu'un dans l'avenir. Si vous voyez des erreurs, s'il vous plaît laissez-moi savoir (ou se sentir libre de modifier vous-même si vous en êtes capable).

20voto

Ry4an Points 56453

Vous pourriez probablement essayer ce genre de choses et en apprendre plus rapidement que la rédaction de votre question, mais je vais mordre.

Pouvez tout ou partie de ces mesures exécuté avec TortoiseHG, comme de la version 0.9.2? Si oui, comment?

TortiseHG n'a pas encore mis GUI wrappers autour de sous-pensions de création, mais TortiseHG a toujours fait un excellent travail avec la ligne de commande. Utiliser la ligne de commande pour créer et eux et vous êtes bon pour aller.

Ce n' le code ci-dessus n' (ligne par ligne explication serait beaucoup apprécié).

hg init main  # creates the main repo
cd main # enter the main repo
hg init nested # create the nested. internal repo
echo test > nested/foo # put the word test into the file foo in the nested repo
hg -R nested add nested/foo # do an add in the nested repo of file foo
echo nested = nested > .hgsub # put the string "nested = nested" into a file (in main) named .hgsub
hg add .hgsub # add the file .hgsub into the main repo

Voici quelques les questions qui viennent à l'esprit comme je l'ai été essayer de le déchiffrer: Ce n' > faire?

Qui n'a rien à voir avec mercurial c'est la norme shell (unix et dos) pour "mettre le résultat dans un fichier nommé X"

Dans la ligne 5, je n'ai pas comprendre ce imbriquée/foo est. Où n'foo viennent? Qu'est-ce que toto? Un référentiel? Un dossier?

C'est un fichier dans le subrepo. Toto est un traditionnel nom arbitraire, et l'arbitraire le contenu sont la chaîne "test"

Ligne 6 - ce on me déroute complètement.

Il s'agit de mettre le contenu dans .hgsub faut dire que imbriquée est imbriquée repo nommé imbriquées et situé à imbriqués.

À la ligne 7, Je l'assume .hgsub est ajouté à de la principal? Ou est-elle ajouté imbriquées?

principal

Disons que je reçois mon subrepos mis en place, et ma Barre de dépôt jusqu'à révision 10. Si je tente de mettre à jour révision 7, est-ce la cause de ma bibliothèque les dossiers (Mes Documents/Développement/Bibliothèques/ProjectA et .../Bibliothèques/Projetb) pour mettre à jour pour ce qui est stocké dans la révision 7 comme bien? Étant donné que Toto se réfère également à Les bibliothèques/ProjectA, cela pourrait se intéressant!

Les numéros de révision ne porte pas à travers, mais vous avez le contrôle par l'édition de l' .hgsubstate fichier.

6voto

Mark Booth Points 2710

Juste une petite mise à jour, après la sortie de TortoiseHg 1.0.

Le subrepo soutien dans THG 1 est assez bon pour ne vous laisser faire exemple les étapes à partir de l'Explorateur Windows. Le seul que je ne pouvais pas le faire à partir de l'Explorateur a l'étape 6:

echo nested = nested > .hgsub

L'explorateur Windows (XP au moins) signale un changement de nom d'erreur "Vous devez taper un nom de fichier." si vous essayez de renommer "Nouveau Texte Document.txt" pour ".hgsub". *8')

Edit: d'ailleurs, si vous utilisez à la fois hg via TortoiseHg et de la ligne de commande et que vous n'avez pas Microsoft de la Commande "Ici" PowerTool installé, je la recommande fortement. Il ajoute une "Ouvrir la Fenêtre de Commande Ici" du menu contextuel de chaque répertoire dans l'Explorateur Windows, ce qui rend très facile à ouvrir des fenêtres de commande n'importe où vous en avez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X