74 votes

Clone partiel avec Git et Mercurial

Est-il possible de cloner seulement une branche (ou à partir d'un commit donné) dans Git et Mercurial ? Je veux dire que je veux cloner un repo central mais comme il est énorme, j'aimerais n'en récupérer qu'une partie tout en étant capable de contribuer à mes modifications. Est-ce possible ? Par exemple, je veux seulement à partir du Tag 130 ou quelque chose comme ça ?

Si oui, comment ?

1 votes

Voir aussi Git 2.17 clone partiel (ou "clone étroit") stackoverflow.com/a/48852630/6309

76voto

Jakub Narębski Points 87537

A Git land, vous parlez de trois types différents de clones partiels :

  • des clones peu profonds : Je veux l'histoire à partir du point de révision X.

    Utilisez git clone --depth <n> <url> pour cela, mais n'oubliez pas que les clones superficiels sont quelque peu limités dans l'interaction avec d'autres dépôts. Vous seriez en mesure de générer des correctifs et de les envoyer par e-mail.

  • clone partiel par chemin de fichier : Je veux que tous les historiques de révision soient dans un répertoire /path .

    Pas possible dans Git. Avec Git moderne, vous pouvez cependant avoir vérification éparse Vous disposez de l'ensemble de l'historique mais vous ne pouvez extraire (avoir dans la zone de travail) qu'un sous-ensemble de tous les fichiers.

  • cloner uniquement la branche sélectionnée : Je veux cloner une seule branche (ou un sous-ensemble sélectionné de branches).

    Possible, et

    Avant git 1.7.10, ce n'était pas simple : il fallait faire ce que clone fait manuellement, à savoir git init [<directory>] entonces git remote add origin <url> , modifier .git/config remplacement de * en remote.origin.fetch par la branche demandée (probablement 'master'), puis git fetch .

    à partir de git 1.7.10 git clone offre le --single-branch qui semble avoir été ajoutée dans ce but, et qui semble assez facile.

    Notez cependant qu'étant donné que les branches partagent généralement la plupart de leur histoire, le gain obtenu en clonant seulement un sous-ensemble de branches peut être plus petit que vous ne le pensez.

Vous pouvez également effectuer un clonage superficiel d'un sous-ensemble de branches sélectionnées.

Si vous savez comment les gens voudront décomposer les choses par chemin de fichier (plusieurs projets dans le même dépôt), vous pouvez utiliser des submodules (un peu comme svn:externals) pour pré-diviser le dépôt en portions clonables séparément.

0 votes

Donc, si je clone la branche "XX", elle obtiendra tous les commits parents de "master", n'est-ce pas ? Ou seulement le seul commit que j'ai fait sur cette branche ?

1 votes

Si vous clonez (récupérez) uniquement la branche "XX", vous obtiendrez tous ses commits, y compris ceux que la branche "XX" a en commun avec la branche "master". Dans Git, les commits ne sont pas ' appartenir à ' à une branche.

0 votes

Ok, alors ce n'est pas un clone partiel de toute façon puisque vous obtenez tous les parents et donc le dépôt entier (ok, la plus grande partie qui est sur master).

51voto

Ry4an Points 56453

Au pays du mercure, on parle de trois types différents de clones partiels :

  • des clones superficiels : Je veux l'historique à partir du point de révision X. utiliser le extension remotefilelog
  • clones partiels par chemin de fichier : Je veux tout l'historique des révisions dans le répertoire /path avec expérimental extension de l'étroitesse des liens ou je veux que seuls les fichiers du répertoire /path soient dans mon répertoire de travail avec extension éparse expérimentale (livré depuis la version 4.3, voir hg help sparse ).
  • des clones partiels par branche : Je veux tout l'historique des révisions sur la branche Y : utiliser clone -r

Si vous savez comment les gens voudront décomposer les choses par chemin de fichier (plusieurs projets dans le même dépôt (honte à vous)), vous pouvez utiliser des sous-référentiels (un peu comme les externes de svn) pour pré-diviser le dépôt en portions clonables séparément.

Par ailleurs, pour ce qui est du "tellement énorme que j'aimerais n'en avoir qu'une partie" : Vous n'avez vraiment à le faire qu'une seule fois. Il suffit de le cloner pendant que vous déjeunez, et vous l'aurez pour toujours. Par la suite, vous pouvez pull et obtenir des deltas de manière efficace à l'avenir. Et si vous voulez un autre clone, clonez simplement votre premier clone. L'endroit où vous avez obtenu un clone n'a pas d'importance (et les clones locaux ne prennent pas d'espace disque supplémentaire puisqu'il s'agit de liens durs sous les couvertures).

1 votes

De plus, les balises ne sont pas les mêmes que les branches, contrairement à certains VCS, ce qui relève du premier point.

0 votes

Il y a l'histoire de l'émondage ( mercurial.selenic.com/wiki/TrimmingHistory ) et le clone peu profond ( mercurial.selenic.com/wiki/ShallowClone ) plugins pour mercurial. Je ne sais pas s'ils sont bons, cependant.

8 votes

Il s'agit dans les deux cas de propositions rejetées sans mise en œuvre.

6voto

rossmic Points 51

Cette méthode crée une archive non versionnée sans sous-dépôts :

hg clone -U ssh://machine//directory/path/to/repo/project projecttemp

cd projecttemp

hg archive -r tip ../project-no-subrepos

Le code source non versionné sans les sous-répertoires se trouve dans le répertoire project-no-subrepos.

2voto

user7610 Points 820

En ce qui concerne Git, le fait que Linus Torvalds ait répondu à cette question d'un point de vue conceptuel en 2007, lors d'une conférence enregistrée et disponible en ligne, pourrait avoir une importance historique.

La question est de savoir s'il est possible d'extraire seulement certains fichiers d'un dépôt Git.

Tech Talk : Linus Torvalds sur git t=43:10

Pour résumer, il a dit que l'une des décisions de conception de Git qui le distingue des autres systèmes de gestion des sources (il cite BitKeeper et SVN) est que Git gère le contenu, pas les fichiers. Les implications sont que, par exemple, une différence d'un sous-ensemble de fichiers dans deux révisions est calculée en prenant d'abord la différence entière et ensuite en l'élaguant seulement aux fichiers qui ont été demandés. Une autre conséquence est que vous devez vérifier l'ensemble de l'historique, dans un mode tout ou rien. C'est pourquoi il suggère de répartir des composants peu liés entre plusieurs dépôts et mentionne un effort en cours pour mettre en œuvre une interface utilisateur permettant de gérer un dépôt structuré comme un super-projet contenant des dépôts plus petits.

Pour autant que je sache, cette décision de conception fondamentale s'applique toujours aujourd'hui. Le truc du super-projet est probablement devenu ce que sont maintenant sous-modules .

1 votes

Je connais le post... Je l'ai soumis à l'origine sur slashdot :P

-1voto

Dan Christian Points 11

Dans mercurial, vous devriez être en mesure d'utiliser une partie de ceci :

hg convert --banchmap FILE SOURCEDEST REVMAP

Vous pouvez aussi vouloir :

--config convert.hg.startrev=REV

La source peut être git, mercurial, ou une variété d'autres systèmes.

Je ne l'ai pas essayé, mais convert est assez riche.

4 votes

L'extension Convert réécrit les hashs, ce n'est donc pas un clone partiel du dépôt existant mais plutôt un nouveau dépôt. C'est-à-dire qu'il s'agit d'un dépôt séparé qui ne peut ni tirer ni pousser depuis le dépôt original.

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