2010-12-16 149 views
18

Mon projet est composé de code dans les endroits suivantsUn sous-répertoire mercuriel doit-il être un sous-répertoire du référentiel principal?

C:\Dev\ProjectA 
C:\Lib\LibraryB 
C:\Lib\LibraryC 

Actuellement, chacun de ces dossiers est un dépôt Mercurial complètement indépendant. Le projet A change tout le temps, la bibliothèque B et la bibliothèque C changent rarement.

Je marque actuellement chaque version du projet A au moment de sa publication et (si je me souviens bien) placez une étiquette correspondante dans les répertoires de bibliothèque B et C. Puis-je améliorer cette situation en utilisant des sous-dépôts? Est-ce que cela m'obligerait à faire de la bibliothèque B et C un sous-répertoire du projet A? Si la bibliothèque B et C doivent être des sous-répertoires du projet A, que dois-je faire si je veux démarrer un projet D qui utilise la bibliothèque B mais qui n'est pas affiliée au projet A?

Répondre

18

Si la bibliothèque B et C doivent être sous-répertoires du projet A quoi dois-je faire si je veux commencer un projet D que utilise la bibliothèque B, mais n'est pas autrement affilié à Project A tout?

Tout projet peut exister à la fois indépendamment et comme subrepository d'un autre projet en même temps. Je vais expliquer en suggérant un flux de travail.

Tout d'abord, chacun de vos projets (A, B, C) devraient avoir un dépôt béni qui est publié quelque part:

blessed repository

Vous pouvez exécuter hgwebdir sur votre propre serveur, ou utiliser d'un service d'hébergement Mercurial comme Bitbucket ou Kiln. De cette façon, les développeurs ont un point d'autorité central pour tirer/pousser les changements, et vous avez quelque chose à faire des sauvegardes.

Vous pouvez maintenant faire des clones de ces dépôts à travailler de deux manières différentes:

  • clone directement votre projet. Par exemple:

    hg clone http://bitbucket.org/LachlanG/LibraryB C:\Lib\LibraryB 
    
  • et/ou créer des définitions subrepository en mettant un fichier .hgsub à la racine de ProjectA avec le contenu suivant:

    libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB 
    libraries/libraryC = http://bitbucket.org/LachlanG/LibraryC 
    

Ces définitions subrepository disent Mercurial que chaque fois que le projet A est cloné, il doit également placer des clones de la bibliothèque B et de la bibliothèque C dans le dossier libraries.

Si vous travaillez dans le projet A et validez, vos modifications dans libraries/LibraryB et libraries/LibraryC seront également validées. Mercurial enregistrera quelle version des bibliothèques est utilisée par le projet A dans le fichier .hgsubstate. Le résultat est que si vous hg update à une ancienne version du projet pour voir comment les choses ont fonctionné la semaine dernière, vous obtenez également la version correspondante de vos bibliothèques. Vous n'avez même pas besoin de créer des balises :-)

Lorsque vous modifiez le projet A dans le référentiel béni hg push, Mercurial veille également à repousser les modifications de sous-dépôt vers leur origine. De cette façon, vous ne publiez jamais accidentellement des modifications de projet qui dépendent de modifications de bibliothèque non publiées.

Si vous préférez conserver tout en local, vous pouvez toujours utiliser ce flux de travail en utilisant des chemins relatifs au lieu des URL dans les définitions de sous-dépôt.

+0

Où est le dossier des bibliothèques que vous mentionnez à la fin de la phrase, "Ces définitions de sous-dépôt indiquent que chaque fois que projectA est cloné, il doit également placer des clones de LibraryB et LibraryC dans le dossier libraries. – LachlanG

+0

C'est juste un dossier, la partie gauche de: libraries/libraryB = http://bitbucket.org/LachlanG/LibraryB est où le clone du côté droit devrait être –

+0

@LachlanG: il apparaîtra dans la racine du ProjectA clone, par exemple 'C: \ Dev \ ProjectA \ libraries \'. –

2

Vous pouvez en effet déclarer B et C subrepos du projet A (ils apparaissent comme sous-répertoire, comme décrit dans Mercurial Subrepository).
Cela permettrait d'améliorer votre mécanisme de libération car il vous permettra de:

  • obtenir les prises en pension dans un seul endroit (A et moins)
  • référence une étiquette exacte de B et C sous A
  • tag chaque sous-repo s premier s'ils avaient une modification
  • étiquette A avec les informations sur B et C tags dedans (tout clone de A sera en mesure d'obtenir l'exa balises ct de B et C utilisés par A)

Vous pouvez également déclarer B comme subrepo de D, indépendamment de A. Ce que vous faites dans A (concernant B) n'aura aucune conséquence pour B utilisé dans D.