Как получить хеш дерева для данного имени каталога?

Я хотел бы прикрепить заметку к объекту дерева. Однако, чтобы сделать это, мне сначала нужно узнать хеш объекта дерева. Для данного имени каталога, которое является частью моего репозитория, как я могу получить хеш объекта принадлежащего ему дерева, чтобы прикрепить к нему заметку?

Прочитав этот ответ, я понимаю, что могу использовать

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

Путь к объекту.

Другие вопросы по тегам