使用svn diff命令进行代码比较

3

嗨,我在代码后台使用svn命令时遇到了问题:

public void SvnDiff(int rev1, int rev2)
        {
            try
            {
                var p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.FileName = "svn";
                string arg = string.Format("diff -r {0}:{1} --summarize --xml > SvnDiff.xml", rev1, rev2);
                Console.WriteLine(arg);
                p.StartInfo.Arguments = arg;
                p.Start();
                p.WaitForExit();
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }
        }

当我在命令提示符中使用这个命令时,它可以正常工作。 svn diff -r 2882:2888 --summarize --xml > SvnDiff.xml

但是当我运行我的方法时,我收到了以下错误信息: svn: E020024: Error resolving case of '>'

现在我该怎么做才能解决这个问题? 感谢任何建议。


你想直接从C#读取输出还是创建SvnDiff.xml文件? - Julián Urbano
我想创建SvnDiff.xml文件。 - Zabaa
4个回答

1
你可以像@Scott建议的那样读取所有文本,然后将其写入文件,但如果输出太大,则可能会出现问题。
相反,您可以在生成输出时进行编写。为文件创建本地StreamWriter,并创建一个方法,以便在有新的输出数据可用时进行编写:
StreamWriter redirectStream = new StreamWriter("SvnDiff.xml")

void Redirect(object Sender, DataReceivedEventArgs e)
{
  if ((e.Data != null)&&(redirectStream != null))
    redirectStream.WriteLine(e.Data);
}

当你开始这个过程时:

p.OutputDataReceived += new DataReceivedEventHandler(Redirect); // handler here to redirect
p.Start();
p.BeginOutputReadLine();
p.WaitForExit();

redirectStream.Flush();
redirectStream.Close();

0

你命令行中的> SvnDiff.xml部分并不是传递给SVN的参数,而是重定向标准输出。要做到这一点,请查看文档

由于你已经正确设置了RedirectStandardOutput,所以你只需要利用它。简单地说

string output = p.StandardOutput.ReadToEnd();

在你的 p.WaitForExit(); 行之前。
然后,只需使用 File.WriteAllText("SvnDiff.xml", output);

0

试试这个……

var p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "cmd.exe";
string arg = string.Format("/K svn diff -r {0}:{1} --summarize --xml > SvnDiff.xml", rev1, rev2);
Console.WriteLine(arg);
p.StartInfo.Arguments = arg;
p.Start();
p.WaitForExit();

如果它工作了,那么把 /K 替换为 /C。


/K/C 是用来做什么的? - Julián Urbano
@caerolus 打开命令提示符并输入CMD /?,以获得关于命令行开关的帮助。 - Steve
哦,我没注意到你实际上执行了 cmd! - Julián Urbano

0
感谢回答,我使用 StandardOutput 它可以工作 :)
var p = new Process();
                p.StartInfo.UseShellExecute = false;
                p.StartInfo.RedirectStandardOutput = true;
                p.StartInfo.FileName = "svn";
                p.StartInfo.Arguments = string.Format("diff -r {0}:{1} --summarize --xml", rev1, rev2);
                p.Start();
                string output = p.StandardOutput.ReadToEnd();
                p.WaitForExit();
                File.WriteAllText("SvnDiff.xml", output);

谢谢大家。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接