Que signifie l'arbre-ish en Git?

je suis très confus sur la façon d'utiliser git archive .

j'ai un dépôt git avec le dossier Foo , Bar et Baz au niveau supérieur. Je dois exporter le dossier Foo D'une manière SVN-ish pour un déploiement rapide.

j'ai appris que je pouvais utiliser git-archive dans un SVN-ish export .

Mais voici la chose, les travaux suivants amende:

git archive master | tar -x -C ~/destination

il résulte en Foo , Bar , baz dossiers dans le destination dossier.

toutefois, la mention sera remplacée par fatal not a valid object name :

git archive master/foo | tar -x -C ~/destination

le Documentation

à la recherche du synopsis pour le programme git archive je vois qu'il peut prendre un <tree-ish> [path] comme paramètre (synopsis résumé aux parties pertinentes):

git archive <tree-ish> [path...]

si master/foo n'est pas tree-ish , alors qu'est-ce que c'est?

83
demandé sur Community 2010-10-28 19:25:03

5 réponses

La Réponse Courte (TL;DR)

"l'Arbre-ish" est un terme qui fait référence à un identificateur (comme spécifié dans le le Git révision de la documentation ) qui conduit finalement à un (sous) répertoire arbre (Git se réfère aux répertoires comme "arbres" et"objets arbre").

dans le cas de l'affiche originale, foo est un répertoire qu'il veut spécifier. La manière correcte de spécifiez un répertoire (sub)dans Git est d'utiliser ceci "l'arbre-ish" syntaxe (point n ° 15 de le Git révisions de la documentation ):

<rev>:<path> , p.ex. HEAD:README , :README , master:./README

suffixe : suivi d'un chemin nomme le blob ou l'arbre au chemin donné en l'objet arborescent nommé par la partie avant le colon.

Donc, en d'autres termes, master:foo est la syntaxe correcte, pas master/foo .

Autres "Arbre-ish" (en Plus de s'Engager à-ish)

Voici une liste complète des identificateurs commit-ish et tree-ish (de le Git Documentation des révisions , merci à LopSae pour l'avoir pointé out ):

----------------------------------------------------------------------
|    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
----------------------------------------------------------------------

les identificateurs #1-14 sont tous "commit-ish", parce qu'ils mènent tous à commits, mais parce que engage indique aussi les arborescences des répertoires, elles conduisent toutes finalement à (sous -) répertoire des objets de l'arborescence, et peut donc également être utilisé comme "l'arbre-ish".

#15 peut également être utilisé comme arbre-ish quand il se réfère à un sous-répertoire, mais il peut également être utilisée pour identifier des fichiers. Quand il se réfère à des fichiers, Je ne suis pas c'est sûr si c'est toujours considéré comme "arbre-ish", ou si c'est plutôt "blob-ish" (Git renvoie aux fichiers comme "blobs").

La Longue Réponse

à son niveau le plus bas niveau, Git garde la trace du code source en utilisant quatre les objets:

  1. tags annotés, qui pointent pour commettre.
  2. Commits, qui pointent vers l'arbre des répertoires racine de votre projet.
  3. arbres, qui sont des répertoires et des sous-répertoires.
  4. Blobs, qui sont des fichiers.

chacun de ces objets a son propre sha1 hash ID, depuis Linus Torvalds conçu Git comme un content - addressable système de fichiers, c'est à dire les fichiers peuvent être récupérés basé sur leur contenu (les ID sha1 sont générés à partir du contenu du fichier). Le Pro Git le livre donne cet exemple de diagramme :

Figure 9-3 from Pro Git book

de nombreuses commandes Git peuvent accepter des identificateurs spéciaux pour les commits et le répertoire (sub) arbres:

  • "Commit-ish" sont les identificateurs qui conduisent finalement à un objet commit. Par exemple,

    tag -> commit

  • "l'Arbre-ish" sont des identifiants qui conduisent finalement à l'arbre (c) du répertoire d'objets.

    tag -> commit -> project-root-directory

parce que les objets commit pointent toujours vers un objet directory tree (la racine répertoire de votre projet), tout identifiant qui est "commit-ish" est, par définition, aussi "arbre-ish". En d'autres termes, tout identificateur qui conduit à un commit object peut aussi être utilisé pour mener à un (sub)répertoire tree object .

mais puisque les objets de l'arborescence des répertoires ne pointent jamais vers commits dans le versioning de Git système, tous les identificateurs qui pointent vers une arborescence de répertoire (sub)ne peuvent pas être utilisé pour pointer vers un commit. En d'autres termes, l'ensemble des identificateurs "commit-ish" est une stricte sous-ensemble de l'ensemble de "l'arbre-ish" identificateurs.

comme expliqué dans la documentation ( merci à Trebor pour aider moi la trouvera ):

<tree>

indique le nom d'un objet arborescent.

<commit>

indique un nom d'objet commit.

<tree-ish>

indique un nom d'objet tree, commit ou tag. Commande qui prend un <tree-ish> argument veut finalement opérer sur un <tree> objet, mais automatiquement déréférence <commit> et <tag> objets de ce point à un <tree> .

<commit-ish>

indique un nom d'objet commit ou tag. Une commande qui prend un <commit-ish> argument veut finalement opérer sur un <commit> objet, mais automatiquement déréférence <tag> objets de ce point à un <commit> .

Le jeu de l'arbre-ish identifiants que ne peut être utilisé que s'engager à-ish sont

  1. <rev>:<path> , qui mène directement aux arbres répertoires, pas de commit objet. Par exemple, HEAD:subdirectory .

  2. Sha1 identificateurs de arborescence de répertoires objets.

123
répondu Community 2017-05-23 12:10:31

Un arbre-ish est une façon de nommer un arbre spécifique qui peut être l'un des suivants:

  • :
    • HEAD
    • Tags
    • noms des succursales
    • noms de branches avec télécommandes, comme origin/somebranch
  • Hash
  • shashes courts

en plus de cela, tout ce qui précède peut être ajouté avec ^ , ~ . Les références peuvent également utiliser la notation @{} pour certaines caractéristiques supplémentaires:

  • HEAD^ ou HEAD^1 sera résolu pour le premier parent de la TÊTE.
  • HEAD^2 permettra de résoudre à la deuxième parent
  • HEAD^3 résoudra au troisième parent et ainsi de suite, ce qui est plus rare et produit de fusionne avec le poulpe stratégie .
  • HEAD~ ou HEAD~1 permettra de résoudre pour le premier parent de tête
  • HEAD~2 se résoudra au premier parent du premier parent de la tête. Ce serait le même que HEAD^^
  • HEAD@{0} résoudra à la tête actuelle
  • HEAD@{1} se résoudra à la tête précédente. Ceci ne peut être utilisé que par les références puisqu'il fait usage de la référence journal. Dans le cas de HEAD chaque commit, merge, checkout va changer la valeur de HEAD et donc l'ajouter au log. git reflog HEAD affichera le journal de référence où vous pouvez voir tous les mouvements de la tête et correctement ce que @{1} et ainsi de suite résoudra.

la plupart des éléments ci-dessus peuvent être combinés à d'autres, à condition que cela ait du sens dans votre dépôt, par exemple:: HEAD@{2}~3 , somebranch^2~4 , c00e66e~4^2 , anotherbranch~^~^~^ .

donc n'importe lequel des décrits ci-dessus, et ses combinaisons, est ce qui est signifié dans la documentation comme un arbre-ish, qui est juste une façon de dire quel arbre (ou révision) est celui qui devrait être utilisé pour la plupart des commandes git.

Plus d'infos Révision de Sélection dans le Git livre .

42
répondu LopSae 2015-03-27 18:24:42

Vous voulez probablement

git archive master foo | tar -x -C ~/destination

l'expression master/foo n'a pas de sens: master est un nom de branche et foo est un nom de répertoire, comme je présume.

Modifier : (Supprimé lien brisé. Voir les commentaires.)

11
répondu Sven Marnach 2012-09-19 21:17:39

pour les définitions de <tree-ish> et <commit-ish> voir la page de manuel git(1) . Vous devrez chercher les Termes. En général <tree-ish> signifie une référence à un arbre git objet, mais si vous passez d'un type d'objet qui fait référence à l'arbre (comme une validation ou une branche), git utilisera automatiquement référencés arbre.

4
répondu Trebor Rude 2014-01-13 22:18:45

je suis un débutant au contrôle source et git. C'est ce que je sais. Une arborescence est la structure des fichiers d'un dépôt. Son similaire à un répertoire dans un système de fichiers.Voir - quel outil git a généré cette vue d'arbre?

arbre-ish signifie Comme un arbre. Il fait référence à une partie ou à la validation d'un arbre. Vous pouvez faire référence à une commit en utilisant n'importe lequel de ceux-ci: full ou part of the SHA-1 hash of a commit, HEAD pointer, branch reference, tag reference. Une autre méthode utilise l'un des moyens mentionnés avec les ancêtres ou les parents d'un commit. Ancêtres exemple: enter image description here

0
répondu stack1 2017-05-23 11:47:21