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 через оболочку на машине и введите мои учетные данные один раз через эту оболочку, кажется, что они хранятся, но есть ли способ, позволяющий пользователям вводить свои учетные данные через веб-сайт, а затем вызывать менеджера через командную строку для безопасного хранения этой информации для будущего автоматизированного использования?

Я тоже сталкивался с этим. У меня еще не было возможности попробовать это, но это жизнеспособный вариант для того, чтобы сделать что-то подобное?

Любая помощь будет принята с благодарностью.

0 ответов

Другие вопросы по тегам