8

私は libgit2sharp (libgit2 の C# ラッパー) を使用していますが、私が望んでいる機能があまりないため、問題が発生しています (すぐに貢献できるといいのですが、これは本当に便利なプロジェクトのようです)。

私が今やろうとしているのは、特定のコミットとその親から変更されたファイルのリストを取得することです。マージとその 2 つの親の間で何が変わったのかを理解しようとはしません。私は通常のコミットにもっと興味があります。

これらの人 (https://github.com/libgit2/libgit2sharp/issues/89) は、似たようなことに取り組んでいます。彼らの手順は健全な考えだと思いますが、GITの内部構造の理解が少し苦手です(GITのエンドユーザー向けガイドにはたくさんのガイドがありますが、内部構造についてはあまりありません)

GIT自体が「git diff」コマンドをどのように実行するのか興味があります。おそらく、GIT は実際にはデルタを保存するのではなく、ファイルの完全なバージョンを保存します (変更されていない場合は、既存の SHA を指すだけです。この情報は、ここhttp://xentac.net/2012/01などのさまざまなソースから見つけることができます)。 /19/the-real-difference-between-git-and-mercurial.html )。これにより、データがコミットの一部として保存されていないため、2 つのコミット (私の場合は特定のコミットとその単一の親) 間の変更を取得するのが難しくなっているようです (これは、libgit2sharp の Commit.cs の Commit クラスを調べれば明らかです)。ファイル)。

コミットからアクセスできるのはツリーです。この情報を見つけるために次のことを行うのは理にかなっていますか?

1) 目的のコミットから開始し、ツリーをたどって、すべての SHA 値をセットに保存します。

2) 目的のコミットの親から開始し、そのツリーをたどって、すべての BLOB SHA 値を別のセットに保存します。

3) 変更されたファイルの SHA は、2 つのセットの共通部分にないファイルになります。

このアプローチで見られる問題は、BLOB の SHA 値からファイル名を取得する方法がないように見えることです (libgit2sharp の Blob.cs ファイルでこれを実行できるものは何もありません)。

この質問には多くの側面があることは知っていますが、それらは git から特定のデータを取得するという大きな目標の一部です。

ありがとう。

4

1 に答える 1

9

あなたが求めているのは、ツリーの差分機能であり、 tree.h headerで定義されているようにlibgit2に既に存在します。

このgit_tree_diff()関数は 2 つを比較Treesし、すべての違い (追加、更新、および削除) に対してコールバックを呼び出します。コールバック関数にはgit_tree_diff_data、対象のブロブのファイルパス、そのステータス、以前と現在のファイルモード、以前と現在の SHA を含む構造体が渡されます。

LibGit2Sharp の観点からは、C# で再実装するよりも、既存の libgit2 機能を活用する方が理にかなっています。ただし、既存のInterop 定義からインスピレーションを得ることができたとしても、.Net/native 相互運用レイヤーを使いこなそうとすると、物事はすぐに難しくなる傾向があります。

あなたの観点から(LibGit2Sharpへの貢献はあなたの主な目標ではないかもしれません;))、別のオプションはCコードをC#に移植し、LibGit2Sharpの既存の機能に依存してツリーをたどることです。git_tree_diff()(およびそのサテライト関数) は非常にクリーンなコードであり、非常に複雑な作業を行いますが、コメントは非常に明確で役に立ちます。

参考文献:

注:をバインドするには、 libgit2 トラッカーgit_tree_diff()で問題を開いて、メソッド定義を更新するように要求する必要があります。そうしないと、.Net からアクセスできなくなります。GIT_EXTERN

アップデート

LibGit2Sharp のリリースv0.9.0 では、最終的に Tree to Tree 差分機能が導入されました。

TreeChanges changes = repo.Diff.Compare(fromTree, newTree);

公開されたプロパティは次のとおりです。

  • 追加/修正された行
  • 変更の種類ごとの TreeEntry 変更のコレクション (例: 追加、変更、...)
  • 差分パッチ

DiffTreeToTreeFixture.cs の単体テストをTreeChanges見ると、この機能と を活用する方法の詳細を確認できます。

于 2012-02-03T21:23:09.420 に答える