Commit
Aby zapisać nasz commit potrzebujemy trzeciego typu obiektu - commitu.
Struktura
Tree składa się z:
- indentyfikatora commit
- informacji o wielkości zawartości
- specjalnego delimitera - \0
- zawartości
Zawartość składa się z następujących czynników:
- autor
- commiter
- data
- wiadomość (message)
- przodek (parent commit) - może być jeden lub więcej
Zapis
irb
require 'digest/sha1'
require 'zlib'
require 'fileutils'
require 'date'
Wygenerowanie klucza SHA1
now = Time.new.strftime("%s %z")
me = "Lukasz Rybka <lukasz@email.com>"
tree_sha = "b6552d9c9c72edad72fbf3ad8ce5ab892070eef3"
content = "tree " + tree_sha + "\nauthor " + me + " " + now + "\ncommitter " + me + " " + now + "\n\nFirst commit\n"
header = "commit #{content.length}\0"
commit = header + content
sha1 = Digest::SHA1.hexdigest(commit)
Zapis
zlib_content = Zlib::Deflate.deflate(commit)
path = '.git/objects/' + sha1[0,2] + '/' + sha1[2,38]
FileUtils.mkdir_p(File.dirname(path))
File.open(path, 'w') { |f| f.write zlib_content }