web-dev-qa-db-fra.com

Clone partiel avec Git et Mercurial

Est-il possible de cloner une seule branche (ou à partir d'un commit donné) dans Git et Mercurial? Je veux dire, je veux cloner un référentiel central, mais comme c'est énorme, je ne voudrais en obtenir qu'une partie et pouvoir continuer à apporter mes modifications. C'est possible? Comme, je veux seulement à partir du Tag 130 ou quelque chose comme ça?

Si c'est le cas, comment?

73
pablo

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

  • clones superficiels: Je veux l'historique à partir du point de révision X.

    Utilisez git clone --depth <n> <url> pour cela, mais n'oubliez pas que les clones peu profonds sont quelque peu limités dans l'interaction avec d'autres référentiels. 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 tout l'historique des révisions dans un répertoire /path.

    Pas possible dans Git. Avec Git moderne, vous pouvez avoir extraction clairsemée, c'est-à-dire que vous avez tout l'historique mais que vous extrayez (avez dans la zone de travail) seulement un sous-ensemble de tous les fichiers.

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

    Possible, et

    avant git 1.7.10 pas simple: vous devez faire ce que le clone fait manuellement, c'est-à-dire git init [<directory>], puis git remote add Origin <url>, Éditer .git/config remplaçant * dans remote.Origin.fetch par la branche demandée (probablement 'master'), puis git fetch.

    à partir de git 1.7.1git clone offre le --single-branch option qui semble avoir été ajoutée juste à cet effet et semble assez facile.

    Notez cependant que, comme les branches partagent généralement la majeure partie de leur historique, le gain du clonage d'un sous-ensemble de branches seulement peut être inférieur à ce que vous pensez.

Vous pouvez également faire un clone superficiel de seulement un sous-ensemble de branches sélectionné.

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

75
Jakub Narębski

Dans Mercurial land, vous parlez de trois types différents de clones partiels:

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

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

Aussi, en ce qui concerne "l'énorme j'aimerais en avoir seulement une partie": vous n'avez vraiment à le faire qu'une seule fois. Il suffit de le cloner pendant que vous déjeunez, puis vous l'avez pour toujours plus. Par la suite, vous pouvez pull et obtenir des deltas efficacement à l'avenir. Et si vous en voulez un autre, 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 car ils sont des liens durs sous les couvertures).

49
Ry4an Brase

La réponse sélectionnée donne un bon aperçu, mais il manque un exemple complet.

Réduisez votre empreinte de téléchargement et de paiement (a) , (b) :

git clone --no-checkout --depth 1 --single-branch --branch (name) (repo) (folder)
cd (folder)
git config core.sparseCheckout true
echo "target/path/1" >>.git/info/sparse-checkout
echo "target/path/2" >>.git/info/sparse-checkout
git checkout

Optimisez périodiquement l'empreinte de votre référentiel local (c) (facultatif, utilisez avec soin):

git clean --dry-run # consider and Tweak results then switch to --force
git gc
git repack -Ad
git Prune

Voir aussi: Comment gérer les grands référentiels avec git

9
nobar

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-dépôts se trouve dans le répertoire project-no-subrepos

5
rossmic

En ce qui concerne Git, il pourrait être d'une importance historique que Linus Torvalds ait répondu à cette question du point de vue conceptuel en 2007 dans une conférence enregistrée et disponible en ligne.

La question est de savoir s'il est possible d'extraire uniquement certains fichiers d'un référentiel Git.

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

Pour résumer, il a déclaré 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 étant que par ex. un diff d'un sous-ensemble de fichiers en deux révisions est calculé en prenant d'abord le diff entier, puis en l'élaguant uniquement aux fichiers qui ont été demandés. Un autre est que vous devez vérifier toute l'histoire; de façon tout ou rien. Pour cette raison, il suggère de diviser les composants vaguement liés entre plusieurs référentiels et mentionne un effort continu pour mettre en œuvre une interface utilisateur pour gérer un référentiel qui est structuré comme un super-projet contenant des référentiels plus petits.

Autant que je sache, cette décision fondamentale en matière de conception est toujours d'actualité. Le super-projet est probablement devenu ce que sont maintenant sous-modules .

2
user7610