Git dahili bileşenlerini kullanarak bunun neden zorlu bir problem olduğunu keşfetmeme izin verin. Mevcut commit'in sha1'ini şu şekilde alabilirsiniz:
#!/bin/bash
commit=$(git cat-file commit HEAD) #
sha1=($((printf "commit %s\0" $(echo "$commit" | wc -c); echo "$commit") | sha1sum))
echo ${sha1[0]}
Esasen, tarafından döndürülen iletide sha1 sağlama toplamı çalıştırırsınız git cat-file commit HEAD
. Bu mesajı incelerken hemen iki şey sorun olarak ortaya çıkıyor. Biri sha1 ağacı ve ikincisi commit zamanı.
Artık taahhüt süresi, mesajı değiştirerek ve belirli bir zamanda bir taahhüt veya zamanlama yapmanın ne kadar sürdüğünü tahmin ederek kolayca halledilebilir. Asıl mesele, alabileceğiniz ağaç sha1'dir git ls-tree $(git write-tree) | git mktree
. Esasen, tüm dosyaların ve sha1 sağlama toplamlarının bir listesi olan ls-ağacından gelen mesajda sha1 sağlama toplamı yapıyorsunuz.
Bu nedenle, sha1 sağlama toplamınız, çemberi tamamlayan ve sha1 kaydına bağlı olan sha1 sağlama toplamına doğrudan bağlı olan sha1 sağlama toplamınıza bağlıdır. Bu yüzden benim kullanabileceğim tekniklerle ilgili döngüsel bir probleminiz var.
Daha az güvenli sağlama toplamlarıyla , dosyanın sağlama toplamını kaba kuvvet yoluyla dosyanın kendisine yazmanın mümkün olduğu gösterilmiştir; ancak sha1 ile bu görevi yerine getiren herhangi bir çalışma bilmiyorum. Bu imkansız değil, ama şu anki anlayışımızla imkansızın yanında (ama kim bilir belki birkaç yıl içinde önemsiz olacak). Bununla birlikte, yine de, bir (blob) sağlama toplamının (ağaç) sağlama toplamının (commit) sağlama toplamını dosyaya yazmanız gerektiğinden, kaba kuvvet uygulamak daha da zordur.