Ich habe mich gefragt, ob es eine gute "Git-Export" -Lösung gibt, die eine Kopie eines Baums ohne das .git
Repository-Verzeichnis erstellt. Ich kenne mindestens drei Methoden:
git clone
Anschließend wird das.git
Repository-Verzeichnis entfernt.git checkout-index
spielt auf diese Funktionalität an, beginnt aber mit "Lies einfach den gewünschten Baum in den Index ...", was ich nicht ganz sicher bin, wie ich es machen soll.git-export
ist ein Skript eines Drittanbieters, das im Wesentlichengit clone
einen temporären Speicherort gefolgt vonrsync --exclude='.git'
einem endgültigen Ziel ausführt.
Keine dieser Lösungen scheint mir wirklich zufriedenstellend zu sein. Das nächstgelegene ist svn export
möglicherweise Option 1, da für beide das Zielverzeichnis zuerst leer sein muss. Option 2 scheint jedoch noch besser zu sein, vorausgesetzt, ich kann herausfinden, was es bedeutet, einen Baum in den Index einzulesen.
git
export
git-archive
svn-export
Greg Hewgill
quelle
quelle
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 .export
ein 250-kB-Unterverzeichnis direkt aus dem Remote-Repository (das ansonsten 200 MB groß sein könnte, ohne Revisionen) - und ich werde das Netzwerk nur für eine Download-Übertragung von 250 kB (oder so) erreichen. Mitgit
,archive
auf dem Server aktiviert werden muss (so kann ich es nicht versuchen) -clone --depth 1
vom Server kann noch ein Repo von etwa 25 MB abrufen, wo der.git
Unterordner allein 15MB nimmt. Daher würde ich immer noch sagen, dass die Antwort "Nein" ist.git checkout-index
git archive -o latest.zip HEAD
Antworten:
Der wahrscheinlich einfachste Weg, dies zu erreichen, ist mit
git archive
. Wenn Sie wirklich nur den erweiterten Baum benötigen, können Sie so etwas tun.Die meiste Zeit, in der ich etwas aus Git "exportieren" muss, möchte ich auf jeden Fall ein komprimiertes Archiv, also mache ich so etwas.
ZIP-Archiv:
git help archive
Für weitere Details ist es sehr flexibel.Beachten Sie, dass das Archiv zwar kein .git-Verzeichnis enthält, jedoch andere versteckte git-spezifische Dateien wie .gitignore, .gitattributes usw. enthält. Wenn Sie diese nicht im Archiv haben möchten, stellen Sie sicher, dass Sie dies tun Verwenden Sie das Attribut export-ignore in einer .gitattributes-Datei und schreiben Sie es fest, bevor Sie Ihr Archiv erstellen. Weiterlesen...
Hinweis: Wenn Sie den Index exportieren möchten, lautet der Befehl
(Siehe Gregs Antwort für weitere Details)
quelle
git archive --format zip --output /full/path master
git archive --format zip --output /path/to/file.zip --prefix=newdir/ master
die Ausgabe verwenden, heißt sie "file.zip". Wenn Sie sie jedoch entpacken, lautet das Verzeichnis der obersten Ebene "newdir". (Wenn Sie das Attribut --prefix weglassen, lautet das Verzeichnis der obersten Ebene 'file'.)git archive -o latest.zip HEAD
Es wird ein Zip-Archiv erstellt, das den Inhalt des letzten Commits für den aktuellen Zweig enthält. Beachten Sie, dass das Ausgabeformat durch die Erweiterung der Ausgabedatei abgeleitet wird.Ich habe herausgefunden, was Option 2 bedeutet. In einem Repository können Sie Folgendes tun:
Der Schrägstrich am Ende des Pfads ist wichtig, andernfalls werden die Dateien in / destination mit dem Präfix 'path' angezeigt.
Da der Index in einer normalen Situation den Inhalt des Repositorys enthält, gibt es nichts Besonderes zu tun, um "den gewünschten Baum in den Index einzulesen". Es ist schon da.
Das
-a
Flag ist erforderlich, um alle Dateien im Index auszuchecken (ich bin 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.
quelle
git add
Befehl ändert den Inhalt im Index. Was alsogit status
als "festzuschreiben" angezeigt wird, sind die Unterschiede zwischen HEAD und dem Inhalt des Index.~
(nicht'~'
!) Erstellt.git checkout-index
Diesbezüglich gibt es nichts Besonderes : Gleiches gilt fürmkdir '~/dest'
( tu das nicht! ). Ein weiterer guter Grund, um Dateinamen zu vermeiden, die zitiert werden müssen (z. B. die ein Leerzeichen enthalten) :-)git archive
funktioniert auch mit Remote-Repository.Um einen bestimmten Pfad innerhalb des Repos zu exportieren, fügen Sie so viele Pfade hinzu, wie Sie möchten, als letztes Argument für git, z.
quelle
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)git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git master
Und wurde fatal: Operation wird vom Protokoll nicht unterstützt. Unerwartetes Ende des Befehlsstroms.curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -
per docsEine Sonderfallantwort, wenn das Repository auf GitHub gehostet wird.
Einfach benutzen
svn export
.Soweit ich weiß, erlaubt Github das nicht
archive --remote
. Obwohl GitHub svn-kompatibel ist und auf alle Git-Repossvn
zugegriffen werden kann, könnensvn export
Sie sie mit ein paar Anpassungen an Ihrer GitHub-URL wie gewohnt verwenden.Beachten Sie beispielsweise beim Exportieren eines gesamten Repositorys, wie
trunk
die URL ersetzt wirdmaster
(oder auf was auch immer der HEAD-Zweig des Projekts eingestellt ist ):Und Sie können eine einzelne Datei oder sogar einen bestimmten Pfad oder Ordner exportieren:
Beispiel mit jQuery JavaScript Library
Der
HEAD
Zweig oder Master - Zweig zur Verfügung stehen mittrunk
:Die Nicht-
HEAD
Filialen sind zugänglich unter/branches/
:Alle Tags unter
/tags/
auf die gleiche Weise:quelle
git archive
funktioniert gut mit GitHub, solange Sie das git - Protokoll verwenden, Ersetzen Sie einfachhttps://
mitgit://
in der URL. Ich weiß nicht, warum GitHub diese versteckte Funktion nicht bewirbt.fatal: The remote end hung up unexpectedly
. Versucht auf zwei verschiedenen Servern mit jQuery Github Repo.git config url.<base>.insteadOf
das Remote-Repository zwischengespeichert habe. Ich habe daherfile://
in der Realität eine URL verwendet. Ich bezweifle, dassgit archive
dies jemals mitgit://
URLs funktionieren könnte, da esgit-upload-archive
auf der Remote-Seite ausgeführt werden muss. Es sollte möglich sein, dasssh
Protokoll zu verwenden, außer dass Github es nicht zulässt (Invalid command: 'git-upload-archive'
).Aus dem Git-Handbuch :
Verwenden des Git-Checkout-Index zum "Exportieren eines gesamten Baums"
Die Präfix-Fähigkeit macht es grundsätzlich trivial, den Git-Checkout-Index als Funktion "Als Baum exportieren" zu verwenden. Lesen Sie einfach den gewünschten Baum in den Index und gehen Sie wie folgt vor:
$ git checkout-index --prefix=git-export-dir/ -a
quelle
git read-tree bar:foo
Und danachgit checkout-index --prefix=export_dir/ -a
sollten Sie es vielleicht tungit update-index master
Ich habe einen einfachen Wrapper geschrieben
git-checkout-index
, den Sie wie folgt verwenden können:Wenn das Zielverzeichnis bereits vorhanden ist, müssen Sie
-f
oder hinzufügen--force
.Die Installation ist einfach; Legen Sie das Skript einfach irgendwo in Ihrem ab
PATH
und stellen Sie sicher, dass es ausführbar ist.Das Github-Repository für
git-export
quelle
Es scheint, dass dies bei Git weniger ein Problem ist als bei SVN. Git legt nur einen .git-Ordner im Repository-Stammverzeichnis ab, während SVN in jedem Unterverzeichnis einen .svn-Ordner ablegt. "SVN-Export" vermeidet also rekursive Befehlszeilenmagie, während bei Git keine Rekursion erforderlich ist.
quelle
Das Äquivalent von
in einem bestehenden Repo ist
Das Äquivalent von
ist
quelle
git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... Die Archivierung mit Zeitstempeln ist jedoch nicht gerade trivial, also habe ich eine gepostet Beispiel unten .git archive branchname | tar xC otherpath
C
Option zum Teer nur GNU-Teer ist.Wenn Sie Dateien mit nicht ausschließen,
.gitattributes
export-ignore
versuchen Sie esgit checkout
und
Zusätzlich können Sie jeden Zweig oder Tag oder von einer bestimmten Commit-Revision wie in SVN erhalten, indem Sie einfach die SHA1 hinzufügen (SHA1 in Git entspricht der Revisionsnummer in SVN).
Das
/path/to/checkout/
muss leer sein, Git löscht keine Datei, überschreibt aber gleichnamige Dateien ohne VorwarnungUPDATE: Um das enthauptete Problem zu vermeiden oder das funktionierende Repository intakt zu lassen, wenn Sie die Kasse für den Export mit Tags, Zweigen oder SHA1 verwenden, müssen Sie hinzufügen
-- ./
am EndeDer doppelte Strich
--
teilt git mit, dass alles nach den Bindestrichen Pfade oder Dateien sind, und auch in diesem Fall, dassgit checkout
das nicht geändert werden sollHEAD
Beispiele:
Dieser Befehl ruft nur das libs-Verzeichnis und auch die
readme.txt
Datei von diesem Commit abDadurch werden
my_file_2_behind_HEAD.txt
zwei Commits hinter dem Kopf erstellt (überschrieben)HEAD^2
Um den Export eines anderen Zweigs zu erhalten
Beachten Sie, dass dies
./
relativ zum Stammverzeichnis des Repositorys istquelle
Ich benutze Git-Submodule ausgiebig. Dieser funktioniert für mich:
quelle
.htaccess
.rsync
listet meine Kopie das Argument als auf--cvs-exclude
. Außerdem kopiert es immer noch.gitattributes
und.gitignore
Ich habe diese Seite häufig aufgerufen, 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 beabsichtigt hat, da svn einen zentralisierten Repository-Ansatz verfolgt:
Das Exportieren eines bestimmten Zweigs mit svn erfolgt durch Angabe des entsprechenden Pfads
Wenn Sie eine bestimmte Version erstellen, ist es nützlich, einen stabilen Zweig wie zum Beispiel
--branch stable
oder zu klonen--branch release/0.9
.quelle
git archive | tar
Ansatz ist nicht auf POSIX-inkompatible Shell-Umgebungen anwendbar (z. B. AppVeyors CMD- oder PowerShell-basiertes CI), was nicht ideal ist. Dergit checkout
Ansatz ändert den Index des Hauptarbeitsbaums, was schrecklich ist. Dergit checkout-index
Ansatz erfordert, dass der Index des Hauptarbeitsbaums zuvor geändert wird, was noch schlimmer ist. Der traditionellegit clone
Ansatz klont den gesamten Verlauf des Repositorys, bevor dieser Verlauf gelöscht wird, was verschwenderisch ist. Dies ist die einzig vernünftige Lösung.file://
Protokoll der absolute Pfad des zu klonenden Git-Arbeitsbaums das Präfix vorangestellt werden sollte (zgit clone --depth 1 --branch v3.14.15 file:///home/me/src_repo trg_repo
. B. ). Andernfalls wird"warning: --depth is ignored in local clones; use file:// instead."
eher ein Standard als ein flacher Klon ausgegeben und ausgeführt, wodurch der gesamte Zweck dieser Antwort zunichte gemacht wird. Salud!Dadurch werden alle Inhalte abzüglich der .dot-Dateien kopiert. Ich verwende dies, um git-geklonte Projekte ohne das .git-Zeug in das Git-Repo meiner Web-App zu exportieren.
Einfache alte Bash funktioniert einfach super :)
quelle
.gitignore
, das wird nicht.So einfach wie Klonen, dann löschen Sie den .git-Ordner:
git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git
quelle
Für GitHub-Benutzer
git archive --remote
funktioniert die Methode nicht direkt, da die Export-URL kurzlebig ist . Sie müssen GitHub nach der URL fragen und diese URL dann herunterladen.curl
macht das einfach:Dadurch erhalten Sie den exportierten Code in einem lokalen Verzeichnis. Beispiel:
Bearbeiten
Wenn Sie möchten, dass der Code in ein bestimmtes, vorhandenes Verzeichnis gestellt wird (und nicht in das zufällige von github):
quelle
Ja, dies ist ein sauberer und ordentlicher Befehl zum Archivieren Ihres Codes ohne Git-Aufnahme in das Archiv. Es ist gut, ihn weiterzugeben, ohne sich Gedanken über den Verlauf des Git-Commits zu machen.
quelle
Ich möchte nur darauf hinweisen, dass Sie es sind
Dann können Sie einfach
cp foo [destination]
anstelle der genannten verwendengit-archive master foo | -x -C [destination]
.quelle
Sie können ein Remote-Repo bei jedem Commit als Zip-Datei archivieren.
quelle
Bash-Implementierung von Git-Export.
Ich habe die Prozesse zum Erstellen und Entfernen von .empty-Dateien nach ihrer eigenen Funktion segmentiert, um sie in der Implementierung von 'git-archive' wiederzuverwenden (wird später veröffentlicht).
Ich habe dem Prozess auch die Datei '.gitattributes' hinzugefügt, um unerwünschte Dateien aus dem Zielexportordner zu entfernen. Eingeschlossene Ausführlichkeit in den Prozess, während die Funktion "Git-Export" effizienter wird.
EMPTY_FILE = ". Leer";
quelle
Wenn Sie etwas wollen, das mit Submodulen funktioniert, ist dies möglicherweise einen Versuch wert.
Hinweis:
Annahmen:
quelle
Meine Präferenz wäre eigentlich, einen dist zu haben Ziel in Ihrem Makefile (oder einem anderen Build-System) zu haben, das ein verteilbares Archiv Ihres Codes exportiert (.tar.bz2, .zip, .jar oder was auch immer angemessen ist). Wenn Sie zufällig GNU-Autotools oder Perls MakeMaker-Systeme verwenden, ist dies meiner Meinung nach automatisch für Sie vorhanden. Wenn nicht, empfehle ich dringend, es hinzuzufügen.
ETA (06.09.2012): Wow, harte Downvotes. Ich glaube immer noch, dass es besser ist, Ihre Distributionen mit Ihren Build-Tools zu erstellen, als mit Ihrem Quellcode-Kontroll-Tool. Ich glaube daran, Artefakte mit Build-Tools zu erstellen. In meinem aktuellen Job wird unser Hauptprodukt mit einem Ameisenziel gebaut. Wir sind gerade dabei, Quellcode-Kontrollsysteme zu wechseln, und das Vorhandensein dieses Ameisenziels bedeutet einen Aufwand weniger bei der Migration.
quelle
Dadurch werden die Dateien in einer Reihe von Commits (C bis G) in eine TAR-Datei kopiert. Hinweis: Dadurch werden nur die Dateien festgeschrieben. Nicht das gesamte Repository. Von hier leicht modifiziert
Beispiel für einen Commit-Verlauf
A -> B -> C -> D -> E -> F -> G -> H -> I.
git-diff-tree Handbuch Seite
-r -> in Unterbäume zurückgreifen
--no-commit-id -> git diff-tree gibt gegebenenfalls eine Zeile mit der Commit-ID aus. Dieses Flag unterdrückte die Ausgabe der Festschreibungs-ID.
--name-only -> Nur Namen geänderter Dateien anzeigen.
--diff-filter = ACMRT -> Nur diese Dateien auswählen. Eine vollständige Liste der Dateien finden Sie hier
C..G -> Dateien in diesem Commit-Bereich
C ~ -> Dateien aus Commit C einschließen. Nicht nur Dateien seit Commit C.
| xargs tar -rf myTarFile -> gibt an tar aus
quelle
Nach meinem Verständnis geht es eher darum, nur einen bestimmten Status vom Server herunterzuladen, ohne Verlauf und ohne Daten anderer Zweige, als einen Status aus einem lokalen Repository zu extrahieren (wie es viele Antworten hier tun).
Das kann so gemacht werden:
--single-branch
ist seit Git 1.7.10 (April 2012) verfügbar.--depth
ist war?) angeblich fehlerhaft, aber für den Fall eines Exports sollten die genannten Probleme keine Rolle spielen.quelle
--depth
, was impliziert,--single-branch
wenn nichts--no-single-branch
angegeben ist, was bedeutet, dass dies wahrscheinlich den gleichen Effekt hat. Nicht sicher, kann ein Experte bestätigen?Ich brauchte dies für ein Bereitstellungsskript und konnte keinen der oben genannten Ansätze verwenden. Stattdessen habe ich eine andere Lösung gefunden:
quelle
mkdir -p "$2" && git --git-dir="$1" archive HEAD | tar -x -C "$2"
etwas länger ist.Auf einfache Weise ist dies eine Funktion für .bash_profile. Sie entpackt das Archiv direkt am aktuellen Speicherort und konfiguriert zuerst Ihren üblichen [url: path]. HINWEIS: Mit dieser Funktion vermeiden Sie den Klonvorgang, der direkt vom Remote-Repo abgerufen wird.
Alias für .gitconfig, gleiche Konfiguration erforderlich (TAKE CARE führt den Befehl in .git-Projekten aus, er springt IMMER wie zuvor beschrieben zum Basisverzeichnis , bis dies behoben ist. Ich persönlich bevorzuge die Funktion
quelle
Bei weitem der einfachste Weg, den ich gesehen habe (und auch unter Windows funktioniert), ist
git bundle
:git bundle create /some/bundle/path.bundle --all
Weitere Informationen finden Sie in dieser Antwort: Wie kann ich mein Git-Repository von meinem Windows-Computer über ein USB-Laufwerk auf einen Linux-Computer kopieren?
quelle
git bundle
enthält den.git
Ordner, den das OP nicht möchte;git archive
scheint der angemessenere Weg--all
Switch?Ich habe eine andere Lösung, die gut funktioniert, wenn Sie eine lokale Kopie des Repositorys auf dem Computer haben, auf dem Sie den Export erstellen möchten. In diesem Fall wechseln Sie in dieses Repository-Verzeichnis und geben Sie den folgenden Befehl ein:
GIT_WORK_TREE=outputdirectory git checkout -f
Dies ist besonders nützlich, wenn Sie eine Website mit einem Git-Repository verwalten und eine saubere Version in auschecken möchten
/var/www/
. Fügen Sie in diesem Fall diesen Befehl in ein.git/hooks/post-receive
Skript ein (hooks/post-receive
in ein nacktes Repository, das in dieser Situation besser geeignet ist).quelle
Ich denke, @Aredridels Beitrag war am nächsten, aber da steckt noch ein bisschen mehr dahinter - also werde ich dies hier hinzufügen. Die Sache ist,
svn
wenn Sie sich in einem Unterordner eines Repos befinden und Folgendes tun:dann
svn
werden alle Dateien exportieren , die unter Revisionskontrolle sind (sie auch frisch hinzugefügt haben könnte, oder Modified - Zustand) - und wenn Sie andere „Junk“ in diesem Verzeichnis haben (und ich bin nicht mitgerechnet.svn
Unterordner hier, aber sichtbare Dinge wie.o
Dateien) wird es nicht exportiert; Es werden nur die vom SVN-Repo registrierten Dateien exportiert. Für mich ist eine schöne Sache, dass dieser Export auch Dateien mit lokalen Änderungen enthält, die noch nicht festgeschrieben wurden. und eine andere schöne Sache ist, dass die Zeitstempel der exportierten Dateien die gleichen sind wie die Originaldateien. Oder wiesvn help export
es heißt:git
Vergleichen Sie die Ausgabe dieser Befehle (in einem Unterordner einesgit
Repos Ihrer Wahl) , um festzustellen, dass die Zeitstempel nicht erhalten bleiben :... und:
... und ich
git archive
stelle auf jeden Fall fest, dass alle Zeitstempel der archivierten Datei gleich sind!git help archive
sagt:... aber anscheinend setzen beide Fälle die "Änderungszeit jeder Datei"; dabei nicht bleiben die tatsächlichen Zeitstempel dieser Dateien erhalten!
Um auch die Zeitstempel beizubehalten, ist hier ein
bash
Skript, das eigentlich ein "Einzeiler" ist, wenn auch etwas kompliziert - daher wird es unten in mehreren Zeilen veröffentlicht:Beachten Sie, dass davon ausgegangen wird, dass Sie den Inhalt in das "aktuelle" Verzeichnis (oben
/media/disk/git_svn/subdir
) exportieren - und das Ziel, in das Sie exportieren, etwas ungünstig platziert ist, sich jedoch in einerDEST
Umgebungsvariablen befindet. Beachten Sie, dass mit diesem Skript; Sie müssen die erstellenDEST
Verzeichnis manuell selbst , bevor Sie das obige Skript ausführen.Nachdem das Skript ausgeführt wurde, sollten Sie in der Lage sein zu vergleichen:
... und hoffentlich die gleichen Zeitstempel sehen (für die Dateien, die unter Versionskontrolle standen).
Hoffe das hilft jemandem,
Prost!
quelle
Ein Git-Export in ein Zip-Archiv beim Hinzufügen eines Präfixes (z. B. Verzeichnisname):
quelle
Wenn Sie auch Submodule benötigen, sollte dies den Trick tun: https://github.com/meitar/git-archive-all.sh/wiki
quelle
Ich habe die folgende Dienstprogrammfunktion in meiner .bashrc-Datei: Es erstellt ein Archiv des aktuellen Zweigs in einem Git-Repository.
quelle