致命:直接从 C# 执行 git diff 时出现不明确的参数 '>' 错误
fatal: ambiguous argument '>' error when executing git diff from C# directly
我正尝试在 C# 中执行以下操作:
- 获取两个分支之间的差异。
- 重定向补丁文件中的输出。
- 检查一个新的空分支。
- 将补丁文件应用到这个新分支。
- 添加文件并将此分支提交到远程仓库。
当前git命令我是运行ning:
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
EDIT:
我用于 运行 上述每个命令的 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.
您不能简单地重定向到 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...
}
我正尝试在 C# 中执行以下操作:
- 获取两个分支之间的差异。
- 重定向补丁文件中的输出。
- 检查一个新的空分支。
- 将补丁文件应用到这个新分支。
- 添加文件并将此分支提交到远程仓库。
当前git命令我是运行ning:
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
EDIT:
我用于 运行 上述每个命令的 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.
您不能简单地重定向到 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...
}