Что означает tree-ish в Git?
Я очень смущен тем, как использовать git archive
.
у меня есть репозиторий git с папкой Фу, бар и баз на верхнем уровне. Мне нужно экспортировать папку Фу в виде SVN-ish для быстрого развертывания теста.
я узнал, что могу использовать git-archive
на SVN-ish экспорт своего рода.
но вот в чем дело, следующие работы отлично:
git archive master | tar -x -C ~/destination
в результате Фу, бар, баз папки назначения.
следующая ошибок С fatal not a valid object name
:
git archive master/foo | tar -x -C ~/destination
Документация
глядя как синопсис для git archive
программа Я вижу, что это может занять <tree-ish> [path]
в качестве параметра (краткое изложение соответствующих части):
git archive <tree-ish> [path...]
если master/foo
не tree-ish
, тогда что?
5 ответов
короткий ответ (TL;DR)
"Tree-ish" - это термин, который относится к любому идентификатору (как указано в ЖКТ редакция документации), что в конечном итоге приводит к каталогу (sub) дерево (git относится к каталогам как "деревья"и" объекты дерева").
в случае оригинального плаката,foo
каталог что он хочет
указывать. Правильный способ указать (sub)каталог в Git-использовать это
"дерево-иш" синтаксис (пункт #15 от изменения в Git документация):
<rev>:<path>
, например,HEAD:README
,:README
,master:./README
суффикс
:
после этого путь называет blob или дерево на данном пути в объект tree-ish, названный частью перед двоеточием.
другими словами, master:foo
это правильный синтаксис, а не master/foo
.
другое " дерево-иш "(плюс Commit-ish)
здесь полный список идентификаторов commit-ish и tree-ish (от ЖКТ редакция документации, спасибо LopSae для указания его вон!--30-->):
----------------------------------------------------------------------
| 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
----------------------------------------------------------------------
идентификаторы #1-14 - это все "commit-ish", потому что все они приводят к коммитам, но поскольку коммиты также указывают на деревья каталогов, все они в конечном итоге приводят к (sub)объекты дерева каталогов, и поэтому может также использоваться как "дерево иш".
#15 также может использоваться как дерево, когда оно относится к (sub)каталог, но это может также использоваться для идентификации конкретных файлов. Когда речь идет о файлах, я не конечно, если это все еще считается "дерево-иш", или если действует больше как "blob-ish" (Git относится к файлам, как "кляксы").
Длинный Ответ
на самых низких уровнях Git отслеживает исходный код, используя четыре основных объекты:
- аннотированные теги, которые указывают на коммиты.
- Commits, которые указывают на корневое дерево каталогов вашего проект.
- деревья, которые являются каталогами и подкаталогами.
- Blobs, которые являются файлами.
каждый из этих объектов имеет свой собственный хэш-идентификатор sha1, так как Линус Торвальдс разработал Git как контент - адресно - файловая система, т. е. файлы могут быть получены на основе их содержимого (идентификаторы sha1 генерируются из содержимого файла). Pro Git книга дает в этом примере схемы:
много Команды Git могут принимать специальные идентификаторы для коммитов и (sub)каталога деревья:
-
"Commit-ish" - это идентификаторы, которые в конечном итоге приводят к объекту commit. Например,
tag -> commit
-
"Tree-ish" - это идентификаторы, которые в конечном итоге приводят к объектам дерева (т. е. каталога).
tag -> commit -> project-root-directory
потому что объекты фиксации всегда указывают на объект дерева каталогов ( корень каталог вашего проекта), любой идентификатор, который является "commit-ish", определение "дерево-иш". Другими словами,любой идентификатор, который приводит к объект commit также может использоваться для приведения к объекту дерева каталогов (sub).
но поскольку объекты дерева каталогов никогда не указывают на коммиты в управлении версиями Git система, не каждый идентификатор, который указывает на (под)дерево каталогов также может быть используется для фиксации. Другими словами,набор идентификаторы "commit-ish" является строгим подмножеством набора идентификаторов" tree-ish".
как поясняется в документация ( спасибо Требору за помощь мне найти его):
<tree>
указывает имя объекта дерева.
<commit>
указывает имя объекта фиксации.
<tree-ish>
указывает имя объекта дерева, фиксации или тега. Команда, которая принимает
<tree-ish>
аргумент в конечном счете хочет оперировать на<tree>
объект, но автоматически разыменования<commit>
и<tag>
объекты, которые указывают на<tree>
.<commit-ish>
указывает имя объекта фиксации или тега. Команда, которая принимает
<commit-ish>
аргумент в конечном счете хочет работать на<commit>
объект, но автоматически разыменования<tag>
объекты, которые указывают на<commit>
.
набор идентификаторов дерева, которые не может использоваться как commit-ish are
<rev>:<path>
, что приводит напрямую для деревьев каталогов, не фиксировать объекты. Например,HEAD:subdirectory
.в SHA1 идентификаторы дерево каталогов объекты.
дерево-это способ назвать определенное дерево, которое может быть одним из следующих:
- ссылки:
- глава
- Теги
- наименования филиала
- филиала имен с пультов, как
origin/somebranch
- хэш
- короткие хэши
кроме того, любой из вышеперечисленных можно добавить ^
, ~
. Ссылки также могут использовать @{}
нотации дополнительные характеристики:
-
HEAD^
илиHEAD^1
будет разрешено первому родителю HEAD. -
HEAD^2
разрешит второму родителю -
HEAD^3
разрешит к третьему родителю и так далее, который более редок и продукт сливается со стратегией осьминог. -
HEAD~
илиHEAD~1
разрешит первому родителю head -
HEAD~2
разрешит к первому родителю первый родитель главы. Это будет то же самое, чтоHEAD^^
-
HEAD@{0}
разрешит к текущей голове -
HEAD@{1}
разрешит предыдущему руководителю. Это может использоваться только ссылками, поскольку он использует журнал ссылок. В случаеHEAD
каждая фиксация, слияние, проверка изменит значение HEAD и, таким образом, добавит его в журнал.git reflog HEAD
будет отображаться журнал ссылок, где вы можете увидеть все движения головы и правильно, что@{1}
и так далее решусь.
большинство из вышеперечисленного можно комбинировать до тех пор, пока это имеет смысл в вашем репозитории, например: HEAD@{2}~3
, somebranch^2~4
, c00e66e~4^2
, anotherbranch~^~^~^
.
таким образом, любой из описанных выше и его комбинаций-это то, что подразумевается в документации как дерево, которое является просто способом сказать, какое дерево (или ревизия) является тем, которое должно использоваться для большинства команд git.
дополнительная информация в Выбор редакции в Git книга.
вы, вероятно, хотите
git archive master foo | tar -x -C ~/destination
выражение master/foo
не имеет смысла: master
- это название ветви и foo
- имя каталога, как я полагаю.
редактировать: (удалена ссылка битая. См. комментарии.)
для определения <tree-ish>
и <commit-ish>
посмотреть git (1) man page. Вам придется искать условия. В общем <tree-ish>
означает ссылку на объект дерева git, но если вы передадите тип объекта, который ссылается на дерево (например, фиксацию или ветвь), git автоматически будет использовать указанное дерево.
Я новичок в управлении версиями и git. Вот что я знаю. Дерево-это структура файлов в репозитории. Это похоже на каталог в файловой системе.Видеть - какой инструмент git создал это древовидное представление?
Tree-ish означает как дерево. Он ссылается на часть или фиксацию дерева. Вы можете ссылаться на фиксацию, используя любой из них: полный или часть хэша SHA-1 фиксации, указатель головки, ссылка на ветвь, ссылка на тег. Другой метод использует любой из упомянутых методы вместе с предками или родителями фиксации. Пример предков: