从C#函数运行git命令

时间:2014-10-02 18:40:06

标签: c# git visual-studio-2013 version-control windows-7

我的C#代码在检测到跟踪文件中的更改时如何运行git命令?我正在为此目的编写一个VisualStudio / C#控制台项目。

我是.NET环境的新手,目前正致力于将自动GIT提交集成到文件夹中。我需要在已知文件夹上自动提交任何更改/添加/删除,并将其推送到git remote。任何指导赞赏。谢谢。

这是我所拥有的,最后一个是我需要一些指导:

  1. Git存储库最初设置在具有正确忽略文件(已完成)的文件夹上。
  2. 我正在使用C#FileSystemWatcher捕获所述文件夹(已完成)的任何更改。
  3. 一旦我的项目检测到更改,它就需要提交并推送这些更改(待定)。
  4. 项目需要运行的暂定命令:

    git add -A
    git commit "explanations_of_changes"
    git push our_remote
    

    注意:此代码(没有用户交互)将是唯一承诺此回购的实体,因此我不担心冲突并相信此流程将起作用。

6 个答案:

答案 0 :(得分:8)

我意识到这是一个古老的问题,但是我想补充一下我最近遇到的解决方案,以便将来为那些人提供帮助。

PowerShell类提供了一种与git交互的简便方法。这是.NET中System.Management.Automation命名空间的一部分。

string directory = ""; // directory of the git repository

using (PowerShell powershell = PowerShell.Create()) {
    // this changes from the user folder that PowerShell starts up with to your git repository
    powershell.AddScript(String.Format(@"cd {0}", directory);

    powershell.AddScript(@"git init");
    powershell.AddScript(@"git add *");
    powershell.AddScript(@"git commit -m 'git commit from PowerShell in C#'");
    powershell.AddScript(@"git push");

    Collection<PSObject> results = powershell.Invoke();
}

在我看来,这比使用Process.Start()方法更干净,更好。您可以通过编辑添加到powershell对象的脚本来修改它,以满足自己的特殊需求。

答案 1 :(得分:7)

如果要在C#中执行此操作,可以在检测到文件更改时通过Process.Start调用外部git命令

string gitCommand = "git";
string gitAddArgument = @"add -A" ;
string gitCommitArgument = @"commit ""explanations_of_changes"" "
string gitPushArgument = @"push our_remote"

Process.Start(gitCommand, gitAddArgument );
Process.Start(gitCommand, gitCommitArgument );
Process.Start(gitCommand, gitPushArgument );

不是最好的解决方案,但它适用于C#

答案 2 :(得分:3)

    //Console.WriteLine(CommandOutput("git status"));

    public static string CommandOutput(string command,
                                       string workingDirectory = null)
    {
        try
        {
            ProcessStartInfo procStartInfo = new ProcessStartInfo("cmd", "/c " + command);

            procStartInfo.RedirectStandardError = procStartInfo.RedirectStandardInput = procStartInfo.RedirectStandardOutput = true;
            procStartInfo.UseShellExecute = false;
            procStartInfo.CreateNoWindow = true;
            if (null != workingDirectory)
            {
                procStartInfo.WorkingDirectory = workingDirectory;
            }

            Process proc = new Process();
            proc.StartInfo = procStartInfo;
            proc.Start();

            StringBuilder sb = new StringBuilder();
            proc.OutputDataReceived += delegate (object sender, DataReceivedEventArgs e)
            {
                sb.AppendLine(e.Data);
            };
            proc.ErrorDataReceived += delegate (object sender, DataReceivedEventArgs e)
            {
                sb.AppendLine(e.Data);
            };

            proc.BeginOutputReadLine();
            proc.BeginErrorReadLine();
            proc.WaitForExit();
            return sb.ToString();
        }
        catch (Exception objException)
        {
            return $"Error in command: {command}, {objException.Message}";
        }
    }

答案 3 :(得分:3)

尝试LibGit2Sharp,它是.NET的git的本机实现:

https://github.com/libgit2/libgit2sharp/

答案 4 :(得分:2)

另一种方法是使用您的项目设置Grunt和TaskRunner。

Grunt应该能够自动检测项目中文件夹(或多个文件夹)的更改,并执行相应的git命令进行提交。

Task Runner允许您在Visual Studio中初始化和运行Grunt。

Visual Studio团队表示Task Runner将集成到Visual Studio的未来版本中,因此这可能是一个长期的解决方案。

注意:评论中已经提到过,但我觉得再次值得一提的是,无论何时将文件保存到存储库,自动提交都不是最佳做法。您希望推入功能/原子代码更改,而不是简单的文本更改。自动提交需要您自担风险。

答案 5 :(得分:-3)

软件包管理器控制台是Powershell控制台。所以你可以从那里运行你的git命令。