Ist es sicher, mit --depth 1 flach zu klonen, Commits zu erstellen und Updates erneut abzurufen?

280

Die --depth 1Option in git clone:

Erstellen Sie einen flachen Klon mit einem Verlauf, der auf die angegebene Anzahl von Revisionen gekürzt wurde. Ein flaches Repository weist eine Reihe von Einschränkungen auf (Sie können es nicht klonen oder abrufen oder von dort hineinschieben oder hineinschieben), ist jedoch ausreichend, wenn Sie nur an der jüngsten Geschichte eines großen Projekts mit einer langen Geschichte interessiert sind und dies möchten Fixes als Patches einsenden.

Aber ich habe erfolgreich einen flachen Klon erstellt, einige Änderungen vorgenommen und diese Änderungen auf den Ursprung (nackter Klon) zurückgeschoben.

Es macht Sinn für mich - ich meine, warum nicht? Wenn der geklonte KOPF im Ursprung erkennbar ist und mein Commit dazu kommt, scheint es keinen Grund zu geben. Aber das Handbuch sagt etwas anderes.

Ich mag die Idee eines flachen Klons - z. B. eines Drupal-Kerns: Ich muss auf keinen Fall wissen, was in Drupal 4 passiert ist, als ich mit 7 angefangen habe -, aber ich möchte mich nicht in den Fuß schießen.

Ist es also sicher, flache Klone zu erstellen, Commits darin zu entwickeln und erneut zu ziehen, um mit den Aktualisierungen vom Ursprung Schritt zu halten?

Kunstroboter
quelle
13
Hier war eine anständige Diskussion über die Klontiefe
Andy
Ja, das würde ich auch lesen, danke Andy. Das --orphanKonzept scheint ähnlich und ich habe vor, ein Stück zu spielen. Immer noch etwas verunsichert, dass die Dokumente nicht der Realität entsprechen [denn wer soll sagen, dass die Dokumente --orphankorrekt sind
?!
Fand eine weitere großartige Diskussion über die Arbeit mit einer verkürzten Geschichte . Aber es hilft mir nicht.
Artfulrobot
1
Git 1.9 (Q1 2014) unterstützt das flache Repo-Klonen vollständig! Siehe meine Antwort unten
VonC
1
Git 2.5 (Q2 2015) unterstützt ein Single Fetch Commit! Ich habe meine Antwort unter Bezugnahme auf " Ein bestimmtes Commit aus einem Remote-Git-Repository abrufen " bearbeitet .
VonC

Antworten:

304

Man beachte , dass Git 1.9 / 2.0 (Q1 2014) wird entfernt diese Einschränkung.
Siehe Commit 82fba2b von Nguyễn Thái Ngọc Duy ( pclouds) :

Jetzt, da Git die Datenübertragung von oder zu einem flachen Klon unterstützt, gelten diese Einschränkungen nicht mehr.

Die Dokumentation lautet nun :

--depth <depth>::

Erstellen Sie einen "flachen" Klon mit einem Verlauf, der auf die angegebene Anzahl von Revisionen gekürzt wurde.

Dies ergibt sich aus Commits wie 0d7d285 , f2c681c und c29a7b8, die Klone, Sende- / Empfangspakete mit / von flachen Klonen unterstützen.
smart-http unterstützt jetzt auch das flache Abrufen / Klonen .

Alle Details finden Sie unter " shallow.c: Die 8 Schritte zum Auswählen neuer Commits für.git/shallow ".

Update Juni 2015: Git 2.5 ermöglicht sogar das Abrufen eines einzelnen Commits !
(Ultimativer flacher Fall)


Update Januar 2016: Git 2.8 (Mach 2016) dokumentiert nun offiziell die Praxis, eine minimale Historie zu erhalten.
Siehe Commit 99487cf , Commit 9cfde9e (30. Dezember 2015), Commit 9cfde9e (30. Dezember 2015), Commit bac5874 (29. Dezember 2015) und Commit 1de2e44 (28. Dezember 2015) von Stephen P. Smith (``) .
(Zusammengeführt von Junio ​​C Hamano - gitster- in Commit 7e3e80a , 20. Januar 2016)

Das ist " Documentation/user-manual.txt"

A <<def_shallow_clone,shallow clone>>wird durch Angabe des git-clone --depthSchalters erstellt.
Die Tiefe kann später mit dem git-fetch --depthSchalter geändert oder der vollständige Verlauf mit wiederhergestellt werden --unshallow.

Das Zusammenführen innerhalb eines <<def_shallow_clone,shallow clone>>Testaments funktioniert, solange sich eine Zusammenführungsbasis in der jüngeren Geschichte befindet.
Andernfalls wird es so sein, als würden nicht verwandte Geschichten zusammengeführt, und es kann zu großen Konflikten kommen.
Diese Einschränkung kann dazu führen, dass ein solches Repository nicht für die Verwendung in zusammenführungsbasierten Workflows geeignet ist.

Update 2020:

  • Mit git 2.11.1 wurde die Option eingeführt git fetch --shallow-exclude=, das Abrufen des gesamten Verlaufs zu verhindern
  • Mit git 2.11.1 wurde die Option eingeführt git fetch --shallow-since=, das Abrufen alter Commits zu verhindern.

Weitere Informationen zum Aktualisierungsprozess für flache Klone finden Sie unter " So aktualisieren Sie einen flachen Git-Klon? ".


Wie von Richard Michael kommentiert :

Geschichte auffüllen: git pull --unshallow

Und Olle Härstedt fügt in den Kommentaren hinzu :

Um einen Teil der Geschichte wieder aufzufüllen : git fetch --depth=100.

VonC
quelle
3
So viel Text, nur um zu sagen " Ja , solange Ihre Git-Version nicht älter als 4 Jahre ist und die Zusammenführungsbasis in der jüngeren Geschichte liegt"
Boris
3
@Boris diese Antwort hilft mir sehr, da ich skeptisch war, einen flachen Klon zu verwenden. Früher bricht es manchmal, wenn ich ein Commit mache und zusammenführe. Diese Antwort ist eine kurze Geschichte darüber, warum es jetzt funktioniert, wenn es passiert, und wie man es richtig macht.
Yana Agun Siswanto
6

Sehen Sie sich einige der Antworten auf meine ähnliche Frage an, warum ich nicht aus einem flachen Klon schieben kann, und den Link zum letzten Thread auf der Git-Liste.

Letztendlich ist die Tiefenmessung zwischen Repos nicht konsistent, da sie von ihren einzelnen Köpfen aus messen und nicht (a) Ihren Kopf oder (b) die Commits, die Sie geklont / abgerufen haben, oder (c) etwas anderes du hattest im Sinn.

Das Schwierige ist, den Anwendungsfall richtig zu machen (dh selbstkonsistent), damit verteilte und daher wahrscheinlich divergierende Repos weiterhin gut zusammenarbeiten.

Es sieht so aus, checkout --orphanals wäre dies die richtige Einrichtungsphase, aber es fehlt immer noch eine saubere (dh ein einfacher verständlicher einzeiliger Befehl) Anleitung für den Schritt "Klonen". Es sieht eher so aus, initals müssten Sie ein Repo durchführen, einen remoteTracking-Zweig einrichten (Sie möchten nur den einen Zweig?) Und dann fetchdiesen einzelnen Zweig, der sich langatmig anfühlt und mehr Möglichkeiten für Fehler bietet.

Bearbeiten: Für den Schritt 'Klonen' siehe diese Antwort

Philip Oakley
quelle
1
Panzer Philip. Durch das Abrufen eines Remote-Zweigs wird weiterhin der gesamte Verlauf (AFAIK) erfasst. Sie haben Recht mit relativen Tiefen, ich möchte wirklich einen geeigneten Punkt in der Geschichte (wie Git Merge-Base 7.x 7.0 in meinem Fall)
Artfulrobot
@artfulrobot: Mit der Methode '--orphan' können Sie einen kurzen schmalen 'Klon' (dh ein fokussiertes Segment) erstellen und dann so verwenden, als wäre es ein richtiges Repo. Es ist etwas, das ich noch nicht im Zorn versucht habe, aber es ist etwas, das ich bald beweisen muss.
Philip Oakley