さて私は解決策を見つけました。
私は気づいていませんでしたが、すべてのパラメーターを提供する必要がありました。そうしないと、コミットオブジェクトがシリアル化しようとしたときにBadObject例外がスローされていました。
from git import *
from time import (time, altzone)
import datetime
from cStringIO import StringIO
from gitdb import IStream
repo = Repo('path/to/repo')
message = 'Commit message'
tree = repo.index.write_tree()
parents = [ repo.head.commit ]
# Committer and Author
cr = repo.config_reader()
committer = Actor.committer(cr)
author = Actor.author(cr)
# Custom Date
time = int(datetime.date(2013, 1, 1).strftime('%s'))
offset = altzone
author_time, author_offset = time, offset
committer_time, committer_offset = time, offset
# UTF-8 Default
conf_encoding = 'UTF-8'
comm = Commit(repo, Commit.NULL_BIN_SHA, tree,
author, author_time, author_offset,
committer, committer_time, committer_offset,
message, parents, conf_encoding)
コミットオブジェクトを作成した後、適切なSHAを配置する必要がありました。これがどのように行われたかはわかりませんでしたが、GitPythonソースコードの内臓を少し調べただけで答えが得られました。
stream = StringIO()
new_commit._serialize(stream)
streamlen = stream.tell()
stream.seek(0)
istream = repo.odb.store(IStream(Commit.type, streamlen, stream))
new_commit.binsha = istream.binsha
次に、コミットをHEADコミットとして設定します
repo.head.set_commit(new_commit, logmsg="commit: %s" % message)