web-dev-qa-db-ja.com

C#関数からgitコマンドを実行する

追跡ファイルの変更を検出したときに、C#コードはどのようにgitコマンドを実行できますか?この目的でVisualStudio/C#コンソールプロジェクトを作成しています。

私は.NET環境に不慣れで、現在、フォルダーへの自動GITコミットの統合に取り組んでいます。既知のフォルダの変更/追加/削除を自動的にコミットし、それをgitリモートにプッシュする必要があります。どんなガイダンスもありがたいです。ありがとうございました。

ここに私が持っているものがあり、最後のものは私がいくつかのガイダンスを必要とするものです:

  1. 適切な無視ファイル(完了)があるフォルダーにGitリポジトリーが最初にセットアップされました。
  2. 私はC#FileSystemWatcherを使用して、上記のフォルダーでの変更をキャッチします(完了)。
  3. プロジェクトが変更を検出したら、それらの変更をコミットしてプッシュする(保留中)必要があります。

プロジェクトを実行するために必要な暫定的なコマンド:

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

注:このコード(ユーザー操作なし)は、このリポジトリにコミットする唯一のエンティティになるため、競合について心配する必要はなく、このフローが機能すると信じています。

16
Yuri

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#で機能します

11
palazzo train

これは古い質問であることに気づきましたが、私が最近遭遇した解決策を追加して、将来の人々を助けることを望みました。

PowerShell クラスは、gitと対話する簡単な方法を提供します。これは、.NETの_System.Management.Automation_名前空間の一部です。 System.Management.Automation.dllはNuGet経由で利用できることに注意してください。

_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($"cd {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オブジェクトに追加されるスクリプトを編集することで、これを特定のニーズに変更できます。

@ArtemIllarionovがコメントしたように、powershell.Invoke()はエラーを返しませんが、Streamsプロパティには出力情報があります。具体的には、エラーの場合は_powerShell.Streams.Error_。

24
ivcubr
    //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}";
        }
    }
4
Raj kumar

1つの代替方法は、プロジェクトでGruntとTaskRunnerをセットアップすることです。

Grunt は、プロジェクト内の1つまたは複数のフォルダーへの変更を検出する自動化を提供し、適切なgitコマンドを実行してそれをコミットできる必要があります。

Task Runner を使用すると、Visual Studio内からGruntを初期化して実行できます。

Visual Studioチームは、Task RunnerがVisual Studioの将来のリリースに統合される予定であることを示しているため、これは長期的な解決策になる可能性があります。

注:コメントで言及されていますが、ファイルがリポジトリに保存されるたびに自動コミットすることはベストプラクティスではないことを再度言及する価値があると思います。単純なテキストの変更ではなく、機能/アトミックコードの変更をプッシュする必要があります。自己責任で自動コミットしてください。

2
Dillie-O