Eine einzelne Revision von Git bekommen

14

Das vollständige Git-Revisionsprotokoll zu haben, hat im Rahmen des Entwicklungsprozesses viele Vorteile.

Unser Produkt ist jedoch der Quellcode, wir verwenden Skriptsprachen, die weder kompiliert noch verarbeitet werden müssen, und dann wird der Git-Verlauf zu einer Last für die Bereitstellung. In unserem Beispiel stellen wir nach jeder Änderung eine saubere virtuelle Umgebung mit mehreren Bereitstellungen bereit eine einzelne Maschine.

Es gibt verschiedene Möglichkeiten, um den Verlauf zu reduzieren, z. B. flache Klone, deren Effizienz davon abhängt, wie tief die Revision in der Verzweigung ist, einen Abruf anstelle eines Klons durchführen, aber dann immer noch den Verlauf von der Revision und zurück oder den vollständigen Abruf repo einmal und dann ziehen, wenn nötig, aber dies ist verschwenderisch in Bezug auf den Speicherplatz und ist in der Regel weniger zuverlässig.

Gibt es eine Möglichkeit, eine einzelne Revision von Git zu erhalten, ohne dass dies in der Vergangenheit liegt?

Rsf
quelle
1
Verwandte Fragen und Antworten unter
Evgeny

Antworten:

16

Flacher Klon

Sie können in der Tat einen flachen Klon von Git erhalten, indem Sie Folgendes verwenden:

git clone --depth=1 <url>

Dadurch wird das Repo immer noch geklont und ein .gitOrdner mit den Objekten erstellt, der nur eine geringere Größe hat (Unterschied hängt von Ihrer Gesamtdateigröße im Vergleich zur Verlaufsgröße ab).

Git-Archiv

Sie können auch git-archive verwenden , um ein Archiv des Repos zu extrahieren:

Erstellt ein Archiv des angegebenen Formats mit der Baumstruktur für den angegebenen Baum und schreibt diese in die Standardausgabe. Wenn angegeben, wird es den Dateinamen im Archiv vorangestellt.

In den Beispielen zeigt es zum Beispiel:

git archive --format=tar --prefix=git-1.4.0/ v1.4.0 | gzip >git-1.4.0.tar.gz

Erstellen Sie einen komprimierten Tarball für Version .

Gehostete Git, Archiv-API

Wenn Sie Ihr Repo auf GitHub hosten, können Sie deren Archiv-API verwenden :

https://api.github.com/repos/<username>/<repository>/zipball/<commit_hash>

Bitbucket.org hat dafür die gleiche Funktionalität:

https://bitbucket.org/<username>/<repository>/get/<branch_name|commit_hash|tag>.zip

7ochem
quelle
7ochem, vielleicht gzip Befehl muss gzip -c sein ....
Romeo Ninov
11

Stellen Sie Ihr Git-Repo nicht bereit. Entwickeln Sie eine echte Bereitstellungsmethode. Selbst wenn es so einfach ist, ein Archiv (= Erstellen eines Artefakts mit nur den erforderlichen Dateien, die bereitgestellt werden sollen) von bereitgestellten Skripten zu erstellen.

Selbst wenn Sie die Spitze Ihres Quellrepositorys flach klonen, benötigen Sie in Ihrer implementierten Umgebung wahrscheinlich keine Komponententests, Dokumentation, Flusenprofile und andere unterstützende Ephemera.

Hinweis : Für Repositorys von Skriptsprachen, die keinen "Build" -Schritt haben, besteht eine einfache Möglichkeit, ein Artefakt freizugeben, darin, sie in ein Archiv wie tar oder rpm zu packen. Zum "Deployment" entpacken Sie dann das Archiv oder installieren die RPM. Dies macht Git-Tools in Ihrer Bereitstellungskette überflüssig (nicht alle Prod-Server verfügen über diese Entwickler-Tools).

RubyTuesdayDONO
quelle
Es ist in Ordnung, eine Antwort zu hinterfragen (oder sogar herauszufordern!) - das macht Stack Exchange großartig :) für Repositorys von Skriptsprachen, die nicht wirklich über einen "Build" -Schritt verfügen sie in einem Archiv, wie Teer oder U / min. Zum "Deployment" entpacken Sie dann das Archiv oder installieren die RPM. Dies beseitigt die Notwendigkeit für Git-Tools in Ihrer Bereitstellungskette (nicht alle Prod-Server verfügen über diese
Entwickler-
1
@ Pierre.Vriens Ja, Sie vermissen, was als Archivierung vorgeschlagen wird. Das heißt, Sie erstellen ein Artefakt, in dem nur die erforderlichen Dateien für die Bereitstellung enthalten sind. Das heißt, ich stimme zu, dass dies keine gute Antwort ist, und dieser Punkt sollte erweitert werden. Wir sind in der privaten Beta und die Antworten sollten explizit angegeben werden
Tensibai
Dann sehe ich nicht, was das mehr bringt als die akzeptierte Antwort, wenn es darauf hindeutet, das Archiv
anzupassen
1
Bitte überprüfen Sie meine Bearbeitung Ihrer Antwort (nur Ihren interessanten Kommentar integriert). Natürlich kannst du mich jederzeit verbessern / überarbeiten oder einfach zurücksetzen, wenn dir meine Bearbeitung überhaupt nicht gefällt. Übrigens: Ihr Kommentar (= Anmerkung, die ich hinzugefügt habe) ließ mich denken: "Wirklich so einfach? Wieder ein Beispiel, wie wir Dinge in zOS erledigen ... mit z für null Ausfallzeiten ...". Ich denke, es ist an der Zeit, weitere Fragen / Antworten über ähnliche Kommentare zu hinterfragen ... Fordern Sie mich nicht zu sehr heraus ...
Pierre.Vriens
Ich behaupte nicht, dass dies eine vollständige oder vorbildliche Antwort ist, aber ich habe niemanden im Raum gesehen, der den Elefanten ansprach: Wenn Sie git verwenden, um Ihr Projekt "bereitzustellen", werden Sie "eine schlechte Zeit haben" ;)
RubyTuesdayDONO
6

Frage: Gibt es eine Möglichkeit, eine einzelne Revision von Git zu erhalten, ohne dass dies in der Vergangenheit liegt?

Nein, es gibt keine Möglichkeit, ein Repository zu erhalten, hauptsächlich, weil es keine "Revision" gibt. Git Store-Commits, die Änderungen gegenüber dem vorherigen Status darstellen.
Wenn Sie möchten, dass Ihr Repository zu einem bestimmten Zeitpunkt erstellt wird, müssen Sie zu diesem Zeitpunkt das Commit und alle Vorfahren abrufen. Andernfalls werden nur die im Commit vorgenommenen Änderungen übernommen.

Um Verwechslungen zu vermeiden: Beim seichten Klonen wird der benötigte Verlauf abgerufen und anschließend auf freien Speicherplatz gekürzt. Der Baum wird weiterhin aus dem Verlauf erstellt.

Für die Lösungen deckt @ 7ochem answer diese ab.

Tensibai
quelle