Git / SSH зависает при вызове из MVC WebApi

Часть проекта, который яДля работы с (Windows, C #, MVC4 WebAPI) требуется некоторая интеграция с git. Ни одна из существующих библиотек C # git не поддерживала удаленное клонирование, поэтому я завел портирование частейJavaGit проект, в котором мы нуждались (извлечение, получение, статус), и написание клона самостоятельно. Все, что это на самом деле - это обертка для исполняемого файла командной строки git. Соответствующий код, который он вызывает, находится здесь:

public static void RunGitCommand(string repositoryPath, string gitArguments)
{
    // GitCommand is the full path to git.exe (currently using Github for Windows)
    if (null == GitCommand || String.IsNullOrWhiteSpace(GitCommand))
    {
        throw new FileNotFoundException("Unable to find git.exe on your system PATH.");
    }

    // gitArguments contains the command to run (e.g. "clone -- git@repo:projectName c:\repositories\repo_a8c0dd321f")
    var startInfo = new ProcessStartInfo(GitCommand, gitArguments)
    {
        WorkingDirectory = (null != repositoryPath && Directory.Exists(repositoryPath)) ? repositoryPath : String.Empty,
        CreateNoWindow = true,
        UseShellExecute = false,
        RedirectStandardOutput = true,
        RedirectStandardInput = true,
        RedirectStandardError = true
    };

    using (var p = new Process
    {
        EnableRaisingEvents = true,
        StartInfo = startInfo
    })
    {
        p.OutputDataReceived += (sender, args) => Log.Debug(args.Data);

        p.ErrorDataReceived += (sender, args) => Log.Debug(args.Data);

        p.Start();

        p.BeginOutputReadLine();
        p.BeginErrorReadLine();

        p.WaitForExit();
    }
}

Который будет вызываться кодом как:

// names changed to protect the innocent
string localRepo = @"c:\repositories\repo_a8c0dd321f";
string gitArgs = "clone -- git@repo:projectName c:\repositories\repo_a8c0dd321f";

GitConfiguration.RunGitCommand(localRepo, gitArgs);

В рамках MVC API мы используем олицетворение, чтобы убедиться, чтоработает как пользователь с действительным логином и ключом git (без ключевой фразы). Вышеприведенная команда отлично работает из командной строки, как я, так и в быстром модульном тесте (я это знаю)действительно тест на интеграцию).

Однако когда этоНа самом деле вызывается из API, как показано выше, он зависает. Поиск в диспетчере задач показывает, что git.exe запущен, а в командной строке показан полный путь к git.exe, за которым следуют приведенные выше аргументы. Это'не использует процессорное время и только 2604 КБ ОЗУ, но утверждает, что работает. Аналогично, запущен процесс ssh.exe, также без использования процессора, и 1212 КБ ОЗУ с командной строкой:

ssh git@repo "git-upload-pack 'projectName'"

Оба процесса перечислены как запущенные под моим именем пользователя, поэтому кажется, что олицетворение работает правильно.

Посмотрев в каталог localRepo, он создает каталог .git, затем зависает, оставляя там около 13K файлов git, но не наш код. Думая, что это из-за огромного репо, я позволил ему работать в одночасье. По состоянию на это утро все еще нет движения.

Воспитал LINQPad, побежал:

Process.GetProcessById($gitPID).Dump()

Сделал то же самое для процесса SSH. Потоки показали, что они находятся в состоянии ожидания, а WaitReason был исполнителем (ожидание планировщика потока). Первоначально я предполагал, что это ожидание ключевой фразы, поскольку мой ключ имел ее. Я переключился на рабочий ключ без ключевой фразы, тот же результат.

Git/SSH versions (from latest GitHub for Windows):
    git version
        git version 1.7.11.msysgit.1
    ssh -v
        OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007

Единственная идея, которую я оставил, - этоT общаться с ssh-агентом, который работает. Это выдает себя за меня должным образом, поэтому я нене знаю, почему это не будетработает из фреймворка WebApi, но отлично работает изединица измерения" тест и Git Shell. Я попытался убедиться, что переменные окружения HOME, PLINK_PROTOCOL, TERM, SSH_AUTH_SOCK и SSH_AGENT_PID были установлены после просмотра сценариев установки Github для Windows, просто чтобы убедиться, что я неничего не пропустил.

м при полной потере. Вот's фрагмент файла журнала, с некоторыми комментариями после:

2012-11-20 13:42:59.5898 Info Initializing repo at path: c:\repositories\repo_a8c0dd321f 
2012-11-20 13:42:59.5898 Debug Working Directory: c:\repositories\repo_a8c0dd321f 
2012-11-20 13:42:59.6053 Debug C:\Users\christian.doggett\AppData\Local\GitHub\PortableGit_8810fd5c2c79c73adcc73fd0825f3b32fdb816e7\bin\git.exe status --branch 
2012-11-20 13:42:59.6209 Debug HOME=H:\ 
2012-11-20 13:42:59.6209 Debug PLINK_PROTOCOL=ssh 
2012-11-20 13:42:59.6365 Debug TERM=msys 
2012-11-20 13:42:59.6365 Debug SSH_AGENT_PID=58416 
2012-11-20 13:42:59.6365 Debug SSH_AUTH_SOCK=/tmp/ssh-IgTHj19056/agent.19056 
2012-11-20 13:42:59.6521 Info git status --branch
Exit code: 128

2012-11-20 13:42:59.6521 Error  
2012-11-20 13:42:59.6677 Info Cloning repo from origin: git@repo:projectName 
2012-11-20 13:43:01.8674 Debug Cloning into 'c:\repositories\repo_a8c0dd321f'... 
2012-11-20 13:43:03.2090 Debug Could not create directory 'h/.ssh'. 
2012-11-20 13:43:03.2870 Debug Warning: Permanently added 'repo,359.33.9.234' (RSA) to the list of known hosts. 
2012-11-20 13:44:41.4593 Debug fatal: The remote end hung up unexpectedly 

всегда получить "Не удалось создать каталогч / .ssh» а также "Предупреждение: постоянно добавлено * в список известных хостов. " сообщения даже в командной строке. Мой H: .ssh \ known_hosts остается пустым, но мои ключи находятся в этом каталоге, и git находит их просто отлично. "удаленный конец завис неожиданно ошибка была, когда я убил процессы git и ssh.

Я могу переключиться на LibGit2Sharp для большинства моих потребностей, но это все еще нене решить мою проблему с клоном. Что-то напортачило с моей настройкой ключа, что опять же отлично работает вне процесса w3wp.exe? Нужно ли иметь возможность общаться с ssh-agent.exe и не может? Кто-нибудь клонировал удаленный репозиторий git через System.Diagnostics.Process и жил, чтобы рассказать об этом?

ОБНОВЛЕНИЕ (25.11.2012 18:54):

mvp был прав, указав, что олицетворение и сопоставленные сетевые диски неНе очень хорошо играть вместе. Я добавил следующее перед началом процесса:

var userProfile = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile);
Environment.SetEnvironmentVariable("HOME", userProfile);

Я запустил его снова и теперь, по крайней мере, вижу новый процесс git в диспетчере задач, который 'Она занимает 0 процессорного времени, но использует все больший объем памяти, как я полагаю, как часть процесса клонирования. Командная строка была:

git index-pack --stdin --fix-thin "--keep=fetch-pack 6024 on MACHINENAME"

Это только наконец закончилось через 10 минутs огромное хранилище), и выкинул исключение:

fatal: git checkout: updating paths is incompatible with switching branches.
Did you intend to checkout 'origin/8b243b8d9a5140673fc552ef7da8f0dfe9039d50' which can not be resolved as commit?

Похоже, клон работал после перехода в каталог, хотя! Другая проблема связана с немедленным вызовом checkout после завершения операции клонирования, но не связана с проблемой зависания.

Мне просто нужно проверить мой / mvp 'решение на производственном сервере, то яЯ буду награждать награду.

Ответы на вопрос(2)

Ваш ответ на вопрос