私は 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 から特定のデータを取得するという大きな目標の一部です。
ありがとう。