El submodule de Git falla en TFS Build

Cuando bash crear usando TFS con Git, existe una limitación por la cual el proveedor de gits de TFS aún no admite submodules. Me duele un poco, pero qué diablos, puedo decirle a TFS que ejecute un file por lotes antes de la compilation. Lo he usado para llamar a un script manual de git para actualizar todos mis submodules en mi proyecto "super".

El command que ejecuta este file por lotes es simplemente: git submodule update –init –recursive

Esto funcionó bien y muy bien antes de migrar el origen del submodule a TFS, sin embargo ahora la compilation de TFS está fallando, porque el script del module de git anterior ya no funciona.

Entonces, lo que TFS hace antes de una compilation es Extrae las fonts actuales de Git en una carpeta en el server de compilation, a la que tengo acceso.

Si abro Git Bash en esta carpeta y ejecuto los siguientes commands: subprogtwig git init git actualización del submodule

Recibo el siguiente error, y no puedo resolver por qué soy de mi vida. Intenté search este error específico que generalmente apunta a una confirmación de submodule que se envía después de que se empuja el informe de "superproyecto". Pero puedo verificar que todos los commit y push de submodule se realicen ANTES de que se complete el commit y push del "super proyecto". Aquí está el resultado de los commands TFS git:

james@TFS /C/Builds/1/Technique Webs/MIS Console 5.2 Development/src (5.2development) $ git submodule init james@TFS /C/Builds/1/Technique Webs/MIS Console 5.2 Development/src (5.2development) $ git submodule update Username for 'http://tfs:8080': james Password for 'http://james@TFS:8080': <password> From http://TFS:8080/TFS/Technique/_git/Technique%20Library * branch HEAD -> FETCH_HEAD fatal: reference is not a tree: 33106ea146d470159e327c1b2d623d14f522cdd4 Unable to checkout '33106ea146d470159e327c1b2d623d14f522cdd4' in submodule path 'calc-engine' james@TFS /C/Builds/1/Technique Webs/MIS Console 5.2 Development/src (5.2development) $ 

Solucioné un problema similar después de mucho ensayo y error: resultó que se trataba de un problema con el script de PowerShell de precompilation de TFS que se ejecutaba sin perfil de usuario y, por lo tanto, GIT no podía ver la configuration de caching de cnetworkingenciales para el usuario de compilation (por ejemplo, como se establece en C:\Users\theuser\.gitconfig ).

Los scripts por lotes sufrirían del mismo problema.

El comportamiento distintivo era que las llamadas del git submodule colgaban por completo, y pondrían el repository GIT en un estado muy extraño (como lo indican los errores not a tree anteriores).

El problema se debe a que GIT solicita el nombre de usuario y la contraseña, sin embargo, esta es una session no interactiva, por lo que todo se detiene.

Utilizando wincnetworking como caching de cnetworkingenciales, pude solucionarlo de la siguiente manera:

  1. Iniciar session en la máquina de compilation como el usuario de compilation.
  2. Accediendo al server GIT a través de la línea de command e ingresando las cnetworkingenciales requeridas.
  3. Abrió el Administrador de cnetworkingenciales de Windows y verificó que la cnetworkingencial en caching esté visible en la sección de Cnetworkingenciales genéricas.
  4. En el símbolo del sistema elevado, GIT forzado usa wincnetworking por defecto, incluso si no tiene ningún file de configuration de usuario: git config --system cnetworkingential.helper wincnetworking
  5. Vuelve a ejecutar la compilation de TFS: lo cual funcionó.

La razón es que 'Git Bash' no conoce las cnetworkingenciales de la count de compilation, y debe solicitar cada vez de forma interactiva para ellos. De hecho, si la count de compilation tiene acceso a todos los repositorys remotos de los submodules, solo es necesario dar el nombre de usuario y la contraseña vacíos para el aviso de cnetworkingencial. Esto no es fácil en Windows porque el administrador de cnetworkingenciales no acepta el nombre de usuario vacío.

Una forma de solucionarlo es cambiar la URL del submodule a algo como a continuación. El símbolo '@' es lo mismo que ingresar el nombre de usuario y la contraseña vacíos.

 [submodule "..."] path = ... url = http://@tfs:8080/...