Führen Sie einen “git export” (wie “svn export”) durch?

Lesezeit: 8 Minuten

Fuhren Sie einen git export wie svn export durch
Greg Hewgill

Ich habe mich gefragt, ob es eine gute “Git-Export” -Lösung gibt, die eine Kopie eines Baums ohne die erstellt .git Repository-Verzeichnis. Mir sind mindestens drei Methoden bekannt:

  1. git clone gefolgt vom Entfernen 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 …”, was ich nicht ganz sicher bin.
  3. git-export ist ein Skript eines Drittanbieters, das im Wesentlichen Folgendes tut: git clone in einen temporären Ort, gefolgt von rsync --exclude=".git" ins Endziel.

Keine dieser Lösungen scheint mir wirklich zufriedenstellend zu sein. Am nächsten dran svn export könnte Option 1 sein, da beide erfordern, dass das Zielverzeichnis zuerst leer ist. Aber Option 2 scheint noch besser zu sein, vorausgesetzt, ich kann herausfinden, was es bedeutet, einen Baum in den Index einzulesen.

  • @rnrTom: Siehe Somovs Antwort. (in einem tar-Archiv ist nichts “komprimiert”).

    – Etarion

    23. Mai 2012 um 15:59 Uhr

  • @mrTom git archive --format zip --output "output.zip" master -0 gibt Ihnen ein unkomprimiertes Archiv (-0 ist das Flag für unkomprimiert). git-scm.com/docs/git-archive.

    Benutzer456814

    5. September 2012 um 18:47 Uhr

  • Ich stimme @mrTom zu, und ich glaube nicht, dass das Hauptproblem darin besteht, ob das Archiv komprimiert oder unkomprimiert ist. Mit SVN kann ich export ein 250-kB-Unterverzeichnis direkt aus dem Remote-Repository (das ansonsten 200 MB groß sein könnte, Revisionen ausgenommen) – und ich werde das Netzwerk nur für die Download-Übertragung von 250 kB (oder so) erreichen. Mit git, archive muss auf dem Server aktiviert sein (also kann ich es nicht ausprobieren) – clone --depth 1 Vom Server kann noch ein Repo von sagen wir 25 MB abgerufen werden, wo die .git Unterordner allein nimmt 15 MB. Daher würde ich immer noch sagen, dass die Antwort “nein” ist.

    – sdaau

    28. Januar 2013 um 14:59 Uhr

  • Hier ist ein schöner und einfacher Weg: git archive -o latest.zip HEAD

    – Jewgeni Sergejew

    23. Juli 2018 um 18:43 Uhr

  • Ich verwende diese Frage seit Jahren als Manpage für “git export”, zu Ihrer Information.

    – orion elenzil

    6. Mai 2021 um 16:14 Uhr

Fuhren Sie einen git export wie svn export durch
Greg Hewgill

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

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

Der Schrägstrich am Ende des Pfads ist wichtig, da er sonst dazu führt, dass die Dateien in /destination mit dem Präfix „Pfad“ abgelegt werden.

Da der Index im Normalfall den Inhalt des Repositorys enthält, ist nichts Besonderes zu tun, um “den gewünschten Baum in den Index einzulesen”. Es ist schon da.

Die -a Flag ist erforderlich, um alle Dateien im Index auszuchecken (ich bin mir 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, nach der ich gesucht habe.

  • …und VERGESSEN SIE NICHT DEN Schrägstrich am Ende, sonst haben Sie nicht den gewünschten Effekt 😉

    – conni

    8. April 2009 um 20:48 Uhr

  • Die git add Befehl ändert den Inhalt im Index, also was auch immer git status zeigt als “zu begehen” ist das Unterschiede zwischen HEAD und dem Inhalt des Indexes.

    – Greg Hewgill

    31. August 2009 um 6:30 Uhr

  • @conny: deinen Kommentar gelesen, vergessen und den Befehl ohne abschließenden Schrägstrich ausgeführt. Tipp: Connys Rat befolgen -.-

    – Znarkus

    24. Juni 2010 um 16:55 Uhr


  • +1 zu Connys Rat. Versuchen Sie auch nicht, „~/dest/“ zu erstellen, da dies ein Verzeichnis namens „~“ in Ihrem Arbeitsverzeichnis erstellt, anstatt das, was Sie wirklich wollten. Rate mal, was passiert, wenn du gedankenlos rm -rf ~ eingibst

    – Kyle Heironimus

    18. April 2011 um 16:38 Uhr

  • @KyleHeironimus – Ihre Warnung vor der Verwendung von ‘~/dest/’ ist wahr, wenn Sie Anführungszeichen um Ihren Präfixpfad verwenden, wodurch die Shell angewiesen wird, keine Tilde-Erweiterung durchzuführen. Ein Dir hat angerufen ~ (nicht '~' !) wird in Ihrem Arbeitsverzeichnis erstellt. Daran ist nichts Besonderes git checkout-index Insofern: Gleiches gilt für mkdir '~/dest' (mach das nicht!). Noch ein guter Grund, Dateinamen zu vermeiden, die in Anführungszeichen gesetzt werden müssen (z. B. die ein Leerzeichen enthalten) 🙂

    – Matt Wallis

    2. September 2015 um 9:18 Uhr


  • Diese Option gefällt mir am besten. Es hat den zusätzlichen Vorteil, dass es auch auf Bare-Repositories funktioniert.

    – innaM

    31. August 2009 um 14:34 Uhr

  • Meine verbesserte Version ist: git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf - (stellt sicher, dass sich Ihr Archiv in einem Ordner befindet)

    – Nick

    15. Dezember 2011 um 15:57 Uhr

  • Notiz: Der Server muss diese Funktion aktivieren.

    – Jakub Narębski

    13. Dezember 2012 um 11:19 Uhr


  • Ich habe es versucht : git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git master Und wurde fatal: Operation nicht vom Protokoll unterstützt. Unerwartetes Ende des Befehlsstroms.

    – andyf

    19. Juli 2013 um 8:04 Uhr

  • @andyf GitHub hat seinen eigenen Weg: curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf - pro Dokumente

    – Bischof

    31. Juli 2014 um 13:51 Uhr


1646889489 875 Fuhren Sie einen git export wie svn export durch
Anthony Hatzopoulos

Geben Sie hier die Bildbeschreibung ein

Eine Sonderfallantwort, wenn das Repository auf GitHub gehostet wird.

Benutz einfach svn export.

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

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

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

Die HEAD Filiale bzw Meister Verzweigung wird mit verfügbar sein trunk:

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

Die Nicht-HEAD Geäst wird zugänglich sein unter /branches/:

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

Alle Stichworte unter /tags/ auf die selbe Art:

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

  • git archive funktioniert gut mit GitHub, solange Sie das Git-Protokoll verwenden, einfach ersetzen https:// mit git:// in der URL. Ich weiß nicht, warum GitHub diese versteckte Funktion nicht bewirbt.

    – Neil Mayhew

    13. Januar 2016 um 18:48 Uhr

  • @NeilMayhew Es funktioniert nicht für mich, verstehe ich fatal: The remote end hung up unexpectedly. Versucht auf zwei verschiedenen Servern mit jQuery Github Repo.

    – Anthony Hatzopoulos

    23. Januar 2016 um 23:55 Uhr

  • Du hast recht. Ich hatte vergessen, dass ich benutzte git config url.<base>.insteadOf um das entfernte Repository zwischenzuspeichern. Ich benutzte daher a file:// URL in der Realität. ich bezweifle das git archive könnte jemals mit arbeiten git:// URLs, da es ausgeführt werden muss git-upload-archive am entfernten Ende. Mit dem sollte es möglich sein ssh Protokoll, außer dass github es nicht zulässt (Invalid command: 'git-upload-archive').

    – Neil Mayhew

    25. Januar 2016 um 14:49 Uhr

  • Gibt es eine Möglichkeit, ein lokales Server-Tool zu verwenden, das sich wie Github verhält, wenn ich dies auf intern gehosteten Git-Repositories tun möchte?

    – kriss

    14. November 2016 um 14:47 Uhr

  • upvoted — es ist völlig bizarr, dass Git diese Funktion nicht hat und wir auf svn zurückgreifen müssen

    – Jason S

    31. Mai 2017 um 16:23 Uhr

1646889490 463 Fuhren Sie einen git export wie svn export durch
jperras

Von dem Git-Handbuch:

Verwenden von git-checkout-index zum “Exportieren eines gesamten Baums”

Die Präfix-Fähigkeit macht es im Grunde trivial, git-checkout-index als „Export as Tree“-Funktion zu verwenden. Lesen Sie einfach den gewünschten Baum in den Index ein und tun Sie Folgendes:

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

  • git archive funktioniert gut mit GitHub, solange Sie das Git-Protokoll verwenden, einfach ersetzen https:// mit git:// in der URL. Ich weiß nicht, warum GitHub diese versteckte Funktion nicht bewirbt.

    – Neil Mayhew

    13. Januar 2016 um 18:48 Uhr

  • @NeilMayhew Es funktioniert nicht für mich, verstehe ich fatal: The remote end hung up unexpectedly. Versucht auf zwei verschiedenen Servern mit jQuery Github Repo.

    – Anthony Hatzopoulos

    23. Januar 2016 um 23:55 Uhr

  • Du hast recht. Ich hatte vergessen, dass ich benutzte git config url.<base>.insteadOf um das entfernte Repository zwischenzuspeichern. Ich benutzte daher a file:// URL in der Realität. ich bezweifle das git archive könnte jemals mit arbeiten git:// URLs, da es ausgeführt werden muss git-upload-archive am entfernten Ende. Mit dem sollte es möglich sein ssh Protokoll, außer dass github es nicht zulässt (Invalid command: 'git-upload-archive').

    – Neil Mayhew

    25. Januar 2016 um 14:49 Uhr

  • Gibt es eine Möglichkeit, ein lokales Server-Tool zu verwenden, das sich wie Github verhält, wenn ich dies auf intern gehosteten Git-Repositories tun möchte?

    – kriss

    14. November 2016 um 14:47 Uhr

  • upvoted — es ist völlig bizarr, dass Git diese Funktion nicht hat und wir auf svn zurückgreifen müssen

    – Jason S

    31. Mai 2017 um 16:23 Uhr

1646889491 655 Fuhren Sie einen git export wie svn export durch
Daniel Schierbeck

Ich habe einen einfachen Wrapper geschrieben git-checkout-index die Sie so verwenden können:

git export ~/the/destination/dir

Wenn das Zielverzeichnis bereits vorhanden ist, müssen Sie es hinzufügen -f oder --force.

Die Installation ist einfach; legen Sie das Skript einfach irgendwo in Ihrem ab PATHund stellen Sie sicher, dass es ausführbar ist.

Das GitHub-Repository für git-export

  • Dieser Wrapper ist nicht plattformunabhängig; es stützt sich auf /bin/sh. Wenn Sie also Windows verwenden, ist diese Lösung wahrscheinlich wird bei dir nicht funktionieren.

    – schowawnik

    18. Juli 2013 um 21:14 Uhr

  • Uhh, dieses Skript besteht aus 57 Zeilen Dokumentation, Whitespace, Setup, Argumentanalyse und nur einer Zeile, die tatsächlich etwas tut …

    – Wladimir Pantelejew

    13. Mai 2015 um 16:23 Uhr

986350cookie-checkFühren Sie einen “git export” (wie “svn export”) durch?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy