2

gitpython(或任何python git API)是否提供了一种方法来从工作树中的文件中分阶段选择大块,就像git add -i让你做的那样?

我想我可以看到如何通过使用 's 和属性来获得可迭代的大块更改difflibgit.diff.Diff但是a_blobb_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)

我正在考虑比较流的东西,而不是必须将全部加载到内存中然后将其拆分为行。

4

1 回答 1

0

我还没有找到更好的方法来构造一个迭代文件更改的迭代器。但这是你将如何暂存文件的内存版本:

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哈希。

似乎这不适用于裸存储库。

于 2018-02-22T10:42:04.787 回答