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?
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.
Dans Mercurial land, vous parlez de trois types différents de clones partiels:
hg help sparse
).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).
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
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
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 .