по-видимому, одни и те же коммиты дают разный sha1, почему?

#git #commit #sha1

#git #фиксация #sha1

Вопрос:

После перезаписи истории поддерева из репозитория с помощью моего скрипта я сравнил это с тем, что сделал бы git filter-branch ... для того же поддерева. Я вижу, что исходные коммиты имеют разный sha1, хотя я ожидал, что они будут идентичными (следствием этого является то, что все коммиты из обеих историй имеют разный sha1).

Выполнение a git show --format=raw <commit-sha1> для обоих коммитов дает точно такой же результат (за исключением первой строки, которая commit <commit-sha1> представляет результат).

Объектные файлы совершенно разные, но поскольку они двоичные, я не могу выяснить основную причину.

Предполагая, что все версии git совместимы друг с другом, что может объяснить наличие 2 разных sha1?

Спасибо

Комментарии:

1. Может быть, изменяющийся адрес электронной почты, изменяющаяся дата фиксации или аналогичная мета-информация?

Ответ №1:

Входные данные Git для хэша коммита включают метаданные, такие как SHA1 дерева, SHA1 родительского элемента, имя коммитера, адрес электронной почты и дату фиксации, а также имя автора, адрес электронной почты и дату фиксации. Итак, когда вы переписывали историю, дата фиксации коммитера и дерево (с тех пор, как вы сделали filter-branch ), вероятно, изменились, отсюда и разница в SHA1 вашего коммита.

Для получения дополнительной информации о формате коммита вы можете использовать git cat-file commit <sha> или посмотреть раздел Git Objects книги Git.

Комментарии:

1. Было сообщено все дерево, родители, электронные письма, даты, имена от автора и коммиттера. Между тем, ваше предложение использовать git cat-file помогло, поскольку я вижу дополнительный ‘ n’ в зарегистрированных комментариях, в то время как я не вижу никакой разницы с git show . Я проверяю это.

2. Я видел, что какой-то инструмент иногда добавляет дополнительную пустую строку в конец сообщения о фиксации, когда его нет (чтобы оно заканчивалось пустой строкой). Может быть, это то, что происходит в вашем случае?

3. Я подтверждаю, что мой скрипт ошибочно добавил новую строку. Я исправил это, и теперь у меня тот же sha1. Спасибо, Сильвен.