2013-10-08 5 views
8

Quando provo a creare utilizzando TFS con Git, c'è una limitazione per cui il provider git di TFS non supporta ancora i sottomoduli. Un po 'di dolore, ma che diamine, sono in grado di dire a TFS di eseguire un file Batch prima della compilazione. Ho usato questo per chiamare uno script git manuale per aggiornare tutti i miei sottomoduli nel mio progetto "super".Il sottomodulo Git non funziona su TFS Build

Il comando questo file batch viene eseguito è semplicemente: update modulo git --init --recursive

Questo ha funzionato bene e dandy, prima ho migrato la fonte modulo a TFS, ma ora la build TFS sta fallendo, perché lo script del modulo git sopra non funziona più.

Quindi, cosa fa TFS prima di una compilazione Estrae le origini correnti da Git in una cartella sul build server, a cui ho accesso.

Se apro Git Bash a questa cartella ed eseguire il seguente comando (s): git init modulo git aggiornamento modulo

ottengo il seguente errore, e non riesco a capire per la vita di io quello che è. Ho provato a cercare questo errore specifico che generalmente indica che un commit del submodule viene inviato dopo che il repository "super project" è stato premuto. Ma posso verificare che tutto il sottomodulo commetta i push & PRIMA che il "super project" esegua il commit &. Ecco l'output dei comandi git TFS:

[email protected] /C/Builds/1/Technique Webs/MIS Console 5.2 Development/src (5.2development) 
$ git submodule init 

[email protected] /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://[email protected]: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' 

[email protected] /C/Builds/1/Technique Webs/MIS Console 5.2 Development/src (5.2development) 
$ 
+0

Sembra che qualcuno abbia dimenticato di inviare le modifiche al sottomodulo. – springy76

+0

Anche se sembra così purtroppo non lo è - vedi il mio commento "... Posso verificare che tutto il sottomodulo commette e spinge vengono eseguiti PRIMA che il" super progetto "commetta e spinga sia fatto" Altre idee? – abbottdev

+0

Hai mai risolto questo? Sto incontrando lo stesso errore. – Quantumplation

risposta

4

ho risolto un problema simile, dopo molti tentativi ed errori: si è scoperto che questo era un problema con lo script di pre-compilazione PowerShell TFS in esecuzione con nessun profilo utente e pertanto GIT non ha potuto vedere le impostazioni della cache delle credenziali per l'utente di build (ad esempio, come impostato in C:\Users\theuser\.gitconfig).

Gli script batch soffrirebbero dello stesso problema.

Il comportamento distintivo era che le chiamate git submodule si bloccavano completamente e avrebbero messo il repository GIT in uno stato molto strano (come indicato dagli errori not a tree sopra).

Il blocco è dovuto al prompt GIT per il nome utente e la password da utilizzare, tuttavia questa è una sessione non interattiva, quindi tutto si ferma.

Utilizzando wincred cache come credenziali, sono stato in grado di risolvere questo problema:

  1. accedendo al sistema di compilazione come l'utente costruire.
  2. Accesso al server GIT tramite la riga di comando e immesso le credenziali richieste.
  3. Gestore credenziali di Windows aperto e controllato che la credenziale memorizzata nella cache sia visibile nella sezione Credenziali generiche.
  4. Nel prompt dei comandi con privilegi elevati, costretti ad utilizzare GIT wincred di default, anche se non ha alcun file di configurazione utente: git config --system credential.helper wincred
  5. Re-correva la build da TFS: che ha funzionato.
+1

Utilizzato [git-credential-winstore] (https://gitcredentialstore.codeplex.com/) per inserire le credenziali di Build-runner nella cache sul build server – 2ooom

+0

@ 2ooom Nelle recenti build di git per windows non è nemmeno necessario installare git-credential-winstore è possibile utilizzare il modulo wincred incorporato. –

0

Il motivo è che 'Git Bash' non conosce le credenziali dell'account di build e dovrebbe richiedere ogni volta in modo interattivo per loro. Infatti, se l'account di build ha accesso a tutti i repository remoti dei sottomoduli, è sufficiente fornire nome utente e password vuoti per il prompt delle credenziali.Questo non è facile in Windows perché il gestore delle credenziali non accetta il nome utente vuoto.

Un modo per aggirare il problema per modificare l'URL del sottomodulo su qualcosa di simile. Il simbolo '@' equivale a inserire nome utente e password vuoti.

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