Как получить хеш дерева для данного имени каталога?
Я хотел бы прикрепить заметку к объекту дерева. Однако, чтобы сделать это, мне сначала нужно узнать хеш объекта дерева. Для данного имени каталога, которое является частью моего репозитория, как я могу получить хеш объекта принадлежащего ему дерева, чтобы прикрепить к нему заметку?
Прочитав этот ответ, я понимаю, что могу использовать
git cat-file -p master^{tree}
чтобы перечислить содержимое корневого дерева, но мне все равно придется сгребать вывод для имени каталога и рекурсивно следовать за вложенными объектами дерева, чтобы получить хеш объекта дерева для каталога, находящегося глубже в иерархии.
В основном, я ищу реализацию вымышленной get-tree-hash.sh
скрипт. Если называется как
get-tree-hash.sh path/to/directory/in/my/git/repo
это должно вывести
The hash for the "repo" tree inside "path/to/directory/in/my/git" is:
92a68a2f5560fa7080393b633e2afd1d5271deef
3 ответа
Просто сам разобрался,
git ls-tree HEAD -- path/to/directory/in/my/git | cut -d' ' -f3 | cut -f1
делает то, что я хочу.
Ты можешь сделать:
git rev-parse HEAD:path/to/directory/in/my/git
Для печати только хеш. Так что тебе не нужно cut
или же awk
чтобы извлечь это.
Вместо
git ls-tree HEAD -- path/to/directory/in/my/git | cut -d' ' -f3 | cut -f1
Вы можете использовать новый вариант формата (только Git 2.36+, второй квартал 2022 г.):
git ls-tree <tree-ish> --format='%x09'
С Git 2.36 (второй квартал 2022 г.) "" ( мужчина ) учится
--oid-only
вариант, похожий на "", и более обобщенный вариант "" .
См. коммит 22184af (23 марта 2022 г.) Йоханнеса Шинделина (
dscho
).
См. коммит 9c4d58f, коммит 0f88783, , коммит e815171 , коммит 132ceda , коммит 26f6d4d , коммит 82e69b0 , коммит 4e4566f , коммит a53343e (23 марта 2022 г.) от Ævar Arnfjörð Bjarmason (
avar
).
См. коммит cab851c , коммит 315f22c , коммит f6b224d , коммит 87af0dd, коммит 889f783 (23 марта 2022 г.) от Teng Long (
dyrone
).
(Объединено Junio C Hamano --
gitster
-- в коммите 1041d58, 04 апреля 2022 г.)
коммит 455923e: ввести опцию ""
Подписал: Эвар Арнфьорд Бьярмасон
Подписал: Тенг Лонг
Добавьте опцию в .
Он имеет существующий вывод по умолчанию, а затем и параметры для вывода вывода по умолчанию вместе с размером объекта и, или для вывода только путей к объектам.Вместо того, чтобы добавить
--type-only
и т. д.
мы можем просто поддерживать использованиеstrbuf_expand()
аналогично «для каждой ссылки --format».
Возможно, в будущем мы добавим такие опции для удобства.Реализация работает медленнее, чем существующий код, но это изменение не приводит к снижению производительности.
Мы оставим существующие без изменений и запускаем только в том случае, если предоставлены другие, отличные от жестко запрограммированных встроенных, соответствующих существующим режимам.Т.е.
что-то вроде "--long" вывод будет намного медленнее, в основном из-за того, что нам нужно выделить различные вещи, которые нужно сделать сquote.c
вместо того, чтобы выводить вывод непосредственно на стандартный вывод.Новая опция '--format' исходит из идеи и предложения Ævar Arnfjörð Bjarmasonn, этот коммит вносит изменения с точки зрения первоначального .
В обсуждения сообществатой ветке было
"GIT_TEST_LS_TREE_FORMAT_BACKEND"
переменная, чтобы убедиться, что у нас есть тестовое покрытие для прохождения тестов, которые в противном случае использовали быshow_tree()
через , и, таким образом, механизм форматирования может обрабатывать все те же случаи, что и параметры без форматирования.Где-то в последующих повторных бросках этого мы, кажется, отошли от того, какой должна быть цель этих тестов.
Мы пытаемся обеспечить правильностьshow_tree_fmt()
.
Мы не можем сказать, попали ли мы здесь в «быстрый путь», и вместо явного теста для этого мы можем просто добавить его к чему-то нашему."test_ls_tree_format"
тесты для.Вот статистика тестов производительности:
Формат по умолчанию (используйте встроенные форматы) :
"git ls-tree <tree-ish>" vs "--format='%(mode) %(type) %(object)%x09%(file)'" $hyperfine --warmup=10 "/opt/git/master/bin/git ls-tree -r HEAD" Benchmark 1: /opt/git/master/bin/git ls-tree -r HEAD Time (mean ± σ): 105.2 ms ± 3.3 ms [User: 84.3 ms, System: 20.8 ms] Range (min … max): 99.2 ms … 113.2 ms 28 runs $hyperfine --warmup=10 "/opt/git/ls-tree-oid-only/bin/git ls-tree -r --format='%(mode) %(type) %(object)%x09%(file)' HEAD" Benchmark 1: /opt/git/ls-tree-oid-only/bin/git ls-tree -r --format='%(mode) %(type) %(object)%x09%(file)' HEAD Time (mean ± σ): 106.4 ms ± 2.7 ms [User: 86.1 ms, System: 20.2 ms] Range (min … max): 100.2 ms … 110.5 ms 29 runs
Формат по умолчанию включает размер объекта (используйте встроенные форматы) :
"git ls-tree -l <tree-ish>" vs "--format='%(mode) %(type) %(object) %(size:padded)%x09%(file)'" $hyperfine --warmup=10 "/opt/git/master/bin/git ls-tree -r -l HEAD" Benchmark 1: /opt/git/master/bin/git ls-tree -r -l HEAD Time (mean ± σ): 335.1 ms ± 6.5 ms [User: 304.6 ms, System: 30.4 ms] Range (min … max): 327.5 ms … 348.4 ms 10 runs $hyperfine --warmup=10 "/opt/git/ls-tree-oid-only/bin/git ls-tree -r --format='%(mode) %(type) %(object) %(size:padded)%x09%(file)' HEAD" Benchmark 1: /opt/git/ls-tree-oid-only/bin/git ls-tree -r --format='%(mode) %(type) %(object) %(size:padded)%x09%(file)' HEAD Time (mean ± σ): 337.2 ms ± 8.2 ms [User: 309.2 ms, System: 27.9 ms] Range (min … max): 328.8 ms … 349.4 ms 10 runs
теперь включает в свою справочную страницу :
--format=<format>
Строка, интерполирующая отображаемый результат.
Он также интерполирует
%%
к%
, а также%xx
где шестнадцатеричные цифры интерполируются в символ с шестнадцатеричным кодомxx
; Например%00
интерполирует в\0
(НУЛ),%09
к\t
(ТАБ) и%0a
к\n
(ЛФ).Если указано, его нельзя комбинировать с другими параметрами изменения формата, включая
--long
, а также--object-only
.
теперь включает в свою справочную страницу :
Выходной формат определяется либо параметром, либо другими параметрами, изменяющими формат, такими как
--name-only
и т. д. (см. выше).Использование определенных директив эквивалентно использованию этих опций, но вызов полного механизма форматирования может быть медленнее, чем использование соответствующей опции форматирования.
В случаях, когда точно сопоставляется с существующей опцией
ls-tree
будет использовать соответствующий более быстрый путь. Таким образом, формат по умолчанию эквивалентен:%(objectmode) %(objecttype) %(objectname)%x09%(path)
git ls-tree
теперь включает в свою справочную страницу :
Индивидуальный формат:
Можно печатать в пользовательском формате с помощью опции, которая способна интерполировать различные поля с помощью
%(fieldname)
обозначение. Например, если вас интересуют только поля "" и "", вы можете выполнить с определенным "--format
" какgit ls-tree --format='%(objectname) %(path)' <tree-ish>
НАЗВАНИЯ ПОЛЕ
Различные значения из структурированных полей могут использоваться для интерполяции в результирующий вывод. Для каждой строки вывода можно использовать следующие имена:
objectmode
Режим объекта.
objecttype
Тип объекта (
blob
или жеtree
).
objectname
Имя объекта.
objectsize[:padded]
Размер объекта ("
-
", если это дерево). Он также поддерживает формат заполнения размера с помощью "%(size:padding)".
path
Путь к объекту.