Ich bin sehr verwirrt darüber, wie man es benutzt git archive
.
Ich habe ein Git-Repository mit den Ordnern Foo , Bar und Baz auf der obersten Ebene. Ich muss den Ordner Foo auf eine SVN-artige Weise exportieren , um eine schnelle Testbereitstellung zu ermöglichen.
Ich habe gelernt, dass ich git-archive
eine Art SVN-artigen Export verwenden kann .
Aber hier ist die Sache: Folgendes funktioniert gut:
git archive master | tar -x -C ~/destination
es ergibt sich Foo , Bar , Baz Ordner im Zielordner.
Der folgende Fehler tritt jedoch auf fatal not a valid object name
:
git archive master/foo | tar -x -C ~/destination
Die Dokumentation
Als Synopse für das git archive
Programm sehe ich, dass es einen <tree-ish> [path]
als Parameter annehmen kann (Synopse in relevanten Teilen zusammengefasst):
git archive <tree-ish> [path...]
Wenn master/foo
nicht tree-ish
, was dann?
git
git-archive
dkinzer
quelle
quelle
master:foo
ist baumartig, aber du verwendest es bessermaster foo
als ich<tree-ish> <path>
.git archive
Befehle nicht mehr auf Tree-ish, aber als ich diese Frage stellte, taten sie es. Und in Bezug auf die akzeptierte Antwort; Zu der Zeit machte sich sonst niemand die Mühe, die Frage zu beantworten. Es war über zwei Jahre später, als sogar eine andere Antwort veröffentlicht wurde.Antworten:
Die kurze Antwort (TL; DR)
"Tree-ish" ist ein Begriff, der sich auf einen Bezeichner bezieht (wie in der Dokumentation zu Git-Revisionen angegeben ), der letztendlich zu einem (Unter-) Verzeichnisbaum führt (Git bezeichnet Verzeichnisse als "Bäume" und "Baumobjekte").
Im Fall des Originalplakats handelt es sich
foo
um ein Verzeichnis , das er angeben möchte. Die korrekte Methode zum Angeben eines (Unter-) Verzeichnisses in Git ist die Verwendung dieser "baumartigen" Syntax (Element Nr. 15 aus der Git-Revisionsdokumentation ):Mit anderen Worten,
master:foo
ist also die richtige Syntax, nichtmaster/foo
.Andere "Tree-ish" (Plus Commit-ish)
Hier ist eine vollständige Liste der Commit-ish- und Tree-ish-Bezeichner (aus der Git-Revisionsdokumentation , danke an LopSae für den Hinweis ):
Die Bezeichner Nr. 1-14 sind alle "Commit-ish", da sie alle zu Commits führen. Da Commits jedoch auch auf Verzeichnisbäume verweisen, führen sie letztendlich alle zu (Unter-) Verzeichnisbaumobjekten und können daher auch als "Baum" verwendet werden -ish ".
# 15 kann auch als Baum verwendet werden, wenn es sich auf ein (Unter-) Verzeichnis bezieht, aber es kann auch verwendet werden, um bestimmte Dateien zu identifizieren. Wenn es sich auf Dateien bezieht, bin ich mir nicht sicher, ob es immer noch als "baumartig" betrachtet wird oder ob es sich eher wie "blob-ish" verhält (Git bezeichnet Dateien als "blobs").
Die lange Antwort
Auf den niedrigsten Ebenen verfolgt Git den Quellcode mithilfe von vier grundlegenden Objekten:
Jedes dieser Objekte hat seine eigene sha1-Hash-ID, da Linus Torvalds Git wie ein inhaltsadressierbares Dateisystem entworfen hat, dh Dateien können basierend auf ihrem Inhalt abgerufen werden (sha1-IDs werden aus Dateiinhalten generiert). Das Pro Git-Buch enthält dieses Beispieldiagramm :
Viele Git-Befehle können spezielle Bezeichner für Commits und (Unter-) Verzeichnisbäume akzeptieren:
"Commit-ish" sind Bezeichner, die letztendlich zu einem Commit-Objekt führen. Beispielsweise,
tag -> commit
"Tree-ish" sind Bezeichner, die letztendlich zu Baumobjekten (dh Verzeichnisobjekten) führen.
tag -> commit -> project-root-directory
Da Commit-Objekte immer auf ein Verzeichnisbaumobjekt (das Stammverzeichnis Ihres Projekts) verweisen, ist jeder Bezeichner, der "commit-ish" lautet, per Definition auch "tree-ish". Mit anderen Worten, jeder Bezeichner, der zu einem Festschreibungsobjekt führt, kann auch verwendet werden, um zu einem (Unter-) Verzeichnisbaumobjekt zu führen .
Da Verzeichnisbaumobjekte im Versionssystem von Git niemals auf Commits verweisen, kann nicht jeder Bezeichner, der auf einen (Unter-) Verzeichnisbaum verweist, auch verwendet werden, um auf ein Commit zu verweisen. Mit anderen Worten, die Menge der "Commit-ish" -Kennungen ist eine strikte Teilmenge der Menge der "Tree-ish" -Kennungen.
Wie in der Dokumentation erläutert ( danke an Trebor, der mir bei der Suche geholfen hat ):
Die Menge der baumartigen Bezeichner, die nicht als festgeschrieben werden können, sind
<rev>:<path>
, was direkt zu Verzeichnisbäumen führt , keine Objekte festschreiben. Zum BeispielHEAD:subdirectory
.Sha1-Bezeichner von Verzeichnisbaumobjekten .
quelle
<tree-ish>
die beide verwenden, akzeptieren beide undman gitrevisions
definieren :trees ("directories of files")
.git-archive
dass es a braucht,<tree-ish>
aber a nicht erlaubt<sha1>
. Also denke ich, es sollte stattdessen nach einem fragen<tree-ish-ish>
. stackoverflow.com/a/12073669/680464Ein Baum ist eine Möglichkeit, einen bestimmten Baum zu benennen, der einer der folgenden sein kann:
origin/somebranch
Darüber hinaus kann jeder der oben genannten Punkte mit
^
,~
. Referenzen können die@{}
Notation auch für einige zusätzliche Funktionen verwenden:HEAD^
oderHEAD^1
wird an den ersten Elternteil von HEAD aufgelöst.HEAD^2
wird zum zweiten Elternteil aufgelöstHEAD^3
wird zum dritten Elternteil und so weiter aufgelöst, was seltener ist und aus Verschmelzungen mit der Octopus-Strategie resultiert .HEAD~
oderHEAD~1
wird zum ersten Elternteil des Kopfes aufgelöstHEAD~2
wird zum ersten Elternteil des ersten Elternteils von HEAD aufgelöst. Dies wäre das gleiche wieHEAD^^
HEAD@{0}
wird auf den aktuellen HEAD aufgelöstHEAD@{1}
wird zum vorherigen Kopf aufgelöst. Dies kann nur von Referenzen verwendet werden, da das Referenzprotokoll verwendet wird. BeiHEAD
jedem Commit, Merge und Checkout wird der Wert von HEAD geändert und somit dem Protokoll hinzugefügt.git reflog HEAD
zeigt das Referenzprotokoll an, in dem Sie alle Bewegungen von HEAD sehen können und in was@{1}
und so weiter aufgelöst wird.Die meisten der oben weiter , so lange kombiniert werden , wie es sinnvoll , in Ihrem Repository macht, zum Beispiel:
HEAD@{2}~3
,somebranch^2~4
,c00e66e~4^2
,anotherbranch~^~^~^
.Jede der oben beschriebenen und ihre Kombinationen ist in der Dokumentation als baumartig gemeint. Dies ist nur eine Möglichkeit zu sagen, welcher Baum (oder welche Revision) für die meisten git-Befehle verwendet werden sollte.
Weitere Informationen unter Revisionsauswahl im Git-Buch .
quelle
master:path/to/directory
ist ein Tree-ish, aber kein Commit-ish. Cupcake's macht das klarer.Sie wollen wahrscheinlich
Der Ausdruck
master/foo
macht keinen Sinn:master
ist ein Filialname undfoo
ein Verzeichnisname, wie ich vermute.Bearbeiten : (Defekter Link entfernt. Siehe Kommentare.)
quelle
Für Definitionen
<tree-ish>
und<commit-ish>
finden Sie in der git (1) man - Seite. Sie müssen nach den Begriffen suchen. Im Allgemeinen<tree-ish>
bedeutet dies einen Verweis auf ein Git-Baumobjekt. Wenn Sie jedoch einen Objekttyp übergeben, der auf einen Baum verweist (z. B. ein Commit oder eine Verzweigung), verwendet git automatisch den referenzierten Baum.quelle
gitrevisions(7)
.Ich bin ein Neuling in der Quellcodeverwaltung und Git. Das weiß ich. Ein Baum ist die Struktur von Dateien in einem Repository. Es ähnelt einem Verzeichnis in einem Dateisystem. Siehe - Welches Git-Tool hat diese Baumansicht generiert?
Baumartig bedeutet wie ein Baum. Es verweist auf einen Teil oder ein Commit eines Baums. Sie können auf ein Commit verweisen, indem Sie eines der folgenden Elemente verwenden: den SHA-1-Hash eines Commits, einen HEAD-Zeiger, eine Verzweigungsreferenz oder eine Tag-Referenz vollständig oder teilweise. Eine andere Methode verwendet eine der genannten Methoden zusammen mit Vorfahren oder Eltern eines Commits. Beispiel der Vorfahren:
quelle
Aus dem Git-Glossar ist tree-ish "Ein Baumobjekt oder ein Objekt, das rekursiv auf ein Baumobjekt dereferenziert werden kann." Commit, HEAD und Tag sind Beispiele für baumartige Objekte.
quelle