Позвольте мне исследовать, почему это сложная проблема с использованием внутренностей git.Вы можете получить sha1 текущего коммита с помощью
#!/bin/bash
commit=$(git cat-file commit HEAD) #
sha1=($((printf "commit %s\0" $(echo "$commit" | wc -c); echo "$commit") | sha1sum))
echo ${sha1[0]}
По сути, вы запускаете контрольную сумму sha1 для сообщения, возвращаемого git cat-file commit HEAD
.При рассмотрении этого сообщения сразу же возникают две проблемы.Одним из них является дерево sha1, а вторым - время фиксации.
Теперь о времени фиксации легко можно позаботиться, изменив сообщение и угадав, сколько времени потребуется, чтобы выполнить фиксацию или планирование для фиксации в определенное время.,Истинная проблема - это дерево sha1, которое вы можете получить из git ls-tree $(git write-tree) | git mktree
.По сути, вы выполняете контрольную сумму sha1 для сообщения из ls-tree, которое представляет собой список всех файлов и их контрольную сумму sha1.
Поэтому ваша контрольная сумма commit sha1 зависит от контрольной суммы sha1 дерева, которая напрямую зависит отконтрольная сумма файлов sha1, которая завершает круг и зависит от коммита sha1.Таким образом, у вас есть круговая проблема с методами, доступными мне.
При менее безопасных контрольных суммах было показано, что можно записать контрольную сумму файла в сам файл с помощью грубой силы;однако я не знаю ни одной работы, которая бы выполнила эту задачу с помощью sha1.Это не невозможно, но почти невозможно с нашим текущим пониманием (но кто знает, может быть, через пару лет это будет тривиально).Тем не менее, перебор еще труднее, так как вы должны записать (файл) контрольную сумму (дерева) контрольной суммы (BLOB) контрольной суммы в файл.