5

C#からgitコマンドを実行したい。以下は私が書いたコードで、gitコマンドを実行しますが、戻り値を取得できません。コマンドラインから手動で実行すると、これが出力になります。

ここに画像の説明を入力してください

私がプログラムから実行するとき、私が得る唯一のものは

Cloning into 'testrep'...

残りの情報はキャプチャされませんが、コマンドは正常に実行されます。

class Program
{
    static void Main(string[] args)
    {
        ProcessStartInfo startInfo = new ProcessStartInfo("git.exe");

        startInfo.UseShellExecute = false;
        startInfo.WorkingDirectory = @"D:\testrep";
        startInfo.RedirectStandardInput = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.Arguments = "clone http://tk1:tk1@localhost/testrep.git";

        Process process = new Process();
        process.StartInfo = startInfo;
        process.Start();

        List<string> output = new List<string>();
        string lineVal = process.StandardOutput.ReadLine();

        while (lineVal != null)
        {

            output.Add(lineVal);
            lineVal = process.StandardOutput.ReadLine();

        }

        int val = output.Count();
        process.WaitForExit();

    }
}
4

5 に答える 5

4

libgit2sharpを試しましたか?ドキュメントは完全ではありませんが、非常に使いやすく、nugetパッケージがあります。いつでもテストコードを見て、使用法についても確認できます。単純なクローンは次のようになります。

string URL = "http://tk1:tk1@localhost/testrep.git";
string PATH = @"D:\testrep";
Repository.Clone(URL, PATH);

変更の取得も簡単です。

using (Repository r = new Repository(PATH))
{
    Remote remote = r.Network.Remotes["origin"];
    r.Network.Fetch(remote, new FetchOptions());
}
于 2015-01-14T01:03:24.850 に答える
3

git cloneのマニュアルページから:

--progress進行状況は、-qが指定されていない限り、端末に接続されている場合、デフォルトで標準エラーストリームに報告されます。このフラグは、標準エラーストリームが端末に送信されていない場合でも、進行状況を強制します。

インタラクティブに実行する場合の出力の最後の3行は、git clone標準出力ではなく、標準エラーに送信されます。ただし、プログラムは対話型端末ではないため、プログラムからコマンドを実行しても表示されません。それらを強制的に表示することもできますが、出力はプログラムが解析するために使用できるものにはなりません(\r進行状況の値を更新するための多くのs)。

文字列の出力をまったく解析せずに、の整数の戻り値を確認することをお勧めしますgit clone。ゼロ以外の場合は、エラーが発生しています(標準エラーには、ユーザーに表示できるものがある可能性があります)。

于 2012-10-17T10:44:51.740 に答える
2

電話process.WaitForExit()をかけてプロセスが終了したら、必要なprocess.ExitCode値を取得するために使用するだけです。

于 2012-10-17T10:38:56.770 に答える
0

コードは問題ないようです。これはgitの問題です。

git clone git://git.savannah.gnu.org/wget.git 2> stderr.txt 1> stdout.txt

stderr.txtは空 ですstdout.txt:'wget'へのクローン作成...

gitは標準のconsole.write()を使用していないようです。出力のように、パーセンテージを書き込んだときに表示されます。すべてが1行に表示されます。10%

25%

60%

100%

于 2012-10-17T13:06:14.050 に答える
0
process.StandardError.ReadToEnd() + "\n" + process.StandardOutput.ReadToEnd();
于 2021-04-19T03:12:57.067 に答える