使用PyGit2暂存一个单独的大块头

时间:2014-03-26 22:55:17

标签: git libgit2 pygit2

我正在尝试在pygit2中实现git add -p,所以我可以为它做一个替代前端。所以我需要能够首先表现出个人背景。

我可以使用索引中的diff_to_workdir来找到帅哥,如下所示:

index.diff_to_workdir(0,1,1)[0].hunks

但我不确定如何从那里开始。事实上,我的直觉告诉我,我根本不会进行任何事情,而是自己组织一个提交,然后将其交给回购。

我感觉我最终需要能够从块中创建一个blob,然后使用TreeBuilder来创建一个提交。但我无法到达那里!好像我只能从文件中创建blob。任何人都可以提供一点指导吗?

1 个答案:

答案 0 :(得分:1)

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

首先,您在索引

中获取该文件的当前版本
path = 'src/somefile.py'
repo = Repository('.')
index = Repository.index
id = index[path].id
contents = repo[id].data

将diff应用于文件的分阶段版本后,您可以将这些修补内容写入对象db并使用

创建树新索引条目
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()

现在,您可以在存储库中获得该文件的新内容,并且索引会将这些新内容视为该文件的状态。