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".

40voto

Daniel Schierbeck Punkte 1914

Ich habe einen einfachen Wrapper geschrieben, der git-checkout-index die Sie wie folgt verwenden können:

git export ~/the/destination/dir

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

Die Installation ist einfach; legen Sie das Skript einfach irgendwo in Ihrem PATH und vergewissern Sie sich, dass sie ausführbar ist.

Das Github-Repository für git-export

36voto

kostmo Punkte 5994

Es scheint, dass dies bei Git weniger ein Problem ist als bei SVN. Git legt nur einen .git-Ordner im Stammverzeichnis des Repositorys an, während SVN einen .svn-Ordner in jedem Unterverzeichnis anlegt. So vermeidet "svn export" rekursive Befehlszeilenmagie, während bei Git keine Rekursion notwendig ist.

30voto

aredridel Punkte 1503

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

es

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

26voto

Wenn Sie die Dateien nicht mit .gitattributes export-ignore dann versuchen 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, scheitern Sie nicht an nicht markierten Einträge; stattdessen werden nicht markierte Einträge ignoriert.

et

-q
Ausführlichkeit vermeiden

Zusätzlich können Sie jeden Zweig oder Tag oder eine bestimmte Commit-Revision wie in SVN abrufen, indem Sie einfach den 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 -- ./

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

UPDATE: Um das "Beheaded"-Problem zu vermeiden oder um das Arbeits-Repository intakt zu lassen, wenn Sie Checkout für den Export mit Tags, Zweigen oder SHA1 verwenden, müssen Sie Folgendes hinzufügen -- ./ am Ende

Der doppelte Gedankenstrich -- sagt git, dass alles nach den Bindestrichen Pfade oder Dateien sind, und sagt auch in diesem Fall git checkout nicht zu ändern, die HEAD

Beispiele:

Dieser Befehl ruft nur das libs-Verzeichnis und auch die readme.txt Datei von dieser genauen Übergabe

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

Dadurch wird Folgendes erstellt (überschrieben) my_file_2_behind_HEAD.txt zwei Übertragungen 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 eines anderen Zweigs zu erhalten

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

Beachten Sie, dass ./ ist relativ zur Wurzel des Repositorys

23voto

Lars Schillingmann Punkte 1478

Ich bin häufig auf diese Seite gestoßen, wenn ich nach einer Möglichkeit gesucht habe, ein Git-Repository zu exportieren. Meine Antwort auf diese Frage berücksichtigt drei Eigenschaften, die svn export im Vergleich zu git hat, da svn einen zentralisierten Repository-Ansatz verfolgt:

  • Es minimiert den Datenverkehr zu einem entfernten Repository, indem nicht alle Revisionen exportiert werden.

  • Es enthält keine Metainformationen im Exportverzeichnis

  • Um einen bestimmten Zweig mit svn zu exportieren, geben Sie den entsprechenden Pfad an

      git clone --depth 1 --branch main git://git.somewhere destination_path
      rm -rf destination_path/.git

Bei der Erstellung einer bestimmten Version ist es sinnvoll, einen stabilen Zweig zu klonen, z.B. --branch stable o --branch release/0.9 .

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