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

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

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

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

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)

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


person Tom    schedule 20.02.2018    source источник


Ответы (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 сохраняет версию в базе данных git, но на данный момент она ни с чем не связана. Создание объекта BaseIndexEntry и добавление его в индекс затем связывает эту сохраненную версию с индексом — ссылка осуществляется по пути к файлу и хэшу binsha.

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

person Tom    schedule 22.02.2018