Я пытаюсь получить GitPython 0.3 для фиксации файла в хранилище.Грубо говоря, я делаю это следующим образом:
data = ...
istream = repo.odb.store(gitdb.IStream(git.Blob.type, len(data), StringIO(data)))
entry = git.BaseIndexEntry((stat.S_IFREG | 0644, istream.binsha, 0, path))
index = git.IndexFile.from_tree(repo, repo.heads['master'])
index.add([entry])
index.commit(commit_message)
С не-пустым хранилищем это работает как ожидалось.Обратите внимание, что я никогда не касаюсь файловой системы явно, только объектная база данных Git.
Однако с пустым хранилищем это не работает: функция IndexFile.add
украшена декоратором git_working_dir
:
@git_working_dir
def add(self, items, force=True, fprogress=lambda *args: None, path_rewriter=None,
write=True):
"""Add files from the working tree, specific blobs or BaseIndexEntries
to the index.
Этот декоратор пытается chdir к working_tree_dir
репо, чтобы ссылки на пути могли быть правильно разрешены.Однако working_tree_dir
недопустим для пустого хранилища, что вызывает AssertionError
.
У кого-нибудь есть идея, почему этот декоратор здесь?Это только для разрешения пути или невозможно создать индекс в пустом хранилище?Это ошибка в GitPython или в моем понимании Git?
Редактировать: Точно так же функция IndexFile.remove
утверждает (через декоратор default_index
), что мы индекс по умолчанию.У обнаженных репозиториев определенно нет индекса по умолчанию, но могут ли они вообще не иметь индексных объектов?
@post_clear_cache
@default_index
def remove(self, items, working_tree=False, **kwargs):
"""Remove the given items from the index and optionally from
the working tree as well.