残念ながら、git_tree_entry_bynameは、リポジトリのサブディレクトリ内のファイルに対しては機能しないようです。
git_tree_entry_byname
渡されたツリーのすぐ下にあるエントリ(ツリー、blob、およびサポートされている場合はサブモジュール)に対してのみ機能します。
質問に対する簡単な解決策の1つは、git_tree_get_subtree(テストを参照)を使用して、相対パスを指定して、ツリーに含まれる最も深いサブツリーを取得することです。これは、エントリがツリー構造の深さに関係なく機能します。
したがって、必要なgit_tree_git_subtree
エントリの親ツリーを取得するためにを呼び出してから、親ツリーをget_tree_entry_byname
渡すように呼び出す必要があります。
libgit2でgitlog-1 fullpath/myfileを実装したい
ファイルを最後に更新したコミットを取得したい場合は、ファイル履歴のトピックと警告に関するいくつかの汎用的なヒントを提供するこの回答を確認することをお勧めします。
リンクされた回答でコミットを取得するための手がかりが見つかりません。
revision walking
APIを活用する必要があります。
- 機能の説明はここにあります。
- さまざまな歩行戦略を示すテストも、いくつかの助けを提供する可能性があります
基本的に、あなたはあなたのに一致するツリーエントリのHEAD
から見つける必要があります。これが完了したら、コミットの親を再帰的にウォークし、コミットツリーごとに、次の2つの変更のいずれかを特定してみてください。oid
filename
HEAD
- ファイルの名前が変更されたかどうかを検出します(ツリーエントリが親ツリーから消え、同じファイルが
oid
親ツリーの下にポップアップ表示されます)
- ファイルの内容が変更されたかどうかを検出します(ツリーエントリはその名前でまだ存在しますが、そのoidは変更されています)。
ループを検出したらすぐに、または処理するコミットがなくなったら、ループを終了します。