1 хэш преобразуется и сохраняется в двоичном формате. Если вам нужна просто двоичная версия хэшей ASCII, вы можете сделать это с помощью: $ echo -e "$ (echo ASCIIHASH | sed -e 's/ ../\x&/g')"
Таким образом, blob 887ae9333d92a1d72400c210546e28baa1050e44
преобразуется в
$ echo -e "$ (echo 887ae9333d92a1d72400c210546e28baa1050e44 | sed -e 's/../\ x &/g')" ▒z▒3 = ▒▒▒ $ ▒►Tn (▒▒ ♣ D
Если мы хотим создать объект целого дерева, вот однострочный awk:
$ git ls-tree 0b6e66 | awk -b 'function bsha (asha) {patsplit (asha, x,/../); h = ""; for (j in x) h = h sprintf ("% c", strtonum ("0x" x [j])); return (h)} {t = t sprintf ("% d% s 0% s", $ 1, $ 4, bsha ($ 3))} END {printf ("tree% s 0% s ", length (t), t)} 'tree 67 100644 file1 ▒z▒3 = ▒▒▒ $ ▒►Tn (▒▒ ♣ D40000 folder1 ▒9▒] ▒k▒◄o▒▒▒i▒ ♥ ▒ [%
Функция bsha
преобразует хэши SHA-1 ASCII в двоичные файлы. Содержимое дерева сначала помещается в переменную t
, а затем его длина вычисляется и печатается в th e END {...}
раздел.
Как отмечалось выше, консоль не очень подходит для печати двоичных файлов, поэтому мы можем заменить их их эквивалентом формата x ##
:
$ git ls-tree 0b6e66 | awk -b 'function bsha (asha) {patsplit (asha, x,/../); h = ""; for (j in x) h = h sprintf ("% s", "\ x" x [j]); return (h)} {t = t sprintf ("% d% s 0% s", $ 1, $ 4, bsha ($ 3))} END {printf ("tree% s 0% s", length (t ), t)} 'дерево 187 100644 file1 x88 x7a xe9 x33 x3d x92 xa1 xd7 x24 x00 xc2 x10 x54 x6e x28 xba xa1 x05 x0e x4440000 folder1 xab x39 x96 x5d x17 x99 x6b xe2 x11 x6f xe5 x08 xfa xaf x92 x69 xe9 x03 xc8 x5b%
Результат должен быть хорошим компромиссом для понимания древовидной структуры содержимого. Сравните вывод выше с общей древовидной структурой содержимого
tree [размер содержимого] 0 [Object Entries]
, где каждый Ввод объекта выглядит так:
[режим] [Имя объекта] 0 [SHA-1 в двоичном формате]
Режимы являются подмножеством режимов файловой системы UNIX. См. Подробности в руководстве по объектам дерева в Git.
Нам нужно убедиться, что результаты согласованы. Для этого мы могли бы сравнить контрольную сумму дерева, сгенерированного awk, с контрольной суммой дерева, хранимого Git..
Что касается последнего:
$ openssl zlib -d -in .git/objects/0b/6e66b04bc1448ca594f143a91ec458667f420e | shasum0b6e66b04bc1448ca594f143a91ec458667f420e * -
Что касается самодельного дерева:
$ git ls-tree 0b6e66 | awk -b 'function bsha (asha) {patsplit (asha, x,/../); h = ""; for (j in x) h = h sprintf ("% c", strtonum ("0x" x [j])); return (h)} {t = t sprintf ("% d% s 0% s", $ 1, $ 4, bsha ($ 3))} END {printf ("tree% s 0% s", length (t ), t)} '| shasum0b6e66b04bc1448ca594f143a91ec458667f420e * -
Контрольная сумма такая же.
Вычислить контрольную сумму объекта дерева
Более или менее официальный способ получить ее:
$ git ls-tree 0b6e66 | git mktree0b6e66b04bc1448ca594f143a91ec458667f420e
Чтобы вычислить его вручную, нам нужно передать содержимое дерева, созданного скриптом, в команду shasum
. Собственно, мы уже сделали это выше (чтобы сравнить сгенерированный и сохраненный контент). Результат был следующим:
0b6e66b04bc1448ca594f143a91ec458667f420e * -
и такой же, как с git mktree
.
Упакованные объекты
Вы можете обнаружить, что для вашего репо вы не можете найти файлы .git/objects/XX/ XXX ...
сохранение объектов Git. Это происходит из-за того, что некоторые или все «свободные» объекты были упакованы в один или несколько файлов .git objects pack *. Pack
.
Чтобы распаковать репо, сначала переместите файлы пакета из их исходного положения, а затем распакуйте объекты с помощью git.
$ mkdir .git/pcache $ mv .git/objects/pack/*. pack .git/pcache/$ git unpack-objects
Чтобы перепаковать, когда вы закончите эксперименты:
$ git gc