web-dev-qa-db-fra.com

Comment cloner un sous-dossier d'un référentiel dans Mercurial?

J'ai un référentiel Mercurial contenant une poignée de projets connexes. Je souhaite créer un seul de ces projets pour travailler ailleurs.

Le clonage n'est-il qu'une partie d'un référentiel possible, et est-ce la bonne façon d'y parvenir?

61
James Hopkin

Ce que vous voulez, c'est un clone étroit ou partiel , mais ce n'est malheureusement pas encore pris en charge.

Si vous avez déjà un grand référentiel et que vous réalisez qu'il serait logique de le diviser en plusieurs référentiels plus petits, vous pouvez utiliser extension de conversion pour faire un Mercurial en conversion Mercurial . Notez que cela crée un nouveau référentiel foo et vous ne pouvez pas pousser/tirer entre your-big-repo et foo.

Le convert extension n'est pas activé par défaut, alors ajoutez ce qui suit au fichier hgrc de votre dépôt ou à votre Mercurial.ini fichier:

[extensions]
hgext.convert=

Ensuite, créez un map.txt fichier avec

include "libs/foo"
rename "libs/foo" .

(notez que vous pouvez utiliser des barres obliques même sous Windows) et exécuter

$ hg convert --filemap map.txt your-big-repo foo

Cela fera de foo un référentiel avec l'historique complet du libs/foo dossier de your-big-repo.

Si vous souhaitez supprimer toutes les preuves de foo de your-big-repo vous pouvez effectuer une autre conversion là où vous utilisez exclude libs/foo pour se débarrasser du répertoire.

Lorsque vous avez plusieurs référentiels comme celui-ci et que vous souhaitez les utiliser dans leur ensemble, vous devriez regarder sous-référentiels . Cette fonctionnalité vous permet d'inclure d'autres référentiels dans une extraction, de la même manière que svn:externals travail. Veuillez suivre les recommandations sur cette page wiki.

53
Martin Geisler

Au lieu de faire un clone partiel, vous pouvez utiliser Convert Extension pour diviser votre dépôt en plusieurs dépôts par sous-référentiel.

Plus précisément, voir la section, Conversion à partir de Mercurial :

Il est également utile de filtrer les référentiels Mercurial pour obtenir des sous-ensembles d'un référentiel existant. Par exemple, pour transformer un sous-répertoire d'un sous-répertoire d'un dépôt toto en un dépôt avec sa propre vie (tout en conservant son historique complet), procédez comme suit:

$ echo include subfoo > /tmp/myfilemap
$ echo rename subfoo . >> /tmp/myfilemap
$ hg convert --filemap /tmp/myfilemap /path/to/repo/foo /tmp/mysubfoo-repo
12
Nathan Lee

Je suis tombé sur ce problème et j'ai trouvé un moyen de le faire: utiliser des liens symboliques (Linux uniquement malheureusement)

Par exemple, si vous n'avez besoin que de /project dans le référentiel, sur votre ordinateur, clonez le référentiel dans un autre dossier, puis utilisez ln -s /repo/location/ project. Mercurial s'en chargera

6
TheLQ

(Fin 2016) Mainline Mercurial ne prend toujours pas en charge les "clones étroits", mais il existe des extensions tierces qui abordent le problème de différentes manières.

Si vous pouvez faire face à une simple extraction étroite (alias "extraction éparse" ou "extraction partielle par chemin de fichier"), alors le sparse.py extension du référentiel hg-experimental (regardez à l'intérieur du hgext3rd/ répertoire) peut être exploitable. Dans ce scénario, vous clonez toujours l'historique complet (ainsi le répertoire .hg n'est pas plus petit) mais votre répertoire de travail n'affiche/agit que sur un sous-ensemble du référentiel complet.

Alternativement, Google a créé un extension NarrowHG qui fait un clonage étroit (alias "clonage partiel par chemin de fichier"). Vous devrez être en contrôle du serveur, du client et être prêt à utiliser des fonctionnalités expérimentales, mais cela restreint vraiment l'historique copié du clone dans .hg à un sous-ensemble de ce qui était dans le référentiel d'origine.

(2019) L'extension sparse a été fusionnée dans Mercurial 4. comme extension expérimentale sparse . L'extension NarrowHG a été fusionnée dans Mercurial 4.6 comme hgext.narrow extension.

3
Anon

Ce n'est pas possible, hg clone clonera tout le référentiel.

Vous pouvez jeter un œil à l'extension de sous-référentiel qui vous permet d'avoir des référentiels dans un référentiel, ce qui pourrait correspondre à vos besoins.

3
Romain

C'est simple avec le Convertir l'extension .

2
cheenu