web-dev-qa-db-fra.com

Est-il prudent de cloner de faible profondeur avec --depth 1, de créer des commits et de récupérer les mises à jour à nouveau?

L'option _--depth 1_ dans git clone :

Créez un clone shallow avec un historique tronqué au nombre de révisions spécifié. Un référentiel peu profond comporte un certain nombre de limitations (vous ne pouvez ni le copier, ni le récupérer, ni le placer dans/le), mais il est suffisant si vous ne vous intéressez qu'à l'histoire récente d'un grand projet avec une longue histoire et que vous souhaitez envoyer des correctifs sous forme de correctifs.

Mais j'ai réussi à faire un clone peu profond, à valider certaines modifications et à les reporter vers l'origine (clone nu).

Cela a du sens pour moi - je veux dire, pourquoi pas? Lorsque le HEAD cloné est identifiable dans l'Origin, et que ma validation vient par-dessus tout cela, il semble n'y avoir aucune raison. Mais le manuel dit le contraire.

J'aime l'idée de clone peu profond - par exemple. de drupal core: il n’ya aucun moyen que je sache ce qui s’est passé dans drupal 4 quand j’ai commencé à partir de 7h - mais je ne veux pas me tirer une balle dans le pied .

Alors, est-il prudent de cloner, de développer des commits, de tirer à nouveau pour suivre les mises à jour d'origine?

265
artfulrobot

Notez que Git 1.9/2.0 (Q1 2014) a supprimé cette limitation.
Voir commit 82fba2b , de Nguyễn Thái Ngọc Duy (pclouds) :

Maintenant que git prend en charge le transfert de données depuis ou vers un clone peu profond, ces limitations ne sont plus vraies.

Le la documentation se lit maintenant :

_--depth <depth>::
_

Créez un clone "superficiel" avec un historique tronqué au nombre de révisions spécifié.

Cela provient de commits comme d7d285 , f2c681c , et c29a7b8 quel clone de support, send-pack/receive-pack avec/depuis des clones superficiels.
smart-http supporte maintenant aussi l'extraction superficielle/le clone .

Tous les détails sont dans " shallow.c_: LES 8 ÉTAPES POUR SÉLECTIONNER DE NOUVEAUX COMMITS POUR _.git/shallow ".

Mise à jour de juin 2015: Git 2.5 permettra même d'extraire un seul commit !
(Ultime cas peu profond)


Mise à jour de janvier 2016: Git 2.8 (Mach 2016) documente désormais officiellement la pratique consistant à obtenir un historique minimal.
Voir commit 99487cf , commit 9cfde9e (30 déc. 2015), commit 9cfde9e (30 déc. 2015), commit bac5874 (29 décembre 2015), et commit 1de2e44 (28 décembre 2015) par Stephen P. Smith (``) .
(Fusionnée par Junio ​​C Hamano - gitster - dans commit 7e3e80a , 20 janv. 2016)

C'est " Documentation/user-manual.txt "

Un _<<def_shallow_clone,shallow clone>>_ est créé en spécifiant le commutateur git-clone --depth .
La profondeur peut être modifiée ultérieurement avec le commutateur git-fetch --depth ou l'historique complet restauré avec _--unshallow_.

La fusion dans un _<<def_shallow_clone,shallow clone>>_ fonctionnera tant qu'une base de fusion est dans l'historique récent.
Sinon, ce sera comme si vous fusionniez des histoires sans lien et risquait d’engendrer d’énormes conflits.
Cette limitation peut rendre un tel référentiel inutilisable dans les flux de travail basés sur la fusion.


Pour plus d'informations sur le processus de mise à jour des clones peu profonds, voir " Comment mettre à jour un clone peu profond git? ".


Comme commenté par Richard Michael :

remplir l'historique: git pull --unshallow

Et Olle Härstedt ajoute dans les commentaires :

Pour renvoyer une partie de l'historique: git fetch --depth=100.

281
VonC

Voir certaines des réponses à ma question similaire pourquoi-cant-i-Push-from-a-shallow-clone et le lien vers le fil de discussion récent sur la liste git.

En fin de compte, la mesure de la "profondeur" n'est pas cohérente entre les pensions, car elles mesurent à partir de leurs HEADs individuels, plutôt que (a) votre tête, ou (b) le ou les commit (s) que vous avez clonés/récupérés, ou (c) quelque chose d'autre vous aviez en tête.

Le plus difficile est d’avoir un cas d’utilisation correct (c’est-à-dire cohérent), de sorte que les pensions distribuées, et donc probablement divergentes, fonctionneront toujours avec bonheur.

Il semble que le checkout --Orphan soit la bonne étape de "configuration", mais il lui manque encore des instructions claires (c'est-à-dire une simple commande compréhensible d'une ligne) pour l'étape de "clonage". Il semble plutôt que vous deviez init un référentiel, configurer une branche de suivi remote (vous ne voulez qu'une seule branche?), Puis fetch cette seule branche qui semble longue essoufflé avec plus de possibilité d'erreurs.

Edit: Pour l'étape 'clone', voir cette réponse

7
Philip Oakley