2014-03-26 25 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具有便利的功能來爲您設置格式化修補程序,如果您想更多地控制它們,您必須使用自己的打印功能。 –