A resposta curta (TL; DR)
"Tree-ish" é um termo que se refere a qualquer identificador (como especificado na documentação de revisões do Git ) que finalmente leva a uma (sub) árvore de diretório (Git refere-se a diretórios como "árvores" e "objetos de árvore").
No caso do pôster original, foo
é um diretório que ele deseja especificar. A maneira correta de especificar um diretório (sub) no Git é usar esta sintaxe "tree-ish" (item 15 da documentação de revisões do Git ):
<rev>:<path>
, Por exemplo HEAD:README
, :README
,master:./README
Um sufixo :
seguido de um caminho nomeia o blob ou a árvore no caminho especificado no objeto tree-ish nomeado pela parte antes dos dois pontos.
Portanto, em outras palavras, master:foo
é a sintaxe correta, não master/foo
.
Outro "Tree-ish" (Plus Commit-ish)
Aqui está uma lista completa dos identificadores commit-ish e tree-ish (da documentação de revisões do Git , obrigado ao LopSae por apontá-lo ):
----------------------------------------------------------------------
| 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
----------------------------------------------------------------------
Os identificadores 1-14 são todos "commit-ish", porque todos levam a confirmações, mas como confirmações também apontam para árvores de diretório, todos acabam levando a objetos da (sub) árvore de diretório e, portanto, também podem ser usados como "árvore". -ish ".
O número 15 também pode ser usado como árvore quando se refere a um diretório (sub), mas também pode ser usado para identificar arquivos específicos. Quando se refere a arquivos, não tenho certeza se ainda é considerado "tree-ish" ou se funciona mais como "blob-ish" (Git se refere a arquivos como "blobs").
A resposta longa
Nos níveis mais baixos, o Git mantém o controle do código-fonte usando quatro objetos fundamentais:
- Tags anotadas, que apontam para confirmações.
- Confirmações, que apontam para a árvore de diretórios raiz do seu projeto.
- Árvores, que são diretórios e subdiretórios.
- Blobs, que são arquivos.
Cada um desses objetos possui seu próprio ID de hash sha1, pois Linus Torvalds projetou o Git como um sistema de arquivos endereçável por conteúdo , ou seja, os arquivos podem ser recuperados com base em seu conteúdo (os IDs sha1 são gerados a partir do conteúdo do arquivo). O livro Pro Git fornece este exemplo de diagrama :
Muitos comandos Git podem aceitar identificadores especiais para confirmações e (sub) árvores de diretório:
"Commit-ish" são identificadores que levam a um objeto de confirmação. Por exemplo,
tag -> commit
"Tree-ish" são identificadores que levam a objetos de árvore (ou seja, diretório).
tag -> commit -> project-root-directory
Como os objetos de confirmação sempre apontam para um objeto de árvore de diretório (o diretório raiz do seu projeto), qualquer identificador que seja "commit-ish" é, por definição, também "tree-ish". Em outras palavras, qualquer identificador que leve a um objeto de confirmação também pode ser usado para levar a um objeto de árvore (sub) de diretório .
Mas como os objetos da árvore de diretórios nunca apontam para confirmações no sistema de versão do Git, nem todo identificador que aponta para uma (sub) árvore de diretórios também pode ser usado para apontar para uma confirmação. Em outras palavras, o conjunto de identificadores "commit-ish" é um subconjunto estrito do conjunto de identificadores "tree-ish".
Conforme explicado na documentação ( obrigado a Trebor por me ajudar a encontrá-lo ):
<tree>
Indica um nome de objeto de árvore.
<commit>
Indica um nome de objeto de confirmação.
<tree-ish>
Indica uma árvore, confirmar ou marcar o nome do objeto. Um comando que aceita um <tree-ish>
argumento, em última análise, deseja operar um <tree>
objeto, mas desreferencias automaticamente <commit>
e <tag>
objetos que apontam para a <tree>
.
<commit-ish>
Indica um nome de objeto de confirmação ou marca. Um comando que aceita um <commit-ish>
argumento basicamente deseja operar em um <commit>
objeto, mas desreferencia automaticamente os <tag>
objetos que apontam para a <commit>
.
O conjunto de identificadores tree-ish que não podem ser usados como commit-ish são
<rev>:<path>
, que leva diretamente a árvores de diretório, não confirma objetos. Por exemplo HEAD:subdirectory
,.
Identificadores Sha1 de objetos da árvore de diretórios .
master:foo
é árvore, mas é melhor você usarmaster foo
como i<tree-ish> <path>
.