Git / SSH se cuelga cuando se llama desde MVC WebApi

Parte de un proyecto en el que estoy trabajando (Windows, C #, MVC4 WebAPI) requiere cierta integración con git. Ninguna de las bibliotecas existentes de C # git admitía la clonación remota, así que terminé portando las partes de laJavaGit proyecto que necesitábamos (checkout, fetch, status), y escritura de clonar yo mismo. Todo lo que realmente es es un envoltorio para el ejecutable de la línea de comandos git. El código relevante que llama está aquí:

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();
    }
}

Que sería llamado por el código como:

// 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);

Desde la API de MVC, usamos la suplantación para asegurarnos de que se ejecuta como un usuario con un inicio de sesión y una clave de git válidos (sin frase de contraseña). El comando anterior funciona perfectamente desde una línea de comandos como yo, y también en una prueba unitaria rápida (sé que es realmente una prueba de integración).

Sin embargo, cuando en realidad se llama desde la API como se muestra arriba, se bloquea. Mirar en el Administrador de tareas muestra git.exe en ejecución, con la línea de comandos que muestra la ruta completa a git.exe seguida de los argumentos anteriores. No utiliza ningún tiempo de procesador y solo 2604K de RAM, pero afirma estar ejecutándose. Del mismo modo, hay un proceso ssh.exe en ejecución, también sin uso de procesador, y 1212K de RAM, con la línea de comandos:

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

Ambos procesos se enumeran como ejecutándose con mi nombre de usuario, por lo que parece que la suplantación está funcionando correctamente.

Al buscar en el directorio localRepo, crea el directorio .git, luego se cuelga, dejando alrededor de 13K de archivos git, pero ninguno de nuestro código. Pensando que se debía a que nuestro repo era enorme, lo dejé correr de la noche a la mañana. Todavía no hay movimiento a partir de esta mañana.

Trajo LINQPad, corrió:

Process.GetProcessById($gitPID).Dump()

Hizo lo mismo para el proceso SSH también. Los subprocesos los mostraban en estado de Espera, y el WaitReason era Ejecutivo (esperando el programador de subprocesos). Inicialmente asumí que estaba esperando una frase de contraseña, ya que mi clave tenía una. Cambié a una clave de trabajo sin una frase de contraseña, mismo resultado.

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

La única idea que me queda es que tal vez no pueda comunicarse con ssh-agent, que se está ejecutando. Sin embargo, me está imitando a mí correctamente, así que no sé por qué no funcionaría desde el marco de trabajo de WebApi, pero funciona bien desde la prueba de la "unidad" y Git Shell. Intenté asegurarme de que las variables de entorno HOME, PLINK_PROTOCOL, TERM, SSH_AUTH_SOCK y SSH_AGENT_PID se establecieron, después de revisar los scripts de configuración de Github para Windows, solo para asegurarme de que no me faltara nada.

Estoy en una pérdida total. Aquí hay un fragmento del archivo de registro, con algunos comentarios despué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 

I siempre obtener el "No se pudo crear el directorio 'h / .ssh'" y "Advertencia: Agregado permanentemente * a la lista de hosts conocidos". Mensajes, incluso en la línea de comandos. Mi H: .ssh \ known_hosts permanece vacío, pero mis claves están en ese directorio, y git las encuentra bien. El error "el extremo remoto se colgó inesperadamente" fue cuando eliminé los procesos git y ssh.

Puede que termine cambiando a LibGit2Sharp para la mayoría de mis necesidades, pero eso todavía no resuelve mi problema de clonación. ¿Hay algún problema con la configuración de mi clave, que, de nuevo, funciona perfectamente fuera del proceso w3wp.exe? ¿Necesita poder comunicarse con ssh-agent.exe y no puede hacerlo? ¿Alguien ha clonado un repositorio de git remoto a través de System.Diagnostics.Process y ha vivido para contarlo?

ACTUALIZACIÓN (25/11/2012 18:54):

mvp estaba en lo cierto al señalar que la suplantación y las unidades de red asignadas no funcionan bien juntas. Agregué lo siguiente antes de comenzar el proceso:

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

Lo ejecuté de nuevo, y ahora al menos veo un nuevo proceso de git en el Administrador de tareas que está tomando 0 tiempos de procesador, pero está usando una cantidad creciente de memoria, creo que como parte del proceso de clonación. La línea de comando era:

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

Finalmente, finalmente terminó después de 10 minutos (es un gran repositorio), y lanzó la excepción:

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

¡Parece que el clon funcionó después de cambiar al directorio, sin embargo! El otro problema es algo que tiene que ver con el hecho de llamar inmediatamente a la caja después de que finalice la operación de clonación, pero no está relacionado con el problema de suspensión.

Solo necesito verificar la solución de mi / mvp en un servidor de producción, luego otorgaré la recompensa.

Respuestas a la pregunta(2)

Su respuesta a la pregunta