使用PyGit2制作一个单独的大块头

使用PyGit2制作一个单独的大块头,git,libgit2,pygit2,Git,Libgit2,Pygit2,我试图在pygit2中实现git add-p,这样我就可以为它提供一个替代前端。因此,我首先需要有能力扮演一个独立的大块头 我可以通过使用索引中的diff\u to\u workdir找到帅哥,如下所示: index.diff_to_workdir(0,1,1)[0].hunks 但我不确定如何从那里开始。事实上,我的直觉告诉我,我根本不准备做任何事情,而是自己做出承诺,然后交给回购 我有一种感觉,我最终需要能够从hunk创建一个blob,然后使用TreeBuilder创建一个提交。但我就是到

我试图在pygit2中实现
git add-p
,这样我就可以为它提供一个替代前端。因此,我首先需要有能力扮演一个独立的大块头

我可以通过使用索引中的
diff\u to\u workdir
找到帅哥,如下所示:

index.diff_to_workdir(0,1,1)[0].hunks
但我不确定如何从那里开始。事实上,我的直觉告诉我,我根本不准备做任何事情,而是自己做出承诺,然后交给回购


我有一种感觉,我最终需要能够从hunk创建一个blob,然后使用TreeBuilder创建一个提交。但我就是到不了那里!似乎我只能从文件中创建blob。有人能给点指导吗?

为了暂存文件,不需要接近提交,甚至树。您只需将文件的新版本放入磁盘索引中

首先,在索引中获取文件的当前版本

path = 'src/somefile.py'
repo = Repository('.')
index = Repository.index
id = index[path].id
contents = repo[id].data
将差异应用于文件的阶段版本后,可以将这些修补内容写入对象数据库,并使用

new_contents = my_favourite_patch_lib.patch(contents, hunk)
new_id = repo.write(new_contents, GIT_OBJ_BLOB)
new_entry = IndexEntry(path, new_id, GIT_FILEMODE_BLOB)
现在,您可以更新索引并将其写入磁盘,以便系统的其余部分可以获取它

index.add(new_entry)
index.write()

现在,存储库中有了文件的新内容,索引将这些新内容视为文件的状态。

因此,我似乎要负责将我要展示的对象进行区分,然后将该区分应用于repo中的文件?pygit2中是否有任何东西可以让你从大块的东西中进行区分?libgit2具有方便的函数来为你格式化补丁,如果你想对它们进行更多的控制,你必须使用自己的打印函数。