Я очень не понимаю, как пользоваться git archive
.
У меня есть репозиторий git с папкой Foo , Bar и Baz на верхнем уровне. Мне нужно экспортировать папку Foo в стиле SVN для быстрого тестового развертывания.
Я узнал, что могу использовать экспортgit-archive
в стиле SVN .
Но вот в чем дело, следующее работает нормально:
git archive master | tar -x -C ~/destination
это приводит к папкам Foo , Bar , Baz в папке назначения .
Тем не менее, следующее выдаст ошибку с 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
, то что?
git
git-archive
dkinzer
источник
источник
master:foo
древовидный, но лучше использоватьmaster foo
как i<tree-ish> <path>
.git archive
руководства для команды больше не относятся к древовидному, но когда я задал этот вопрос, они сделали. И относительно принятого ответа; в то время никто не удосужился ответить на этот вопрос. Спустя более двух лет был даже опубликован другой ответ.Ответы:
Краткий ответ (TL; DR)
«Древовидность» - это термин, относящийся к любому идентификатору (как определено в документации редакций Git ), который в конечном итоге ведет к (под) дереву каталогов (Git называет каталоги «деревьями» и «объектами дерева»).
В случае исходного плаката
foo
это каталог, который он хочет указать. Правильный способ указать (под) каталог в Git - использовать этот «древовидный» синтаксис (элемент № 15 из документации по редакциям Git ):Другими словами,
master:foo
это правильный синтаксис, а неmaster/foo
.Другой "древовидный" (плюс коммит-иш)
Вот полный список идентификаторов фиксации и дерева (из документации по версиям Git , спасибо LopSae за указание на это ):
Идентификаторы №1–14 являются «фиктивными», потому что все они приводят к фиксации, но поскольку фиксации также указывают на деревья каталогов, все они в конечном итоге приводят к (под) объектам дерева каталогов и, следовательно, могут также использоваться как «дерево» -ish».
# 15 также может использоваться как древовидный, когда он относится к (под) каталогу, но его также можно использовать для идентификации определенных файлов. Когда он обращается к файлам, я не уверен, считается ли он по-прежнему «древовидным» или действует скорее как «блоб-иш» (Git называет файлы «блобами»).
Длинный ответ
На самом низком уровне Git отслеживает исходный код, используя четыре основных объекта:
Каждый из этих объектов имеет свой собственный идентификатор хэша sha1, поскольку Линус Торвальдс разработал Git как файловую систему с адресацией по содержимому, то есть файлы могут быть извлечены на основе их содержимого (идентификаторы sha1 генерируются из содержимого файла). В книге Pro Git приведен пример диаграммы :
Многие команды Git могут принимать специальные идентификаторы для коммитов и (под) деревьев каталогов:
"Commit-ish" - это идентификаторы, которые в конечном итоге приводят к объекту фиксации. Например,
tag -> commit
«Древовидный» - это идентификаторы, которые в конечном итоге приводят к объектам дерева (т. Е. Каталога).
tag -> commit -> project-root-directory
Поскольку объекты фиксации всегда указывают на объект дерева каталогов (корневой каталог вашего проекта), любой идентификатор, который является «фиктивным», по определению также является «древовидным». Другими словами, любой идентификатор, ведущий к объекту фиксации, также может использоваться для перехода к объекту (под) дерева каталогов .
Но поскольку объекты дерева каталогов никогда не указывают на фиксации в системе управления версиями Git, не каждый идентификатор, указывающий на (под) дерево каталогов, также может быть использован для указания фиксации. Другими словами, набор идентификаторов типа "фиксация" является строгим подмножеством набора идентификаторов типа "дерево".
Как объясняется в документации ( спасибо Требору за помощь в его поиске ):
Набор древовидных идентификаторов, которые нельзя использовать в качестве фиксации ,
<rev>:<path>
, что ведет непосредственно к деревьям каталогов, а не к объектам фиксации. Например,HEAD:subdirectory
.Идентификаторы Sha1 объектов дерева каталогов .
источник
<tree-ish>
принимать как иman gitrevisions
определяет:trees ("directories of files")
.git-archive
говорится, что требуется,<tree-ish>
но не разрешается<sha1>
. Поэтому я думаю, вместо этого следует запросить файл<tree-ish-ish>
. stackoverflow.com/a/12073669/680464Древовидный стиль - это способ наименования определенного дерева, которое может быть одним из следующих:
origin/somebranch
Кроме того, любой из вышеперечисленных может быть добавлена с
^
,~
. В справочниках также могут использоваться@{}
обозначения для некоторых дополнительных функций:HEAD^
илиHEAD^1
будет разрешен первому родительскому элементу HEAD.HEAD^2
разрешит второму родителюHEAD^3
разрешится до третьего родителя и так далее, что является более редким и продуктом слияния со стратегией осьминога .HEAD~
илиHEAD~1
разрешит первому родителю головыHEAD~2
разрешит первому родителю первого родителя HEAD. Это будет то же самое, что иHEAD^^
HEAD@{0}
разрешится в текущую ГОЛОВУHEAD@{1}
разрешится к предыдущей голове. Это может использоваться только ссылками, так как оно использует журнал ссылок. В случаеHEAD
каждой фиксации, слияния, проверки изменится значение HEAD и, таким образом, добавится в журнал.git reflog HEAD
отобразит справочный журнал, в котором вы можете увидеть все движения HEAD и правильно то, что@{1}
и так будет разрешено.Большинство из вышеперечисленного может быть дополнительно объединены до тех пор , как это имеет смысл в вашем хранилище, например:
HEAD@{2}~3
,somebranch^2~4
,c00e66e~4^2
,anotherbranch~^~^~^
.Таким образом, любое из описанных выше и их комбинаций - это то, что в документации понимается как древовидное, что является просто способом сказать, какое дерево (или ревизию) следует использовать для большинства команд git.
Подробнее см. В разделе «Выбор ревизии» книги Git .
источник
master:path/to/directory
который является древовидным, но не фиктивным. Cupcake's делает это яснее.Ты наверное хочешь
Выражение
master/foo
не имеет смысла:master
это имя ветки иfoo
, как я полагаю, имя каталога.Изменить : (Удалена неработающая ссылка. См. Комментарии.)
источник
Определения
<tree-ish>
и<commit-ish>
см. Справочную страницу git (1) . Вам придется искать условия. В общем случае<tree-ish>
означает ссылку на объект дерева git, но если вы передаете тип объекта, который ссылается на дерево (например, фиксацию или ветвь), git автоматически будет использовать указанное дерево.источник
gitrevisions(7)
.Я новичок в системе управления версиями и git. Это то, что я знаю. Дерево - это структура файлов в репозитории. Он похож на каталог в файловой системе. См. - Какой инструмент git создал это древовидное представление?
«Дерево» означает «дерево». Он ссылается на часть или фиксацию дерева. Вы можете ссылаться на фиксацию, используя любой из них: полный или часть хэша SHA-1 фиксации, указатель HEAD, ссылку на ветвь, ссылку на тег. Другой метод использует любой из упомянутых методов вместе с предками или родителями коммита. Пример предков:
источник
Из Глоссария Git tree-ish - это «объект дерева или объект, который может быть рекурсивно разыменован на объект дерева». commit, HEAD и tag - это примеры древовидных объектов.
источник