2014-03-26 16 views
0

我试图在pygit2中实现git add -p,所以我可以对它做一个替代前端。所以我需要能够首先展现个人嗜好。使用PyGit2登台个人笨蛋

我能够通过使用diff_to_workdir从索引,这样找帅哥:

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

但我不知道究竟如何从那里继续。事实上,我的直觉告诉我,我根本不会举办任何活动,而是亲自提出一项承诺,然后交给回购协议。

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

回答

1

为了登台文件,没有必要在任何地方接近提交,甚至树。您只需将新版本的文件放入磁盘索引中即可。

首先,你得到的文件的当前版本索引

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() 

现在,您已在存储库中提供了该文件的新内容,并且索引将这些新内容视为文件的状态。

+0

因此,我似乎有责任从我想要分段的块中创建差异,然后将该差异应用于回购中的文件?在pygit2中有什么可以让你使用区别的方法吗? – zdsmith

+0

libgit2具有便利的功能来为您设置格式化修补程序,如果您想更多地控制它们,您必须使用自己的打印功能。 –