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 ):
<rev>:<path>
, Zum Beispiel HEAD:README
, :README
,master:./README
Ein Suffix :
gefolgt von einem Pfad benennt den Blob oder Baum am angegebenen Pfad im baumartigen Objekt, das von dem Teil vor dem Doppelpunkt benannt wird.
Mit anderen Worten, master:foo
ist also die richtige Syntax, nicht master/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 ):
----------------------------------------------------------------------
| Commit-ish/Tree-ish | Examples
----------------------------------------------------------------------
| 1. <sha1> | dae86e1950b1277e545cee180551750029cfe735
| 2. <describeOutput> | v1.7.4.2-679-g3bee7fb
| 3. <refname> | master, heads/master, refs/heads/master
| 4. <refname>@{<date>} | master@{yesterday}, HEAD@{5 minutes ago}
| 5. <refname>@{<n>} | master@{1}
| 6. @{<n>} | @{1}
| 7. @{-<n>} | @{-1}
| 8. <refname>@{upstream} | master@{upstream}, @{u}
| 9. <rev>^ | HEAD^, v1.5.1^0
| 10. <rev>~<n> | master~3
| 11. <rev>^{<type>} | v0.99.8^{commit}
| 12. <rev>^{} | v0.99.8^{}
| 13. <rev>^{/<text>} | HEAD^{/fix nasty bug}
| 14. :/<text> | :/fix nasty bug
----------------------------------------------------------------------
| Tree-ish only | Examples
----------------------------------------------------------------------
| 15. <rev>:<path> | HEAD:README, :README, master:./README
----------------------------------------------------------------------
| Tree-ish? | Examples
----------------------------------------------------------------------
| 16. :<n>:<path> | :0:README, :README
----------------------------------------------------------------------
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:
- Kommentierte Tags, die auf Commits verweisen.
- Commits, die auf den Stammverzeichnisbaum Ihres Projekts verweisen.
- Bäume, die Verzeichnisse und Unterverzeichnisse sind.
- Blobs, die Dateien sind.
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 ):
<tree>
Gibt einen Baumobjektnamen an.
<commit>
Gibt einen Commit-Objektnamen an.
<tree-ish>
Gibt einen Baum-, Commit- oder Tag-Objektnamen an. Ein Befehl, der ein <tree-ish>
Argument akzeptiert, möchte letztendlich ein <tree>
Objekt bearbeiten, aber automatisch Dereferenzen <commit>
und <tag>
Objekte, die auf a zeigen <tree>
.
<commit-ish>
Gibt einen Commit- oder Tag-Objektnamen an. Ein Befehl, der ein <commit-ish>
Argument akzeptiert, möchte letztendlich ein <commit>
Objekt bearbeiten <tag>
, dereferenziert jedoch automatisch Objekte, die auf a zeigen <commit>
.
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 Beispiel HEAD:subdirectory
.
Sha1-Bezeichner von Verzeichnisbaumobjekten .
master:foo
ist baumartig, aber du verwendest es bessermaster foo
als ich<tree-ish> <path>
.