У Git есть хорошо известное или, по крайней мере, хорошо известное пустое дерево с SHA1:
4b825dc642cb6eb9a060e54bf8d69288fbee4904
(вы можете увидеть это в любом репо, даже во вновь созданном, с помощью git cat-file -t
и git cat-file -p
).
Если вы много работаете и очень осторожны, вы можете использовать это пустое дерево для хранения каталога, в котором нет файлов (см. Ответ на вопрос, как добавить пустой каталог в репозиторий git ), хотя на самом деле это не лучшая идея.
Это более полезно в качестве аргумента того git diff-tree
, что делает один из примеров хуков.
Мне интересно,
- насколько это надежно - т.е. не будет ли в какой-нибудь будущей версии git нумерованный объект git
4b825dc642cb6eb9a060e54bf8d69288fbee4904
? - Почему у пустого дерева нет символического имени (или оно есть?).
(Быстрый и грязный способ создать символическое имя - это вставить SHA1, например .git/Nulltree
. К сожалению, вы должны делать это для каждого репо. Кажется, лучше просто поместить магическое число в скрипты и т. Д. Я просто испытываю общее отвращение к магическим числам.)
git hash-object -t tree /dev/null
метод (из ответа VonC ниже) имеет то преимущество, что не требует жесткого кодирования SHA-1, например, в случае, если какая-то будущая версия git переключается на SHA-2. (Я не буду пытаться предсказать, когда это может произойти. :-) Было бы проще переключить Mercurial на SHA-2, поскольку они оставили для него место.)Ответы:
В этой ветке упоминается:
Или, как предлагает Чиро Сантилли в комментариях :
Или, как видно здесь , от Колина Шиммельфинга :
Так что, я думаю, безопаснее определить переменную с результатом этой команды как ваше пустое дерево sha1 (вместо того, чтобы полагаться на «общеизвестное значение»).
Примечание. Git 2.25.1 (февраль 2020 г.) предлагает в коммите 9c8a294 :
И добавляет:
Обратите внимание: вы увидите, что SHA1 появляется в каком-то репозитории GitHub, когда автор хочет, чтобы его первая фиксация была пустой (см. Сообщение в блоге « Как я инициализирую свои репозитории Git »):
Дам тебе:
(Видите дерево SHA1?)
Вы даже можете переназначить существующую историю поверх этой пустой фиксации (см. « Git: как вставить фиксацию первым, сдвинув все остальные? »)
В обоих случаях вы не полагаетесь на точное значение SHA1 этого пустого дерева.
Вы просто следуете передовой практике, инициализируя свое репо первой пустой фиксацией .
Для этого:
Это сгенерирует фиксацию с SHA1, специфичным для вашего репо, имени пользователя, электронной почты, даты создания (это означает, что SHA1 самой фиксации будет каждый раз отличаться).
Но дерево, на которое ссылается этот коммит, будет
4b825dc642cb6eb9a060e54bf8d69288fbee4904
пустым деревом SHA1.Чтобы показать только дерево фиксации (отобразить дерево фиксации SHA1):
Если эта фиксация, ссылающаяся на пустое дерево, действительно является вашей первой фиксацией, вы можете показать это пустое дерево SHA1 с помощью:
(и это работает даже в Windows с командами Gnu On Windows )
Как прокомментировано ниже , при использовании
git diff <commit> HEAD
это покажет весь ваш файл в текущей ветке HEAD:Примечание: это значение пустого дерева формально определено в
cache.h
.Начиная с Git 2.16 (Q1 2018), он используется в структуре, которая больше не привязана (только) к SHA1, как показано в commit eb0ccfd :
Дополнительные сведения см. В разделе « Почему Git не использует более современный SHA? »: Это SHA-2 , начиная с Git 2.19 (3 квартал 2018 г.)
В Git 2.25 (первый квартал 2020 г.) тесты готовятся к переходу SHA-2 и включают пустое дерево.
См совершать fa26d5e , совершать cf02be8 , совершают 38ee26b , совершают 37ab8eb , совершают 0370b35 , совершают 0253e12 , совершают 45e2ef2 , совершают 79b0edc , совершают 840624f , совершают 32a6707 , совершают 440bf91 , совершают 0b408ca , совершают 2eabd38 (28 окт 2019), а также совершать 1bcef51 , совершают ecde49b (5 октября 2019 г.) Брайан М. Карлсон (
bk2204
) .(Объединено Junio C Hamano -
gitster
- в фиксации 28014c1, 10 ноя 2019)Итак,
t/oid-info/hash-info
теперь включает:SHA2 "
6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321
" - это новое4b825dc642cb6eb9a060e54bf8d69288fbee4904
пустое дерево SHA1 " ".источник
git diff-tree
в некоторых сценариях, которые я пишу. Нет никакой гарантии, что в репо есть начальная пустая фиксация. Так что мне просто интересно, могут ли эти скрипты когда-нибудь сломаться.-w
кgit hash-object
, он создаст объект в репозитории, с которым запускается, и это воссоздает пустое дерево в репозитории, с которым вы работаете, если оно когда-либо исчезнет в будущем./dev/null
:printf '' | git hash-object --stdin -t tree
:)Я написал сообщение в блоге с двумя разными способами поиска хеша: http://colinschimmelfing.com/blog/gits-empty-tree/
Если он когда-либо изменится по какой-либо причине, вы можете использовать два способа, чтобы найти его. Однако я бы чувствовал себя довольно уверенно, используя хэш в псевдонимах .bashrc и т. Д., И я не думаю, что в ближайшее время он изменится. По крайней мере, это, вероятно, будет крупный выпуск git.
Двумя способами являются:
git hash-object -t tree --stdin < /dev/null
git write-tree
это новое репо - хеш будет выведен git write-tree.источник
–-stdin
дает мнеfatal: Cannot open '–-stdin': No such file or directory
git 2.7.2. Однако запуск его без--stdin
as в ответе VonC дает хеш-значениеВот ответ, как создать фиксацию пустого дерева, даже если репозиторий еще не пуст. https://stackoverflow.com/a/14623458/9361507
Но я предпочитаю «пустой» быть тегом, а не веткой. Простой способ:
Потому что тег может указывать на древовидность напрямую, без фиксации. Теперь, чтобы получить все файлы в рабочем дереве:
Или то же самое со stat:
Все файлы как diff:
Проверьте пробелы во всех файлах:
источник
git rev-parse
были бы новые флаги или ключевые слова или что-то в этом роде, чтобы создать (а) хэш пустого дерева и (б) хеш нулевой фиксации. Оба они будут полезны в сценариях и защитят от предлагаемых изменений SHA-256.