私たちの組織は、さまざまなリポジトリに VisualStudioOnline、GitHub、および BitBucket を利用しています。私は、定期的なスケジュールでpull
さまざまなリポジトリからの変更を自動化する方法を c# で見つけようとしています。git
このようなプロセスを開始してから、標準入出力をリダイレクトしようとしました。
var p = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = @"C:\Program Files (x86)\Git\bin\sh.exe",
RedirectStandardInput = true,
UseShellExecute = false,
RedirectStandardOutput = true,
Arguments = "--login -i"
}
};
p.Start();
using (var so = p.StandardOutput)
{
using (var si = p.StandardInput)
{
if (si.BaseStream.CanWrite)
{
...
}
}
}
ブロック内で、次のようなコマンドを実行できgit
ます。
si.WriteLine("cd \"P:/code/testapp\"");
git
シェルをそのディレクトリに移動しますsi.WriteLine("git rev-parse HEAD");
これにより、その場所にあるリポジトリの最新のハッシュが得られます。
bash シェルで返されたハッシュを確認でき、次のように標準入力から読み取ることもできますvar hash = so.ReadLine();
私がやろうとするとsi.WriteLint("git pull");
、ユーザー名とパスワードを要求されますが、これは私が期待することですが、それは標準の入出力では行われません。var prompt = so.ReadLine();
ユーザー名またはパスワードのプロンプトを表示できず、プロンプトにパスワードを入力することもできませんsi.WriteLine("username");
。
これを機能させるために多くのことを試みましたが、今のところうまくいきません。 警告: 厄介なコードが先にあります。傑作を作成するのではなく、何かをすばやくプロトタイプ化しようとしました
試行 1 : 上記のように標準の入力/出力リダイレクトを使用して、ユーザー名/パスワードのプロンプトを読み書きしようとしました。
試行 2git
: bashによって使用されている ssh-agent プロセスを取得して書き込みを試みます
si.WriteLine("ssh-agent --help");
var sshAgentInfo = string.Empty;
var tmp = a.ReadLine();
while (a.Peek() != -1)
{
sshAgentInfo += tmp;
tmp = a.ReadLine();
}
var begPos = sshAgentInfo.IndexOf("SSH_AGENT_PID=", StringComparison.Ordinal);
begPos = begPos + "SSH_AGENT_PID=".Length;
var endPos = sshAgentInfo.IndexOf(";", begPos, StringComparison.Ordinal);
var processId = int.Parse(sshAgentInfo.Substring(begPos, endPos - begPos));
var sshProcess = Process.GetProcessById(processId);
sshProcess.StartInfo.RedirectStandardInput = true;
sshProcess.StartInfo.RedirectStandardInput = true;
using (var si1 = sshProcess.StandardInput) { ... }
試行 3 : 資格情報を利用git config credential.helper wincred
する これと 4 つの試行は非常によく似ています。繰り返しますが、コマンドラインからこれらの資格情報マネージャーのいずれかにパスワードを設定する方法を見つけようとしています。
試行 4 : Git-Credential-Manager-for-Windows を利用する ここでドキュメントを調べてみましたが、これらの行に沿って何かを行うための拡張要求があるようです。
これらは両方とも、1 つを試みるには同様の問題があるようです。git シェルは、git シェルとは別の標準入出力を処理する別のプロセスを呼び出しているようです。ただし、これらの最後の2つの違いと希望は、これらの資格情報マネージャーを直接呼び出して、異なるURLのユーザー名/パスワードを設定する方法はありますか? .git ディレクトリの構成ファイルには、使用するマネージャーを指定するための資格情報設定があり、ユーザー名と電子メールがプレーン テキストで保存されます。
マシンのシェルを介して呼び出し、git pull
そのシェルを介して資格情報を一度入力すると、資格情報が保存されているように見えますが、ユーザーが Web サイトを介して資格情報を入力し、コマンド ラインを介してマネージャーを呼び出す方法はありますか?将来の自動使用のためにその情報を安全に保存しますか?
私もこれに出くわしました。まだ試す機会がありませんが、これはこのようなことを行うための実行可能なオプションですか?
どんな助けでも大歓迎です。