Как организовать файловые фрагменты с помощью 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
хэш.
Кажется, что это не будет работать на голых репозиториях.