Как организовать файловые фрагменты с помощью gitpython

Предоставляет ли gitpython (или, в крайнем случае, какой-либо из API-интерфейсов Python git) способ размещения выбранных фрагментов из файла в рабочем дереве, например git add -i позволяет тебе?

Я думаю, что я могу что-то увидеть, как получить итеративный из сгорбленных изменений, используя difflib на git.diff.Diff"s a_blob а также b_blob свойства, но тогда как мне организовать конкретный кусок?

И, для бонусных баллов, есть лучший способ перебрать изменения в файле, чем:

diff = repo.head.commit.diff(None)[0]
a = diff.a_blob.read().split(b'\n')
b = diff.b_blob.read().split(b'\n')
diff_generator = difflib.Differ().compare(a, b)

Я думаю о том, что сравнивает потоки, вместо того, чтобы загружать всю партию в память и разбивать ее на строки.

1 ответ

Я не нашел лучшего способа построить итератор для изменений в файле. Но вот как бы вы разместили версию файла в памяти:

new_version = '........'.encode('utf-8') # Or whatever encoding you use
istream = repo.odb.store(gitdb.IStream(git.Blob.type, len(new_version), BytesIO(new_version)))
file_mode = ... # eg os.stat(file_path).st_mode
entry = git.BaseIndexEntry((file_mode, istream.binsha, 0, file_path))
repo.index.add([entry])

repo.odb.store call хранит версию в базе данных git, но на данный момент она ни с чем не связана. Создание BaseIndexEntry объект и добавив его в индекс, затем связывает эту сохраненную версию с индексом - ссылка идет по пути к файлу и binsha хэш.

Кажется, что это не будет работать на голых репозиториях.

Другие вопросы по тегам