2573 Stimmen

Einen "git export" (wie "svn export") durchführen?

Ich habe mich gefragt, ob es eine gute "Git-Export"-Lösung gibt, die eine Kopie eines Baums ohne den .git Repository-Verzeichnis. Es gibt mindestens drei mir bekannte Methoden:

  1. git clone gefolgt von der Entfernung der .git Repository-Verzeichnis.
  2. git checkout-index spielt auf diese Funktionalität an, beginnt aber mit "Lesen Sie einfach den gewünschten Baum in den Index ein...", wobei ich mir nicht ganz sicher bin, wie man das macht.
  3. git-export ist ein Skript eines Drittanbieters, das im Wesentlichen eine git clone an einem temporären Ort, gefolgt von rsync --exclude='.git' in das endgültige Ziel.

Keine dieser Lösungen scheint mir wirklich zufriedenstellend zu sein. Die Lösung, die dem am nächsten kommt, ist svn export könnte die Option 1 sein, da beide voraussetzen, dass das Zielverzeichnis zunächst leer ist. Aber Option 2 scheint noch besser zu sein, vorausgesetzt, ich kann herausfinden, was es bedeutet, einen Baum in den Index zu lesen.

1 Stimmen

@rnrTom: Siehe die Antwort von Somov. (es gibt nichts "Komprimiertes" in einem tar-Archiv).

36 Stimmen

@mrTom git archive --format zip --output "output.zip" master -0 erhalten Sie ein unkomprimiertes Archiv (-0 ist das Kennzeichen für unkomprimiert). git-scm.com/docs/git-archive .

9 Stimmen

Ich stimme @mrTom zu, und ich glaube nicht, dass es darauf ankommt, ob das Archiv komprimiert oder unkomprimiert ist. Mit SVN kann ich export ein 250 kB großes Unterverzeichnis direkt aus dem entfernten Repository (das sonst 200 MB groß sein könnte, Revisionen nicht eingerechnet) - und ich werde das Netzwerk nur für 250 kB (oder so) Download-Transfer belasten. Mit git , archive muss auf dem Server aktiviert sein (deshalb kann ich es nicht ausprobieren). clone --depth 1 vom Server kann immer noch ein Repo von sagen wir 25 MB abrufen, wobei die .git Unterordner nimmt allein 15 MB ein. Daher würde ich immer noch sagen, die Antwort ist "nein".

2588voto

CB Bailey Punkte 693084

Der einfachste Weg, dies zu erreichen, ist wahrscheinlich mit git archive . Wenn Sie wirklich nur den erweiterten Baum benötigen, können Sie so vorgehen.

git archive master | tar -x -C /somewhere/else

In den meisten Fällen, in denen ich etwas aus Git "exportieren" muss, möchte ich auf jeden Fall ein komprimiertes Archiv, also mache ich so etwas.

git archive master | bzip2 >source-tree.tar.bz2

ZIP-Archiv:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive für weitere Details, sie ist recht flexibel.


Beachten Sie, dass das Archiv zwar nicht das .git-Verzeichnis, wohl aber andere versteckte git-spezifische Dateien wie .gitignore, .gitattributes usw. enthalten wird. Wenn Sie diese Dateien nicht im Archiv haben wollen, müssen Sie das Attribut export-ignore in einer .gitattributes-Datei verwenden und diese vor dem Archivieren übertragen. Lesen Sie mehr...


Hinweis: Wenn Sie den Index exportieren möchten, lautet der Befehl

git checkout-index -a -f --prefix=/destination/path/

(Siehe Gregs Antwort für weitere Einzelheiten)

348voto

Greg Hewgill Punkte 882617

Ich habe herausgefunden, was Option 2 bedeutet. Aus einem Repository, können Sie tun:

git checkout-index -a -f --prefix=/destination/path/

Der Schrägstrich am Ende des Pfades ist wichtig, da die Dateien sonst in /destination mit dem Präfix "path" gespeichert werden.

Da der Index in einer normalen Situation den Inhalt des Repositorys enthält, ist nichts Besonderes zu tun, um den gewünschten Baum in den Index zu lesen. Er ist bereits da.

El -a Flag ist erforderlich, um alle Dateien im Index zu überprüfen (ich bin nicht sicher, was es bedeutet, dieses Flag in dieser Situation wegzulassen, da es nicht das tut, was ich will). Die -f Flag erzwingt das Überschreiben aller vorhandenen Dateien in der Ausgabe, was dieser Befehl normalerweise nicht tut.

Dies scheint die Art von "Git-Export" zu sein, die ich gesucht habe.

275voto

Alexander Somov Punkte 2758

git archive funktioniert auch mit einem entfernten Repository.

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

Um einen bestimmten Pfad innerhalb des Repo zu exportieren, fügen Sie so viele Pfade wie gewünscht als letztes Argument zu git hinzu, z.B.:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

79voto

Anthony Hatzopoulos Punkte 10219

enter image description here

Ein Sonderfall liegt vor, wenn das Repository auf GitHub gehostet wird.

Verwenden Sie einfach svn export .

Soweit ich weiß, erlaubt Github keine archive --remote . Obwohl GitHub ist svn-kompatibel und sie haben alle Git-Repos svn zugänglich, so dass Sie einfach svn export wie Sie es normalerweise tun würden, mit ein paar Anpassungen an Ihrer GitHub-URL.

Um zum Beispiel ein ganzes Repository zu exportieren, beachten Sie, dass trunk in der URL ersetzt master (oder was auch immer die der HEAD-Zweig des Projekts ist auf ):

svn export https://github.com/username/repo-name/trunk/

Und Sie können eine einzelne Datei oder sogar einen bestimmten Pfad oder Ordner exportieren:

svn export https://github.com/username/repo-name/trunk/src/lib/folder

Beispiel mit jQuery JavaScript-Bibliothek

El HEAD Zweigstelle oder Meister Zweig wird verfügbar sein über trunk :

svn ls https://github.com/jquery/jquery/trunk

Die Nicht HEAD Zweigstellen wird zugänglich sein unter /branches/ :

svn ls https://github.com/jquery/jquery/branches/2.1-stable

Alle tags unter /tags/ auf dieselbe Weise:

svn ls https://github.com/jquery/jquery/tags/2.1.3

46voto

jperras Punkte 682

Von der Git-Handbuch :

Verwendung von git-checkout-index zum "Exportieren eines gesamten Baums".

Die Präfix-Fähigkeit macht es im Grunde trivial, git-checkout-index als "Export als Baum"-Funktion zu verwenden. Einfach den gewünschten Baum in den Index einlesen und fertig:

$ git checkout-index --prefix=git-export-dir/ -a

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X