2016-03-30 8 views
6

C#でGit履歴の特定の行の最終著者をプログラムで取得する必要があります。 私はlibgit2sharpを使用してみました:C#で "Git blame -w"をプログラムで実行する

var repo = new LibGit2Sharp.Repository(gitRepositoryPath); 
string relativePath = MakeRelativeSimple(filename); 
var blameHunks = repo.Blame(relativePath); 
// next : find the hunk which overlap the desired line number 

しかし、これはコマンド

git blame <file>

そして実際に、私は

git blame -w <file>(比較するときに空白を無視する)

を必要とするのと同じです

Libgit2sharpスイッチを-wに設定せず、パラメータ/オプションを設定しないでください。 私のオプションは何ですか? blameコマンドの-wスイッチと互換性のある他のライブラリを知っていますか?

+0

NGitを試してみましたか? –

+0

@Jeremy:まったく、私はNGitを知らなかった。私はこの質問に多くの時間を費やして、私がフィードバックを求めることを好む。 – JYL

+0

これはLibGit2Sharpデベロッパーチームにとって本当に良い機能リクエストです:)このQへのリンクを丁寧に参照するように頼んだら、コアチームまたは貢献者の1人にこのQがアクティブな賞金それ以外の場合はEvkはそれを得るべきです(+1)。あなたが2つの図書館に頼る必要がないため、指を渡して説得するのに十分です。 –

答えて

2

私がgit libがそれをカットしていない同様の高度なシナリオをヒットしたとき、私はちょうど実際のgitコマンドラインにstartプロセスを使用してシェルします。セクシーではありませんが、効果的です。

+0

私は以前のことだが、私の解決策では約2,000のファイルに対してこれを行う必要があり、パフォーマンスが懸念されていた。私は最後の手段としてそれを試してみましょう。 – JYL

+0

実際、私の場合はlibGit2Sharpを使用するよりも、この方法が本当に高速です。テスト・リポジトリが818個のファイル(4570コミット)で、各ファイルに責任があります。ダイレクト・プロセスを使用:平均181ミリ秒。責任ごとに。 ligGit2Sharpを使用すると、1対1の平均で1235ミリ秒です。 – JYL

2

おそらくNGITライブラリを使用すると役立つでしょう。それはjava JGITライブラリの直接(自動)ポートです。そして、nugetパッケージを経由してインストールします。

static void Main() { 
     var git = Git.Init().SetDirectory("C:\\MyGitRepo").Call();    
     string relativePath = "MyFolder/MyFile.cs";    
     var blameHunks = git.Blame().SetFilePath(relativePath).SetTextComparator(RawTextComparator.WS_IGNORE_ALL).Call(); 
     blameHunks.ComputeAll(); 
     var firstLineCommit = blameHunks.GetSourceCommit(0); 
     // next : find the hunk which overlap the desired line number 
     Console.ReadKey(); 
    } 

ノートSetTextComparator(RawTextComparator.WS_IGNORE_ALL)の部分。

+0

答えをありがとう、私は来週これを試してみます。 – JYL

+0

これを動作させる方法はありません。いくつかのコミットは素晴らしく、他のものは単にnullです。特に空白の違いがある場合私は間違っているオプションがないのか、それとも(jgitと比較して)ngitの古いソースが原因であるのか分かりません。私はあきらめて、私は基本(robrich解)に戻っています。 – JYL

+0

しかし、私はあなたに恩恵を与えます。なぜなら、理論的には正解であり、適切なコードサンプルが与えられているからです。ありがとう。 – JYL

0

残念ながら、libgit2sharpは非難を払うには遅すぎるため、この機能を使用するのは実際のシナリオでは実用的ではありません。だから、私が考えている最良の方法は、Powershellスクリプトを使って根本的な超高速ネイティブgitを使うことです。結果をアプリケーションにリダイレクトします。

git blame -l -e -c {commit-sha} -- "{file-path}" | where { $_ -match '(?<sha>\w{40})\s+\(<(?<email>[\w\.\-][email protected][\w\-]+\.\w{2,3})>\s+(?<datetime>\d\d\d\d-\d\d-\d\d\s\d\d\:\d\d:\d\d\s-\d\d\d\d)\s+(?<lineNumber>\d+)\)\w*' } | 
foreach { new-object PSObject –prop @{ Email = $matches['email'];lineNumber = $matches['lineNumber'];dateTime = $matches['dateTime'];Sha = $matches['sha']}} 
関連する問題