Что означает 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 отслеживает исходный код, используя четыре основных объекты:

  1. аннотированные теги, которые указывают на коммиты.
  2. Commits, которые указывают на корневое дерево каталогов вашего проект.
  3. деревья, которые являются каталогами и подкаталогами.
  4. Blobs, которые являются файлами.

каждый из этих объектов имеет свой собственный хэш-идентификатор sha1, так как Линус Торвальдс разработал Git как контент - адресно - файловая система, т. е. файлы могут быть получены на основе их содержимого (идентификаторы sha1 генерируются из содержимого файла). Pro Git книга дает в этом примере схемы:

Figure 9-3 from Pro Git book

много Команды 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

  1. <rev>:<path>, что приводит напрямую для деревьев каталогов, не фиксировать объекты. Например, HEAD:subdirectory.

  2. в 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 фиксации, указатель головки, ссылка на ветвь, ссылка на тег. Другой метод использует любой из упомянутых методы вместе с предками или родителями фиксации. Пример предков: enter image description here