猿问

如何通过c#代码打开和使用Git Bash

我正在尝试包括打开 Git Bash,推入和拉入我的 c# 代码。虽然打开 Git BashProcess.Start()不是问题,但我无法将命令写入 Git Bash。


我试过在 中包含命令ProcessStartInfo.Arguments,以及重定向标准输出。两者都没有工作。在下方,您可以看到我尝试过的不同代码片段。


private void Output()

{

    //Try 1

    processStartInfo psi = new ProcessStartInfo();

    psi.FileName = "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Git\Git Bash.lnk";

    psi.UseShellExecute = false;

    psi.RedirectStandardOutput = true;

    psi.Argument = "git add *";

    Process p = Process.Start(psi);

    string strOutput = p.StandardOutput.ReadToEnd();

    Console.WriteLine(strOutput);


    //Try 2

    ProcessStartInfo psi = new ProcessStartInfo(@"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Git\Git Bash.lnk");

    Process.Start(psi);

    psi.Arguments = "git add *";

    Process.Start(psi);


    //Try 3

    var escapedArgs = cmd.Replace("\"", "\\\"");

    var process = new Process()

    {

        StartInfo = new ProcessStartInfo

        {

            FileName = @"C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Git\Git Bash.lnk",

            Arguments = "cd C:\\Users\\strit\\autocommittest2\\autocommittest2\n",

             RedirectStandardOutput = true,

             UseShellExecute = false,

             CreateNoWindow = true,

         }

    };

    process.Start();

    string result = process.StandardOutput.ReadToEnd();

    process.WaitForExit();

}

Git Bash 打开,但命令行中没有写入任何内容。


陪伴而非守候
浏览 316回答 3
3回答

千巷猫影

我知道这是个老问题,几天前我还在添加答案,我也面临同样的问题。我认为你缺少的是-c参数。我使用了下面的代码,它解决了这个问题。-c告诉 git-bash 执行后面的任何内容,它类似于-cmd命令行中的参数。在下面提到的功能中 -fileName= git-bash.exe 的路径。command= 你要执行的 git 命令。workingDir= git 存储库的本地路径。public static void ExecuteGitBashCommand(string fileName, string command, string workingDir){    ProcessStartInfo processStartInfo = new ProcessStartInfo(fileName, "-c \" " + command + " \"")    {        WorkingDirectory = workingDir,        RedirectStandardOutput = true,        RedirectStandardError = true,        RedirectStandardInput = true,        UseShellExecute = false,        CreateNoWindow = true    };    var process = Process.Start(processStartInfo);           process.WaitForExit();    string output = process.StandardOutput.ReadToEnd();    string error = process.StandardError.ReadToEnd();    var exitCode = process.ExitCode;    process.Close();}我希望它能解决问题。

慕娘9325324

我认为你是在正确的道路上。我会尝试在路径中使用 git,但也应该可以git-bash.exe直接使用,在我的机器上,它位于此处:C:\Program Files\Git\git-bash.exe。Process gitProcess = new Process();gitInfo.Arguments = YOUR_GIT_COMMAND; // such as "fetch origin"gitInfo.WorkingDirectory = YOUR_GIT_REPOSITORY_PATH;gitInfo.UseShellExecute = false; gitProcess.StartInfo = gitInfo;gitProcess.Start();string stderr_str = gitProcess.StandardError.ReadToEnd();  // pick up STDERRstring stdout_str = gitProcess.StandardOutput.ReadToEnd(); // pick up STDOUTgitProcess.WaitForExit();gitProcess.Close();

倚天杖

就像@S.Spieker 已经在它的好答案中告诉你的那样,不需要使用 git bash (它更难实现并且性能更低),只需直接调用 git 可执行文件即可。您可以查看执行此操作的 GitExtensions 代码:https ://github.com/gitextensions/gitextensions/blob/027eabec3be497f8d780cc68ece268c64a43a7d5/GitExtensionsVSIX/Git/GitCommands.cs#L112您还可以使用 libgit2sharp ( https://github.com/libgit2/libgit2sharp )实现您想要的。如果您想解释命令运行的结果,那可能会更容易。
随时随地看视频慕课网APP
我要回答