La risposta breve (TL; DR)
"Tree-ish" è un termine che si riferisce a qualsiasi identificatore (come specificato nella documentazione delle revisioni di Git ) che alla fine porta a un (sotto) albero di directory (Git si riferisce alle directory come "alberi" e "oggetti albero").
Nel caso del poster originale, foo
è una directory che vuole specificare. Il modo corretto per specificare una (sotto) directory in Git è usare questa sintassi "ad albero" (elemento # 15 dalla documentazione delle revisioni di Git ):
<rev>:<path>
, Ad esempio HEAD:README
, :README
,master:./README
Un suffisso :
seguito da un percorso denomina il blob o l'albero nel percorso specificato nell'oggetto tree-ish denominato dalla parte prima dei due punti.
Quindi, in altre parole, master:foo
è la sintassi corretta, no master/foo
.
Altro "Tree-ish" (Plus Commit-ish)
Ecco un elenco completo di identificatori di commit e tree-ish (dalla documentazione delle revisioni di Git , grazie a LopSae per averlo segnalato ):
----------------------------------------------------------------------
| 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
----------------------------------------------------------------------
Gli identificatori # 1-14 sono tutti "commit-ish", perché tutti portano a commit, ma poiché i commit puntano anche ad alberi di directory, alla fine portano tutti a oggetti (sotto) albero di directory, e possono quindi essere usati anche come "albero -ish".
# 15 può anche essere usato come tree-ish quando si riferisce a una (sotto) directory, ma può anche essere usato per identificare file specifici. Quando si riferisce ai file, non sono sicuro che sia ancora considerato "tree-ish", o se agisce più come "blob-ish" (Git si riferisce ai file come "blob").
La lunga risposta
Ai livelli più bassi, Git tiene traccia del codice sorgente utilizzando quattro oggetti fondamentali:
- Tag annotati, che puntano ai commit.
- Commits, che puntano all'albero della directory principale del progetto.
- Alberi, che sono directory e sottodirectory.
- Blob, che sono file.
Ciascuno di questi oggetti ha il proprio hash ID sha1, poiché Linus Torvalds ha progettato Git come un filesystem indirizzabile al contenuto , cioè i file possono essere recuperati in base al loro contenuto (gli ID sha1 sono generati dal contenuto del file). Il libro Pro Git fornisce questo diagramma di esempio :
Molti comandi Git possono accettare identificatori speciali per commit e (sotto) alberi di directory:
"Commit-ish" sono identificatori che alla fine portano a un oggetto di commit. Per esempio,
tag -> commit
"Tree-ish" sono identificatori che alla fine portano a oggetti ad albero (cioè directory).
tag -> commit -> project-root-directory
Poiché gli oggetti commit puntano sempre a un oggetto albero di directory (la directory radice del progetto), qualsiasi identificatore "commit-ish" è, per definizione, anche "tree-ish". In altre parole, qualsiasi identificatore che porta a un oggetto commit può anche essere utilizzato per portare a un (sotto) oggetto albero di directory .
Ma poiché gli oggetti dell'albero di directory non puntano mai ai commit nel sistema di controllo delle versioni di Git, non tutti gli identificatori che puntano a un (sotto) albero di directory possono anche essere usati per puntare a un commit. In altre parole, l'insieme di identificatori "commit-ish" è un sottoinsieme rigoroso dell'insieme di identificatori "tree-ish".
Come spiegato nella documentazione ( grazie a Trebor per avermi aiutato a trovarlo ):
<tree>
Indica il nome di un oggetto albero.
<commit>
Indica il nome di un oggetto di commit.
<tree-ish>
Indica un nome di oggetto albero, commit o tag. Un comando che accetta un <tree-ish>
argomento alla fine vuole operare su un <tree>
oggetto ma dereferisce automaticamente <commit>
e gli <tag>
oggetti che puntano a <tree>
.
<commit-ish>
Indica il nome di un oggetto di commit o tag. Un comando che accetta un <commit-ish>
argomento alla fine vuole operare su un <commit>
oggetto ma dereferenzia automaticamente gli <tag>
oggetti che puntano a <commit>
.
L'insieme di identificatori ad albero che non possono essere usati come commit-ish sono
<rev>:<path>
, che porta direttamente agli alberi di directory, non agli oggetti di commit. Ad esempio HEAD:subdirectory
,.
Identificatori Sha1 degli oggetti dell'albero di directory .
master:foo
è albero-ish, ma è meglio usaremaster foo
come i<tree-ish> <path>
.