1

git log -1 fullpath/myfilelibgit2で実装したい。私は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、リポジトリのサブディレクトリにあるファイルでは機能しないようです。何か案が?

ありがとう、ラース

4

1 に答える 1

4

残念ながら、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 walkingAPIを活用する必要があります。

  • 機能の説明はここにあります。
  • さまざまな歩行戦略を示すテストも、いくつかの助けを提供する可能性があります

基本的に、あなたはあなたのに一致するツリーエントリのHEADから見つける必要があります。これが完了したら、コミットの親を再帰的にウォークし、コミットツリーごとに、次の2つの変更のいずれかを特定してみてください。oidfilenameHEAD

  • ファイルの名前が変更されたかどうかを検出します(ツリーエントリが親ツリーから消え、同じファイルがoid親ツリーの下にポップアップ表示されます)
  • ファイルの内容が変更されたかどうかを検出します(ツリーエントリはその名前でまだ存在しますが、そのoidは変更されています)。

ループを検出したらすぐに、または処理するコミットがなくなったら、ループを終了します。

于 2011-12-13T05:28:27.910 に答える