1

TreeChangesLibGit2Sharp で反復するための最良の (高性能でシンプルな) 方法は何でしょうか?

プロパティにアクセスする.Patchと、変更の全文が取得されます。これは私にとっては十分ではありません...理想的には、差分行を反復処理し、各行ごとに行のステータス (変更、追加、削除) を取得し、そこから独自の出力を作成できるようにしたいと考えています。

アップデート:

独自の差分出力を作成したいとしましょう。私がやりたいのは、変更された行を反復処理することです。反復中に、変更の種類 (追加、削除) を確認し、出力を作成します。

例えば:

var diff = "";
foreach (LineChange line in changes) // Bogus class "LineChange"
{
    if (line.Type == LineChange.TYPE_ADDED)
        diff += "+";
    else
        diff += "-";

    diff += line.Content;
    diff += "\n";
}

上記は、私が求めている柔軟性の簡単な例です。変更を確認し、行の変更の種類に応じていくつかのロジックを実行できるようにします。プロパティは既に "構築" されていPatchます。1 つの方法はそれを解析することですが、ライブラリが最初に出力を構築し、次にそれを解析するのはばかげているようです...構築要素を直接使用したいです。

上記の単純な例よりもはるかに多くのコードとロジックを含む変更の視覚的な差分を表示できるように、この種の機能が必要です。

4

2 に答える 2

2

@svickは正しいです。露出していません。

このトピックについてさらに議論するには、問題/機能のリクエストを開くと便利な場合があります。実際、本格的なラインベースのディフグラムを公開することは、ライブラリの現在の「粒度」に適合しない可能性があります。ただし、ほとんどのユーザーにメリットをもたらすシナリオ/ユースケースを考え出すことができれば、APIを拡張するためにいくつかの調査に投資することができます。

このオプションのほかに、他の解決策があるかもしれません:ファイルの前のバージョンに対して現在生成されたパッチを後処理します

  • 潜在的なリードについては、このSOの質問を参照してください
  • Neil Fraserの「DiffStrategies」ペーパーは、diffツールが目指すものに関する戦略と潜在的な警告の優れた情報源でもあります。
  • DiffPlexは、実用的な視覚化ツールとして、同様にインスピレーションを与える可能性があります
  • さらに作業を行うと、次のような視覚化(Perforce 4ビューアから)に似たものを実現できる可能性があります。

p4merge
(出典:macworld.com

注:これを簡単にするために、C#でlibgit2の差分オプションを公開すると便利な場合があります。

于 2012-06-24T17:07:08.520 に答える
2

私が見る限り、この情報は libgit2sharp によって公開されていませんが、ブロブ差分の場合は libgit2 によって提供されます (ツリー差分ではありません)。関連するコードは にありContentChanges.cs、具体的にはコンストラクターとLineCallback()メソッドにあります (ツリー差分のコードは にありますTreeChanges.cs)。

このため、次の 2 つのオプションがあると思います。

  1. リフレクション ( の内部メソッド) を使用するか、PInvoke シグネチャをプロジェクトにコピーして、 によってgit_diff_blobs()内部的に使用されるメソッド を呼び出します。ほとんどの場合、 も必要になります。ContentChangesNativeMethodsUtf8Marshaler
  2. のコードをContentChanges必要に応じて変更します。これを行う場合は、その変更のプル リクエストを作成して、他のユーザーも使用できるようにすることが理にかなっている場合があります。
于 2012-06-12T14:52:04.437 に答える