Pozwólcie, że zbadam, dlaczego jest to trudny problem z wykorzystaniem wewnętrznych elementów git. Możesz pobrać sha1 bieżącego zatwierdzenia przez
#!/bin/bash
commit=$(git cat-file commit HEAD) #
sha1=($((printf "commit %s\0" $(echo "$commit" | wc -c); echo "$commit") | sha1sum))
echo ${sha1[0]}
Zasadniczo uruchamiasz sumę kontrolną sha1 dla wiadomości zwróconej przez git cat-file commit HEAD
. Po przeanalizowaniu tej wiadomości od razu pojawiają się dwie rzeczy. Jeden to drzewo sha1, a drugi to czas zatwierdzenia.
Teraz można łatwo zająć się czasem zatwierdzenia, zmieniając wiadomość i odgadując, ile czasu zajmie wykonanie zatwierdzenia lub zaplanowanie zatwierdzenia w określonym czasie. Prawdziwym problemem jest drzewo sha1, z którego można uzyskać git ls-tree $(git write-tree) | git mktree
. Zasadniczo robisz sumę kontrolną sha1 dla wiadomości z ls-tree, która jest listą wszystkich plików i ich sumą kontrolną sha1.
Dlatego suma kontrolna sha1 twojego zatwierdzenia zależy od sumy kontrolnej sha1 twojego drzewa, która bezpośrednio zależy od sumy kontrolnej pliku sha1, która zamyka okrąg i zależy od zatwierdzenia sha1. Tak więc masz problem z metodami dostępnymi dla mnie.
Przy mniej bezpiecznych sumach kontrolnych okazało się, że możliwe jest zapisanie sumy kontrolnej pliku do samego pliku przy użyciu brutalnej siły; jednak nie znam żadnej pracy, która wykonałaby to zadanie z sha1. Nie jest to niemożliwe, ale prawie niemożliwe przy naszym obecnym rozumieniu (ale kto wie, może za kilka lat będzie to trywialne). Jednak nadal jest to jeszcze trudniejsze do brutalnej siły, ponieważ musisz zapisać (zatwierdzoną) sumę kontrolną (drzewa) sumy kontrolnej (blob) do pliku.