44 votes

Puis-je cloner une partie d'un dépôt Mercurial?

Est-il possible de cloner une partie d'un dépôt Mercurial? Disons que le référentiel est assez grand, ou contient plusieurs projets, ou de plusieurs branches. Puis-je cloner une partie seulement du référentiel?

E. g. dans Subversion, vous pourriez avoir trunk et branches. Si je ne veux obtenir tronc (ou l'une des branches) je peux juste demander [project]/trunk. Si je clone du hg repo je vais obtenir tronc et toutes les branches. Cela peut être beaucoup d'informations que je ne veux pas. Puis-je éviter cela?

Sinon, si je veux avoir plusieurs projets dans un hg repo, comment dois-je faire? I. e. de sorte que je puisse obtenir l'un des projets et d'ignorer les autres.

37voto

Andy Edinborough Points 2311

Oui, vous pouvez. Je suis sûr que vous avez déplacé sur, mais pour le bien de ceux qui errent ici plus tard, j'ai suivi la documentation à http://mercurial.selenic.com/wiki/ConvertExtensionet écrit un simple script batch:

@echo off
echo Converting %1
REM Create the file map
echo include %1 > ~myfilemap               
echo rename %1 . >> ~myfilemap 
REM Run the convert process
hg convert --filemap ~myfilemap .\ ..\%1   
REM Delete the file map
del ~myfilemap                             
cd ..\%1
REM update the new repo--to create the files
hg update                                  

Nom de quelque chose comme split.cmd, et le mettre dans le répertoire pour les pensions de titres que vous voulez diviser. Disons par exemple que vous avez C:\repos\ReallyBigProject, et un sous-dossier est - C:\repos\ReallyBigProject\small-project. À l'invite de commandes, exécutez:

cd\repos\ReallyBigProject
split.cmd small-project

Cela permettra de créer C:\repos\small-project d'une tranche de l'histoire pertinente de révisions du projet de plus grande envergure.

L' convert n'est pas activé par défaut. Vous devez assurez-vous que les lignes suivantes existent dans votre .hg\hgrc le fichier (c:\repos\ReallyBigProject\.hg\hgrc dans mon exemple):

[extensions]
hgext.convert=

17voto

Savageman Points 3183

À ma connaissance, ce n'est pas possible. Mais par rapport à Subversrion, le clonage de l'ensemble du repos ne peut pas être plus lent que juste une branche à partir de SVN.

Citant http://mercurial.selenic.com/wiki/UnderstandingMercurial:

De nombreux SVN/CVS les utilisateurs s'attendent à accueillir projets liés ensemble dans un référentiel. Ce n'est vraiment pas ce que hg a été faite, de sorte que vous devriez essayer une autre façon de travailler. Cette en particulier signifie, que vous ne pouvez pas découvrez un seul répertoire d'un référentiel.

Si vous avez absolument besoin de l'hôte plusieurs projets dans une sorte de méta-référentiel cependant, vous pouvez essayer le Subrepositories fonctionnalité qui a été introduit avec Mercurial 1.3 ou l' âgées ForestExtension.

16voto

quark Points 7773

@Nick

"E. g. dans Subversion, vous pourriez avoir le tronc et les branches. Si je ne veux obtenir tronc (ou l'une des branches) je peux juste demander [projet]/tronc. Si je clone du hg repo je vais obtenir tronc et toutes les branches. Cela peut être beaucoup d'informations que je ne veux pas. Puis-je éviter cela?"

Absolument. Suffit d'utiliser hg clone -r <branch> et obtenir que la branche que vous souhaitez. Si vous avez beaucoup de branches, vous avez besoin d'un -r <branch> pour chacun. <branch> n'a pas à être une branche nommée: vous pouvez tout simplement avoir plusieurs têtes sans nom (ou le nom têtes à l'aide d'un signet, si ceux-ci ne sont toujours pas parfait, parce qu'actuellement, ils ne se présentent pas avec push/pull/clone).

Gardez à l'esprit que dans DVCSes, Mercurial parmi eux, les branches sont souvent de courte durée et fusionnées les unes dans les autres souvent. Si vous tirez sur une branche, vous recevrez une histoire commune avec toutes les autres branches.

6voto

quark Points 7773

@Nick a dit:

"C'est un assez gros omission puisque beaucoup de sites d'hébergement offrent seulement un repo. Avec svn je peux avoir autant de repos que je veux, en ne prenant une branche de la principale. Le subrepos sonne comme un hack."

Subrepos (aka submodules) ne sont pas aussi idéale qu' "étroit clones", c'est vrai. Mais au moins pour avoir beaucoup de projets distincts dans un site d'hébergement de référentiel, vous pouvez avoir plusieurs code-bases dans un référentiel. Cela ne vous permettra pas de découper les différentes sections d'un référentiel / sous-répertoires d'un projet , mais il va vous permettre de gérer de multiples projets. Ce que vous faire est d'avoir beaucoup d'nommé branches chaque racine est le vide (ou nulle) de l'ensemble de modifications (c'est à dire qu'ils ont pas de racine commune révision). Il peut obtenir un peu désordonné pour suivre les branches mais il fonctionne.

Par exemple:

hg init
hg branch project-1
# Changes, commits, repeated as needed
hg update null
hg branch project-2
# Changes, commits, repeated as needed

Maintenant, vous pouvez voir tous vos projets:

> hg branches
project-2                      5:42c2beffe780
project-1                      2:43fd60024328

Les projets ne sont pas liés (si vous pouvez les fusionner):

> hg debugancestors
-1:000000000000

Le plus utilement: vous pouvez cloner seulement le projet que vous souhaitez, et les autres ne se mélangent pas dans:

> hg clone <repository> -r project-1

Le graphe de cette ressemblerait à quelque chose comme ceci (hg log -qG):

@  5 | project-2 | {tip}
|
o  4 | project-2
|
o  3 | project-2

o  2 | project-1
|
o  1 | project-1
|
o  0 | project-1

Vous pouvez le faire pour autant de projets que vous le souhaitez, l'inscription de chacun avec hg branches, et le saut d'entre eux avec des hg update. Cela prend quelques soins, parce que nommé soutien branche n'est pas parfait. Il n'est pas toujours facile pour une chose (lire à propos de hg clone -u dans Mercurial 1.4-le pre-1.4 comportement est surprenant lors du clonage). Mais il ne le travail.

5voto

notnoop Points 30218

Mercurial et Git seulement permis le clonage sur l'ensemble du référentiel. Ainsi, il est recommandé que chaque projet possède son propre référentiel.

Mercurial a un forest extension à l'aise d'avoir une "forêt" pour projet de dépôts. L'extension continue chaque projet dans un autre référentiel, mais fournit des options de mise à jour/pousser/tirer toute la forêt dépôts ensemble.

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