1

我正在尝试在 C# 中执行以下操作:

  1. 获取两个分支之间的差异。
  2. 重定向补丁文件中的输出。
  3. 签出一个新的空分支。
  4. 将补丁文件应用到这个新分支。
  5. 添加文件并将此分支提交到远程仓库。

我正在运行的当前 git 命令:

git checkout branch2
git diff branch1 > delta.patch
git checkout --orphan delta_branch 
git rm -rf . 
git apply delta.patch
git add -A  
git commit -m "Adding a temporary branch.." 
git push -u origin delta_branch

虽然这在 git bash 中可以正常工作,但在从 C# 执行时却不行,并且我收到 diff 命令的以下消息:

git diff branch1 > delta.patch

在此处输入图像描述

编辑:

我用来运行上述每个命令的 C# 方法如下:

public void ExecuteGitCommand(string sourceDirectory, string gitExePath, string command)
        {
            ProcessStartInfo gitInfo = new ProcessStartInfo();
            gitInfo.CreateNoWindow = true;
            gitInfo.RedirectStandardError = true;
            gitInfo.RedirectStandardOutput = true;
            gitInfo.FileName = gitExePath;
            gitInfo.UseShellExecute = false;

            Process gitProcess = new Process();

            gitInfo.Arguments = command;
            gitInfo.WorkingDirectory = sourceDirectory;

            gitProcess.StartInfo = gitInfo;
            gitProcess.Start();

            string output;
            string error;

            using (StreamReader streamReader = gitProcess.StandardOutput)
            {
                output = streamReader.ReadToEnd();
            }

            using (StreamReader streamReader = gitProcess.StandardError)
            {
                error = streamReader.ReadToEnd();
            }

            Console.WriteLine("Output:");
            Console.WriteLine(output);

            if (!string.IsNullOrEmpty(error))
            {
                Console.WriteLine("Error:");
                Console.WriteLine(error);
            }

            gitProcess.WaitForExit();
            gitProcess.Close();
        }

它是这样调用的:

string[] commands = new string[] { gitCheckout, gitDiff, gitCheckoutDelta, gitRmDeltaFiles, gitApplyPatch, gitAdd, gitCommit, gitPush };

foreach(string command in commands)
 {
     Console.WriteLine(command); //debug only
     ExecuteGitCommand(sourceDirectory, gitExePath, command);
 }

注意:我在项目的其他部分使用 LibGit2Sharp,但在这种特定情况下,我无法使用它,因为 LibGit2Sharp 没有实现git-apply

4

1 回答 1

2

您不能简单地重定向到Process.Start信息中的文件。这是一个shell操作,而不是您可以简单地调用的东西。相反,您需要自己阅读git应用程序的标准输出。例如:

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.UseShellExecute = false;

startInfo.RedirectStandardInput = true;
startInfo.RedirectStandardOutput = true;
startInfo.RedirectStandardError = true;

startInfo.FileName = "git.exe";
startInfo.Arguments = "diff branch1";

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

while ((line = process.StandardOutput.ReadLine()) != null)
{
     // This is the output you're reading...
}
于 2018-05-02T15:50:31.553 回答