Sous-dépôts

(Cette page est une traduction de l'original en anglais : subrepos)

/!\ Cette fonctionnalité est considérée comme expérimentale pour Mercurial 1.3 est est sujette à subir des changements

Les sous-dépôts sont une fonctionnalité qui vous permet de traiter avec une collection de dépôts comme un groupe. Ceci vous permettra de cloner, committer, faire des push ou des pull sur des projets et leurs librairies associées comme un groupe.

Usage basique

Commencement

Pour débuter avec l'utilisation des sous-dépôts, vous avez besoin de deux dépôts, un dépôt principal (main) et un dépôt imbriqué (nested) :

$ hg init main
$ cd main
$ hg init nested
$ echo test > nested/foo
$ hg -R nested add nested/foo

Maintenant, nous allons marquer "nested" comme étant un sous-dépôt en créant une entrée pour lui dans le fichier spécial .hgsub. Le premier 'nested' est le chemin d'accès dans notre répertoire de travail, et le second est une URL ou un chemin d'où faire les pull. Ici, nous allons simplement faire des pull depuis 'nested' en utilisant un chemin relatif à notre répertoire main. Ceci signifie que 'n'importe qui pouvant accéder à notre dépôt main peut accéder à notre dépôt nested en suivant nested sur ce chemin'.

$ echo nested = nested > .hgsub
$ hg add .hgsub

Committer

Lorsque nous commitons, Mercurial va tenter de commiter récursivement dans tous les sous dépôts-préalablement définis, puis d'enregistrer leur état résultant dans un fichier spécial .hgsubstate :

$ hg ci -mtest
committing subrepository nested
$ cat .hgsubstate
3f68b2f93426b6966b604536037b5d325ba00741 nested

Structure du répertoire

A ce point de notre exemple, nous avons la structure de répertoires suivante :

  main/
      .hg/
      .hgsub
      .hgsubstate
      nested/
          .hg/
          foo

Avec .hgsub contenant

nested = nested

et .hgsubstate contenant

3f68b2f93426b6966b604536037b5d325ba00741 nested

Mise à jour

Chaque fois qu'une nouvelle version de Mercurial rencontre ce fichier .hgsubstate en mettant à jour votre répertoire de travail, il va tenter de faire un pull des sous-dépôts spécifiés et les mettre à jour à l'état approprié :

$ cd ..
$ hg clone main main2
updating working directory
pulling subrepo nested
requesting all changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files
2 files updated, 0 files merged, 0 files removed, 0 files unresolved
$ cat main2/nested/foo
test

Les sous-dépôts peuvent aussi contenir leurs propres sous-dépôts et Mercurial opérera de façon récursive autant que nécessaire.

Mise en garde

Comme il s'agit d'une nouvelle fonctionnalité complexe, il y a plusieurs points épineux. Considérez ce code comme expérimental et attendez vous à ce que certains comportements changent.

La plupart des commandes comme diff et status sont pour le moment complètement ignorantes des sous-dépôts. Pour le moment, seulement update, commit et push supportent les sous-dépôts.

De plus, il y a plusieurs comportements qui sont pour le moment très mal définis ou implémentés :

En interne

Le format de .hgsub utilise le modèle de configuration de hgrc. Ceci réserve un préfixe source de [ pour d'autres extensions (cf. plus bas). De futures extensions devraient aussi utiliser des sections nommées dans ce fichier.

Le format de .hgsubstate est similaire au format des tags, dans la forme <révision><espace><chemin>. Ce fichier n'est pas supposé être édité à la main mais accepte tout format d'identifiant que Mercurial accepte. Il est aussi automatiquement fusionné lorsque nécessaire. Il est séparé de .hgsub pour éviter que les mises à jour automatiques n'embrouillent ce fichier et pour garder l'historique de .hgsub lisible. L'état combiné peut être visualisé avec hg debugsub.

En interne, l'état des sous dépôts est représenté comme un hash du chemin vers la paire (source,révision) qui combine les éléments des deux fichiers ci-dessus. Il existe aussi un nouveau type d'objet subrepo qui expose un ensemble limité d'opérations sur un sous-dépôt. Les sous-dépôts peuvent être traversés ainsi :

# vérifie si les sous-dépôts sont souillés
c = repo['tip']
for s in c.substate:
    subrepo = c.sub[s]
    print s, subrepo.dirty()

TODO


CategoryFrench

Frenchsubrepos (last edited 2009-11-17 19:14:05 by ÉricAraujo)