2011-12-12 69 views
1

我想用libgit2實現git log -1 fullpath/myfile。我對libgit2相當陌生。我在正確的軌道上嗎?這是我到目前爲止有:「git log -1 fullpath/myfile」with libgit2

git_repository_head(&refToHead, repo); 

headOID = git_reference_oid(refToHead); 
git_commit_lookup(&headCommit, repo, headOID); 

headTreeOID = git_commit_tree_oid(headCommit); 
git_tree_lookup(&tree, repo, headTreeOID); 

git_tree_entry_byname(tree, "repopath/myfile"); 

可惜git_tree_entry_byname似乎不能在檔案中回購的子目錄工作。任何想法?

謝謝 拉爾斯

回答

3

可惜git_tree_entry_byname似乎不能在檔案中回購 子目錄工作。

git_tree_entry_byname只能針對其立即都是通過樹下的條目(樹木,斑點和支持時,子模塊)。

一個簡單的解決你的問題將依靠git_tree_get_subtree(見tests)來檢索包含在樹中最深的子樹,因爲它相對路徑。無論樹結構中的條目有多深,這都會起作用。

因此,您必須致電git_tree_git_subtree來檢索您之後的條目的父樹,然後調用get_tree_entry_byname將父樹傳遞給父樹。

我想要實現git的日誌-1 FULLPATH/MYFILE與libgit2

如果你願意要檢索的最後提交更新文件,你可能想看看這個answer它提供了關於文件歷史主題和注意事項的一些通用提示。

我找不到任何線索在您的鏈接答案中獲得提交。

你必須充分利用revision walking API。

  • 該功能的說明可以找到here
  • 一個test展示不同的行走策略也可以爲你提供一些幫助

基本上,你必須從樹條目符合filenameHEADoid找出來。完成此操作後,您必須遞歸提交HEAD提交的父項,並對每個提交樹嘗試識別以下兩個更改中的一個。

  • 檢測,如果該文件已被改名爲
  • 檢測(樹條目已經從父樹消失了,與同oid一個新的文件中的父樹下彈出),如果該文件的內容已經改變(樹條目仍然以其名稱存在,但其oid已更改)。

退出循環屁股一旦你檢測到一個,或者當你沒有更多的承諾來處理。

+1

謝謝! get_tree_entry_byname現在可用。但是,我無法找到任何線索來獲取關聯答案中的提交。你能給我另一個提示嗎? –