Может ли пустой репозиторий иметь индекс? Это ошибка? - PullRequest
0 голосов
/ 02 сентября 2010

Я пытаюсь получить 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.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2010

При более внимательном рассмотрении функции IndexFile.add я понял, что мне нужно очень мало ее функциональных возможностей.На самом деле, просто заменив вызов add на эти две строки, получим хитрость:

index.entries[index.entry_key(entry)] = git.IndexEntry.from_base(entry)
index.write()

Мне все еще интересно, хорошая ли это идея, хотя ...

0 голосов
/ 02 сентября 2010

Из справочника API :

git.index.util.git_working_dir (func)

Декоратор, который изменяет текущий рабочий каталог на один изрепозиторий git для обеспечения правильной обработки относительных путей

Репозитории Gare Git не имеют рабочего каталога, поэтому функция add зацикливается на этом.

Однако голое Git-репо также не имеет индекса [1] .

...