C# Git процесс командной строки
Наша организация использует VisualStudioOnline, GitHub и BitBucket для различных репозиториев. Я пытался выяснить способ в C# для автоматизации pull
изменений от различных 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: использовались стандартные перенаправления ввода / вывода, как показано выше, чтобы попытаться написать / прочитать запросы на ввод имени пользователя / пароля.
Попытка 2: попытка получить процесс ssh-agent, который используется git
Баш и напиши
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: использование https://github.com/Microsoft/Git-Credential-Manager-for-Windows Я попытался просмотреть документацию здесь, и кажется, что есть запрос на улучшение, чтобы сделать что-то в этом направлении.
Оба из них, кажется, имеют похожие проблемы, чтобы попытаться один. Оболочка git, кажется, вызывает другой процесс, который обрабатывает стандартный ввод и вывод отдельно от оболочки git. Разница и надежда, которые у меня есть для этих двух последних, заключаются в том, есть ли способ напрямую обратиться к этим менеджерам учетных данных, чтобы задать имя пользователя / пароль для разных URL-адресов? В каталоге.git файл конфигурации имеет настройку учетных данных, указывающую, какой менеджер использовать, и он хранит имя пользователя и электронную почту в виде обычного текста.
Если я призываю git pull
через оболочку на машине и введите мои учетные данные один раз через эту оболочку, кажется, что они хранятся, но есть ли способ, позволяющий пользователям вводить свои учетные данные через веб-сайт, а затем вызывать менеджера через командную строку для безопасного хранения этой информации для будущего автоматизированного использования?
Я тоже сталкивался с этим. У меня еще не было возможности попробовать это, но это жизнеспособный вариант для того, чтобы сделать что-то подобное?
Любая помощь будет принята с благодарностью.