150 votes

Que signifie tree-ish dans Git ?

Je ne sais pas comment utiliser git archive .

J'ai un dépôt git avec le dossier Foo , Barre y Baz au niveau supérieur. J'ai besoin d'exporter un dossier Foo dans une sorte de SVN pour un déploiement rapide des tests.

J'ai appris que je pouvais utiliser git-archive dans un Exportation de type SVN .

Mais voilà, Ce qui suit fonctionne bien :

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

il en résulte Foo , Barre , Baz dans les dossiers de la destination dossier.

Cependant, l'erreur suivante se produit con fatal not a valid object name :

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

La documentation

En regardant le synopsis de l'album, on s'aperçoit qu'il s'agit d'une git archive Je vois que cela peut prendre un certain temps. <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 ?

209voto

Cupcake Points 22154

La réponse courte (TL;DR)

Le terme "arborescent" fait référence à tout identifiant (tel que spécifié dans le document le Git sur les révisions ) qui aboutit finalement à un (sous-)répertoire (Git désigne les répertoires par les termes "arbres" et "objets arbres").

Dans le cas de l'affiche originale, foo est un répertoire qu'il veut spécifier. La manière correcte de spécifier un (sous-)répertoire dans Git est d'utiliser ceci syntaxe "arborescente" (point #15 de l'article la documentation sur les révisions Git ):

<rev>:<path> , par exemple HEAD:README , :README , master:./README

Un suffixe : suivi d'un chemin d'accès nomme le blob ou l'arbre au chemin d'accès donné dans l'objet arborescent nommé par la partie précédant les deux points.

En d'autres termes, master:foo est la syntaxe correcte, et non master/foo .

Autre "arbre" (plus engagement)

Voici une liste complète des identificateurs d'arbres et d'engagements (à partir de le Git sur les révisions , merci à LopSae de l'avoir signalé de l'avoir signalé ):

----------------------------------------------------------------------
|    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 identifiants 1 à 14 sont tous de type "commit", parce qu'ils conduisent tous à des "commits", mais aussi parce que les "commits" ont aussi une incidence sur les "commits". mais comme les commits pointent également vers des arborescences, ils conduisent tous à des objets d'arborescence (sous-)répertoriée. (sous-)arborescences de répertoires et peuvent donc également être utilisés comme "arborescents".

15 peut également être utilisé comme arborescent lorsqu'il se réfère à un (sous-)répertoire, mais il peut également être utilisé pour identifier des fichiers spécifiques. Lorsqu'il se réfère à des fichiers, je ne suis pas s'il est toujours considéré comme "arborescent", ou s'il agit plutôt comme un "blob" (Git se réfère aux fichiers en tant que "blobs").

La longue réponse

Au niveau le plus bas, Git assure le suivi du code source à l'aide de quatre éléments fondamentaux fondamentaux :

  1. Les balises annotées, qui pointent vers les commits.
  2. Commits, qui pointe vers l'arborescence du répertoire racine de votre projet.
  3. Les arbres, qui sont des répertoires et des sous-répertoires.
  4. Les blobs, qui sont des fichiers.

Chacun de ces objets possède son propre identifiant de hachage sha1, puisque Linus Torvalds a conçu Git comme un adressable par le contenu système de fichiers, c'est-à-dire que les fichiers peuvent être récupérés sur la base de leur contenu (les identifiants sha1 sont générés à partir du contenu du fichier). Le livre Pro Git donne cet exemple de diagramme :

Figure 9-3 from Pro Git book

De nombreuses commandes Git peuvent accepter des identifiants spéciaux pour les commits et les arborescences de (sous-)répertoires. répertoires :

  • Les identifiants de type "commit" sont des identifiants qui mènent finalement à un objet de type "commit". Par exemple,

    tag -> commit

  • Les identificateurs "arborescents" sont des identificateurs qui mènent finalement à des objets arborescents (c'est-à-dire des répertoires).

    tag -> commit -> project-root-directory

Étant donné que les objets commit pointent toujours vers un objet d'arborescence de répertoire (l'objet Root de votre projet), tout identifiant de type "commit" est, par définition, également "arborescent". est, par définition, également "arborescent". En d'autres termes, tout identifiant qui mène à un peut également être utilisé pour mener à un objet d'arborescence de (sous-)répertoires. .

Mais comme les objets de l'arborescence des répertoires ne pointent jamais vers les commits dans le système de gestion des versions de Git Git, tous les identifiants qui pointent vers une arborescence de (sous-)répertoires ne peuvent pas être être utilisé pour pointer vers un commit. En d'autres termes, l'ensemble des identificateurs de type "commit" (engagement) est un sous-ensemble strict de l'ensemble des identifiants "arborescents".

Comme expliqué dans l'affaire la documentation ( merci à Trebor pour son aide à le trouver ):

<tree>

Indique le nom d'un objet de l'arbre.

<commit>

Indique un nom d'objet de livraison.

<tree-ish>

Indique un nom d'arbre, de commit ou d'objet de balise. Une commande qui prend un <tree-ish> veut en fin de compte opérer sur un <tree> mais automatise l'objet. déréférence <commit> y <tag> des objets qui pointent vers un <tree> .

<commit-ish>

Indique un nom de commit ou d'objet de balise. Une commande qui prend un <commit-ish> veut en fin de compte opérer sur un <commit> mais automatiquement déréférence <tag> des objets qui pointent vers un <commit> .

L'ensemble des identifiants arborescents qui ne peut pas être utilisé comme un commit-ish sont

  1. <rev>:<path> ce qui conduit à directement aux arborescences de répertoires, et non pas d'engager et non à des objets d'engagement. Par exemple, HEAD:subdirectory .

  2. Identifiants Sha1 de l'arborescence des répertoires objets.

60voto

LopSae Points 2189

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

  • Des références comme :
    • TÊTE
    • Tags
    • Noms des branches
    • Les noms de branches avec des noms à distance, tels que origin/somebranch
  • Hachures
  • Hachures courtes

En outre, tous les éléments ci-dessus peuvent être complétés par la mention ^ , ~ . Les références peuvent également utiliser la fonction @{} pour certaines caractéristiques supplémentaires :

  • HEAD^ o HEAD^1 sera résolu au premier parent de HEAD.
  • HEAD^2 se résoudra au second parent
  • HEAD^3 se résoudra au troisième parent et ainsi de suite, ce qui est plus rare et le produit de fusionne avec la stratégie de la pieuvre .
  • HEAD~ o HEAD~1 se résoudra au premier parent de head
  • HEAD~2 se résoudra au premier parent du premier parent de HEAD. Ce serait la même chose que HEAD^^
  • HEAD@{0} se résoudra à l'actuel HEAD
  • HEAD@{1} se résoudra à la tête précédente. Cette méthode ne peut être utilisée que pour les références, puisqu'elle fait appel au journal des références. Dans le cas de HEAD chaque commit, merge, checkout modifiera la valeur de HEAD et l'ajoutera donc au journal. git reflog HEAD affichera le journal de référence dans lequel vous pouvez voir tous les mouvements de HEAD et correctement ce qui a été fait. @{1} et ainsi de suite se résoudront en .

La plupart des éléments ci-dessus peuvent être combinés, pour autant qu'ils aient un sens dans votre référentiel, par exemple : HEAD@{2}~3 , somebranch^2~4 , c00e66e~4^2 , anotherbranch~^~^~^ .

Ainsi, n'importe lequel des éléments décrits ci-dessus, et leurs combinaisons, est ce que la documentation appelle un arbre, ce qui est juste une façon de dire quel arbre (ou révision) est celui qui devrait être utilisé pour la plupart des commandes de git.

Plus d'informations Sélection de révision dans le livre de Git .

11voto

Sven Marnach Points 133943

Vous souhaitez 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 le suppose.

Editar (Suppression du lien brisé. Voir les commentaires.)

7voto

Trebor Rude Points 417

Pour les définitions de <tree-ish> y <commit-ish> voir le git(1) page de manuel. Vous devrez faire une recherche pour trouver les termes. En général, les <tree-ish> signifie une référence à un objet arbre de git, mais si vous passez un type d'objet qui référence un arbre (comme un commit ou une branche), git utilisera automatiquement l'arbre référencé.

1voto

stack1 Points 894

Je suis un novice en matière de contrôle de source et de git. Voici ce que je sais. Un arbre est la structure des fichiers dans un dépôt. Il est similaire à un répertoire dans un système de fichiers. Quel outil git a généré cette arborescence ?

Tree-ish signifie comme un arbre. Il fait référence à une partie ou à un engagement d'un arbre. Vous pouvez référencer un commit en utilisant l'une des méthodes suivantes : tout ou partie du hachage SHA-1 d'un commit, pointeur HEAD, référence à une branche, référence à une balise. Une autre méthode utilise l'une des méthodes mentionnées ainsi que les ancêtres ou les parents d'un commit. Exemple d'ancêtres : enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X