Frage Mache einen "git export" (wie "svn export")?


Ich habe mich gefragt, ob es eine gute "git export" -Lösung gibt, die eine Kopie eines Baumes ohne die erstellt .git Repository-Verzeichnis. Ich kenne mindestens drei Methoden:

  1. git clone gefolgt von Entfernen der .git Repository-Verzeichnis.
  2. git checkout-index spielt auf diese Funktionalität an, beginnt jedoch mit "Lies einfach den gewünschten Baum in den Index ...", was ich nicht ganz sicher weiß.
  3. git-export ist ein Skript von Drittanbietern, das im Wesentlichen eine git clone in einen temporären Ort gefolgt von rsync --exclude='.git' in das endgültige Ziel.

Keine dieser Lösungen scheint mir wirklich zufriedenstellend zu sein. Der nächste zu svn export könnte die Option 1 sein, da beide das Zielverzeichnis zuerst leer lassen müssen. Aber Option 2 scheint noch besser zu sein, vorausgesetzt, ich kann herausfinden, was es bedeutet, einen Baum in den Index zu lesen.


2165
2017-10-02 02:21


Ursprung


Antworten:


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

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

Meistens muss ich etwas von Git "exportieren", ich möchte 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 mehr Details ist es ziemlich flexibel.


Beachten Sie, dass das Archiv zwar nicht das .git-Verzeichnis enthält, es jedoch andere versteckte Git-spezifische Dateien wie .gitignore, .gitattributes usw. enthält. Wenn Sie sie nicht im Archiv haben wollen, stellen Sie sicher, dass Sie Verwenden Sie das export-ignore-Attribut in einer .gitattributes-Datei und bestätigen Sie dies, bevor Sie Ihr Archiv erstellen. Weiterlesen...


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

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

(Sehen Gregs Antwort für mehr Details)


2195
2017-10-02 18:13



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

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

Der Schrägstrich am Ende des Pfads ist wichtig, andernfalls werden die Dateien mit dem Präfix "Pfad" in / destination eingefügt.

Da in einer normalen Situation der Index den Inhalt des Repositories enthält, gibt es nichts besonderes zu tun, um "den gewünschten Baum in den Index zu lesen". Es ist schon da.

Das -a flag wird benötigt, 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). Das -f flag erzwingt das Überschreiben vorhandener Dateien in der Ausgabe, was dieser Befehl normalerweise nicht tut.

Dies scheint die Art von "git export" zu sein, nach der ich gesucht habe.


301
2017-10-02 03:03



git archive funktioniert auch mit Remote-Repository.

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

Um einen bestimmten Pfad innerhalb des Repos zu exportieren, fügen Sie beliebig viele Pfade als letztes Argument zu git hinzu, z. B .:

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

241
2017-12-09 18:59



enter image description here

Eine Sonderfallantwort, wenn das Repository auf GitHub gehostet wird.

Benutz einfach svn export.

Soweit ich weiß, erlaubt Github nicht archive --remote. Obwohl GitHub ist SVN kompatibel und sie haben alle Git Repos svn zugänglich, damit Sie einfach verwenden können svn export wie du es normalerweise mit ein paar Anpassungen an deiner GitHub URL tun würdest.

Um beispielsweise ein gesamtes Repository zu exportieren, beachten Sie wie trunkin der URL ersetzt master (oder was auch immer HEAD-Zweig des Projekts ist auf festgelegt):

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

Das HEAD Zweig oder Meister Zweig wird verfügbar sein mit trunk:

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

Die nichtHEAD  Geäst wird unter zugänglich sein /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

48
2017-10-30 17:03



Von dem Git-Handbuch:

Mit git-checkout-index "einen ganzen Baum exportieren"

Die Präfix-Fähigkeit macht es grundsätzlich trivial, den git-checkout-index als "export as tree" -Funktion zu verwenden. Lies einfach den gewünschten Baum in den Index und mache:

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


38
2017-10-02 02:27



Ich habe einen einfachen Wrapper geschrieben git-checkout-index das kannst du so benutzen:

git export ~/the/destination/dir

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

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

Das GitHub-Repository für git-export 


37
2017-10-16 17:17



Es scheint, dass dies weniger ein Problem mit Git als SVN ist. Git legt nur einen .git-Ordner im Repository-Root ab, während SVN in jedem Unterverzeichnis einen .svn-Ordner ablegt. So vermeidet "svn export" rekursive Kommandozeilen-Magie, während bei Git keine Rekursion notwendig ist.


35
2018-05-12 04:20



Das Äquivalent von

svn export . otherpath

innerhalb eines bestehenden Repo ist

git archive branchname | (cd otherpath; tar x)

Das Äquivalent von

svn export url otherpath

ist

git archive --remote=url branchname | (cd otherpath; tar x)

26
2018-02-23 15:41



Ich benutze Git-Submodule ausgiebig. Dieser funktioniert für mich:

rsync -a ./FROM/ ./TO --exclude='.*'

21
2017-09-13 06:26



Wenn Sie Dateien nicht mit ausschließen .gitattributes  export-ignore dann versuche es git checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-f
  Wenn Sie Pfade aus dem Index auschecken, schlagen Sie nach dem Zusammenführen nicht fehl   Einträge; Stattdessen werden nicht zusammengefügte Einträge ignoriert.

und

-q
  Vermeiden Sie wortreich

Zusätzlich können Sie jeden Branch oder Tag oder aus einer bestimmten Commit Revision wie in SVN nur die SHA1 hinzufügen (SHA1 in Git entspricht der Revisionsnummer in SVN)

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

Das /path/to/checkout/ Muss leer sein, Git löscht keine Datei, sondern überschreibt Dateien mit demselben Namen ohne Warnung

AKTUALISIEREN: Um das enthauptete Problem zu vermeiden oder das Arbeitsrepository beim Exportieren mit Tags, Zweigen oder SHA1 zu verlassen, müssen Sie hinzufügen -- ./ Am Ende

Der Doppelschlag -- sagt git, dass alles nach den Bindestrichen Pfade oder Dateien sind, und auch in diesem Fall erzählt git checkout das nicht ändern HEAD

Beispiele:

Dieser Befehl wird nur das libs-Verzeichnis und auch die readme.txt Datei davon genau zu committen

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

Dies wird erstellen (überschreiben) my_file_2_behind_HEAD.txt zwei Commits hinter dem Kopf HEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

Um den Export einer anderen Filiale zu erhalten

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

Beachte das ./ ist relativ zum Stamm des Repository


20
2017-12-10 17:17