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?
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:
- tags annotés, qui pointent pour commettre.
- Commits, qui pointent vers l'arbre des répertoires racine de votre projet.
- arbres, qui sont des répertoires et des sous-répertoires.
- 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 :
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
-
<rev>:<path>
, qui mène directement aux arbres répertoires, pas de commit objet. Par exemple,HEAD:subdirectory
. -
Sha1 identificateurs de arborescence de répertoires objets.
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^
ouHEAD^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~
ouHEAD~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 queHEAD^^
-
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 deHEAD
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 .
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.)
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.
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: