Clone partiel avec Git et Mercurial

est-il possible de cloner une seule branche (ou à partir d'une commit donnée) en Git et Mercurial? Je veux dire, je veux cloner un repo central, mais comme c'est énorme, j'aimerais en avoir une partie et pouvoir contribuer à mes changements. Est-il possible? Comme, je veux seulement à partir de L'étiquette 130 ou quelque chose comme ça?

Si oui, comment?

71
demandé sur Tshepang 2010-04-06 21:15:24

6 réponses

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

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

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

  • clone partiel par filepath: je veux toute l'histoire des révisions dans un répertoire /path .

    impossible in Git. Avec Git moderne si vous pouvez avoir caisse clairsemée , c'est-à-dire que vous avez toute l'histoire mais vous vérifiez (avoir dans la zone de travail) que sous-ensemble de tous les fichiers.

  • cloner seulement une branche sélectionnée: je veux cloner seulement une branche (ou un sous-ensemble sélectionné de branches).

    Possible, et

    avant git 1.7.10 pas simple: vous auriez besoin de faire ce que clone fait manuellement, i.e. git init [<directory>] , puis git remote add origin <url> , éditer .git/config en remplaçant * dans remote.origin.fetch par branche demandée (probablement 'master'), puis git fetch .

    à partir de git 1.7.10 git clone offre le --single-branch option qui semble comme il a été ajouté juste à cet effet, et semble assez facile.

    notez cependant que puisque les branches partagent généralement la plus grande partie de leur histoire, le gain du clonage seulement un sous-ensemble de branches pourrait être plus petit que vous le pensez.

vous pouvez également faire un clone peu profond de seulement un sous-ensemble sélectionné de branches.

si vous savez comment les gens vont vouloir décomposer les choses par filepath (projets multiples dans le même dépôt), vous pouvez utiliser des sous-modules (comme svn:externals) pour pré-diviser le rapport en portions clonables séparées.

71
répondu Jakub Narębski 2013-11-07 03:39:37

en terre mercuriale vous parlez de trois types différents de clones partiels:

  • shallow clones: je veux l'histoire de la révision point X onward utiliser le remotefilelog extension
  • partial clones by filepath: je veux toute l'histoire de révision dans le répertoire / chemin avec expérimental narrow HG extension ou je veux seulement des fichiers dans directory /chemin dans mon répertoire de travail avec expérimental éparses extension (disponible 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: utiliser clone-r

si vous savez comment les gens vont vouloir décomposer les choses par filepath (plusieurs projets dans le même repo (honte à vous)) vous pouvez utiliser des sous-dépôts (sorte de svn externes) de pré-fractionnement des pensions de titres en séparément clonable parties

aussi, pour ce qui est du" si énorme que j'aimerais n'en avoir qu'une partie": il ne faut vraiment le faire qu'une seule fois. Clonez - le pendant que vous déjeunez, et vous l'aurez pour toujours. Par la suite, vous pouvez pull et obtenir des deltas efficacement aller de l'avant. Et si tu veux un autre clone, clone ton premier clone. Où vous avez un clone n'a pas d'importance (et les clones locaux ne prennent pas d'autres diskspace puisqu'ils sont des liens durs sous les couvertures).

47
répondu Ry4an Brase 2017-10-18 21:21:43

la réponse choisie donne un bon aperçu, mais il n'y a pas d'exemple complet.

minimisez votre empreinte de téléchargement et de caisse (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 dépôt local (c) (facultatif, utiliser avec soin):

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

Voir aussi: dépôts avec git

8
répondu nobar 2017-05-23 12:02:41

cette méthode crée une archive Non suivie en versions 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 traduit en version électronique sans les sous-référentiels est dans le répertoire project-no-sous-référentiels

5
répondu rossmic 2012-02-29 21:04:14

en ce qui concerne Git il pourrait être d'une importance historique que Linus Torvalds a répondu à cette question de la perspective conceptuelle en 2007 dans un discours qui a été enregistré et est disponible en ligne.

la question Est de savoir s'il est possible de vérifier seulement quelques fichiers d'un dépôt Git.

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

pour résumer, il a dit que l'un des les décisions de Git qui le distinguent des autres systèmes de gestion des sources (il cite BitKeeper et SVN) sont que git gère le contenu, pas les fichiers. Les implications étant 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 puis en l'élaguant seulement aux fichiers qui ont été demandés. Une autre est que vous devez vérifier toute l'histoire; d'une façon tout ou rien. Pour cette raison, il suggère de diviser les composants vaguement liés entre plusieurs il mentionne ensuite un effort continu pour mettre en œuvre une interface utilisateur pour 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 fondamentale est toujours valable aujourd'hui. La chose de super-projet est probablement devenue ce qui sont maintenant submodules .

2
répondu user7610 2014-01-04 12:58:59

dans mercurial, vous devriez être en mesure de certains de ces en utilisant:

hg convert --banchmap FILE SOURCEDEST REVMAP

, Vous pouvez également:

--config convert.hg.startrev=REV

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

je n'ai pas essayé, mais convertir est assez riche.

-1
répondu Dan Christian 2012-02-21 17:45:42