Est-il sûr de cloner superficiellement avec --depth 1, de créer des commits et de récupérer des mises à jour?


281

L' --depth 1option dans git clone:

Créez un clone superficiel avec un historique tronqué au nombre de révisions spécifié. Un dépôt superficiel a un certain nombre de limitations (vous ne pouvez pas le cloner ou le récupérer, ni le pousser ni le pénétrer), mais il est adéquat si vous n'êtes intéressé que par 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 superficiel, commis quelques modifications et repoussé ces modifications à l'origine (clone nu).

Cela a du sens pour moi - je veux dire pourquoi pas? lorsque la TÊTE clonée est identifiable à l'origine, et que mon engagement vient s'ajouter à cela, il ne semble pas y avoir de raison. Mais le manuel dit le contraire.

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

Est-il donc sûr de cloner peu profondément, de développer des commits, de tirer à nouveau pour suivre les mises à jour depuis l'origine?


13
Voici une discussion décente sur la profondeur des clones
Andy

Oui, je l'avais lu aussi, merci Andy. le --orphanconcept semble similaire et j'ai l'intention d'avoir une pièce de théâtre. Encore un peu énervé que les documents ne correspondent pas à la réalité [parce que pour qui les documents --orphansont-ils corrects?!]
artfulrobot

Trouvé une autre grande discussion sur le travail avec une histoire tronquée . Mais ça ne m'aide pas.
artfulrobot

1
Git 1.9 (Q1 2014) supportera pleinement le clonage de référentiel superficiel! Voir ma réponse ci
VonC

1
Git 2.5 (Q2 2015) prend en charge une validation de récupération unique! J'ai modifié ma réponse, en faisant référence à " Extraire un commit spécifique d'un référentiel git distant ".
VonC

Réponses:


305

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.

La documentation se lit maintenant :

--depth <depth>::

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

Cela découle de commits comme 0d7d285 , f2c681c et c29a7b8 qui prennent en charge le clone, send-pack / receive-pack avec / à partir de clones peu profonds.
smart-http prend désormais également en charge la récupération / clonage superficiel .

Tous les détails sont dans " shallow.c: les 8 étapes pour sélectionner de nouveaux commits.git/shallow ".

Mise à jour de juin 2015: Git 2.5 permettra même de récupérer un seul commit !
(Cas superficiel ultime)


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

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

A <<def_shallow_clone,shallow clone>>est créé en spécifiant le git-clone --depthcommutateur.
La profondeur peut ensuite être modifiée avec le git-fetch --depthcommutateur, ou l'historique complet restauré avec --unshallow.

La fusion à l'intérieur d'une <<def_shallow_clone,shallow clone>>volonté fonctionnera aussi longtemps qu'une base de fusion est dans l'histoire récente.
Sinon, ce sera comme fusionner des histoires indépendantes et cela pourrait entraîner des conflits énormes.
Cette limitation peut rendre un tel référentiel impropre à être utilisé dans des workflows basés sur la fusion.

Mise à jour 2020:

  • git 2.11.1 a introduit une option git fetch --shallow-exclude=pour empêcher la récupération de tout l'historique
  • git 2.11.1 a introduit une option git fetch --shallow-since=pour empêcher la récupération des anciens commits.

Pour plus d'informations sur le processus de mise à jour de clone superficiel, voir " Comment mettre à jour un clone superficiel git? ".


Comme l'a commenté Richard Michael :

pour remblayer l'histoire: git pull --unshallow

Et Olle Härstedt ajoute dans les commentaires :

Pour remblayer une partie de l'histoire: git fetch --depth=100.


3
Tant de texte juste pour dire " oui , tant que votre version git n'a pas plus de 4 ans et que la base de fusion est dans l'histoire récente"
Boris

3
@Boris cette réponse m'aide beaucoup car j'étais sceptique quant à l'utilisation d'un clone peu profond. Auparavant, il se cassait parfois lorsque je fais un commit et une fusion. cette réponse est un bref historique, des raisons pour lesquelles cela fonctionne maintenant quand cela se produit et comment le faire correctement.
Yana Agun Siswanto

6

Voir certaines des réponses à ma question similaire pourquoi-je-ne-peux-pas-pousser-d'un-clone peu profond et le lien vers le fil récent sur la liste git.

En fin de compte, la mesure de la `` profondeur '' n'est pas cohérente entre les dépôts, car ils mesurent à partir de leurs têtes individuelles, plutôt que (a) votre tête, ou (b) le ou les commit (s) que vous avez cloné / récupéré, ou (c) autre chose tu avais en tête.

Le plus difficile est d'obtenir un cas d'utilisation correct (c'est-à-dire auto-cohérent), de sorte que les dépôts distribués, et donc probablement divergents, fonctionneront toujours ensemble avec bonheur.

Il semble que ce checkout --orphansoit la bonne étape de «configuration», mais il manque toujours des instructions claires (c'est-à-dire une simple commande compréhensible sur une ligne) sur l'étape de «clonage». Il semble plutôt que vous deviez effectuer initun dépôt, créer une remotebranche de suivi (vous ne voulez qu'une seule branche?), Puis fetchcette seule branche, qui semble longue et avec plus de possibilités d'erreurs.

Modifier: pour l'étape de «clonage», voir cette réponse


1
Tanks Philip. La récupération d'une branche distante fera toujours partie de l'historique complet (AFAIK). Vous avez raison sur les profondeurs relatives, vraiment je veux un point approprié de l'histoire (comme git merge-base 7.x 7.0 dans mon cas)
artfulrobot

@artfulrobot: la méthode '--orphan' vous permet de créer un 'clone' étroit et court (c'est-à-dire un segment focalisé) puis de l'utiliser comme s'il s'agissait d'un repo approprié. C'est quelque chose que je n'ai pas encore essayé avec colère mais c'est quelque chose que je dois prouver bientôt.
Philip Oakley
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.