2011-10-28 17 views
6

Sono davvero frustrato dall'uso della funzione di sottomodulo di git. O continuo a non farlo bene o semplicemente non funziona come mi aspetto. In seguito la situazione del progetto è dato:Pasticcio di sottotitoli Git: come usare i sottomoduli git con gli sviluppatori che non hanno familiarità con git?

Project 
    | .git 
    | projsrc 
    | source (submodule) 
    | proj.sln 

In questo scenario fonte sta puntando ad un altro repository che contiene i dati di origine comuni in tutti i nostri progetti. C'è molto sviluppo in corso sotto fonte come anche sotto projsrc. Sfortunatamente Il progetto punta a qualche commit del sottomodulo di origine e non al HEAD effettivo di esso. Questo è il solito comportamento da idiota, per quanto ne so.

ho già scoperto che

git submodule update 

solo ottenere la versione del modulo che è stato commesso insieme al progetto principale. Tuttavia, mi piacerebbe davvero essere sempre aggiornato sullo sviluppo dei sottomoduli, ma non ho alcuna idea su come farlo correttamente. Quindi la mia domanda è:

E 'possibile collegare il Progetto alla TESTA del modulo, reagardless del fatto se questo si romperà la compilazione di progetto o meno. Solo non voglio andare sempre nel sottomodulo directory e fare git pull lì. Dal momento che penso che potrei perdere le mie modifiche fatte nella directory del sottomodulo, perché questo è semplice collegato a un commit e non proprio a qualsiasi ramo o così.

perche seguenti vincoli:

  • sviluppatori nel nostro gruppo non sono che la familiarità con tutti i VCS intorno. Siamo abituati ad usare un repository svn davvero enorme prima, senza alcuna funzionalità di repository esterna.
  • Stiamo lavorando su Windows
  • Una soluzione click'n'forget sarebbe meglio, dal momento che la maggior parte dei membri del progetto sono piuttosto spaventati utilizzando un'interfaccia a riga di comando :)
+1

Vedi anche http://stackoverflow.com/questions/1979167/git-submodule-update/1979194#1979194 e http://stackoverflow.com/questions/3131912/ perché-sono-git-submodules-incompatible-with-svn-externals/3132221 # 3132221 – VonC

+0

"Potrei perdere le mie modifiche fatte nella directory del sottomodulo, perché questo è semplice collegato ad un impegnarsi e non realmente in nessun ramo "Non è vero! C'è sempre un ramo.Non si perdono mai le modifiche finché non si esegue il commit quando si è in stato di testa staccato. – Vanuan

risposta

7

il motivo per cui i punti sottomodulo a una particolare revisione è importante. Se si punta a un HEAD, le build saranno non riproducibili. Cioè se controlli la versione di ieri del Progetto, non sapresti mai quale versione esatta della fonte @ HEAD fosse ieri.

Ecco perché memorizza sempre particolari revisioni.

per tirare tutti i sottomoduli si potrebbe usare Easy way pull latest of all submodules

+0

Sono pienamente d'accordo sul fatto che si rompono, comunque sto bene con quella situazione. Mi sono solo preso la briga di spiegare a tutti gli sviluppatori non-git-familiari che collaborano al mio ** progetto ** che il sottomodulo ** sorgente ** non funziona come previsto. Hanno sempre commesso/spinto sulla fonte ogni cambiamento lì. E ancora più importante, se eseguono semplicemente _git submodule update_ nel Progetto, perdono tutte le loro modifiche apportate a _source_, poiché vengono sovrascritte da quella particolare revisione. – cgart

+0

'update submodule' non cancella nessuna modifica, come so, controlla solo la revisione di riferimento. Le modifiche apportate sono ancora in fase di repo e potresti eseguire il checkout, quindi aggiornare ** Project ** per fare riferimento alla revisione e confermare il riferimento alla revisione del sottomodulo nel progetto principale. – kan

+0

In effetti, cancella le tue modifiche se non le hai ancora commesse e le hai già spinte (come anche le modifiche non sono state apportate al genitore). Poiché source/è un sottomodulo con HEAD distaccato (comportamento predefinito), gli aggiornamenti del modulo git porterebbero sempre la directory source/nello stato indicato dal repository principale. Questo è, ai miei occhi, un pessimo comportamento di git, dal momento che non mi comunica nemmeno che le mie modifiche locali vengono sovrascritte (git 1.7.7) – cgart

2

io non sono bravo a Git e modulo. Ma penso che alcune semplici regole sarebbero molto utili.

  1. Conferma e push dalla sottodirectory.
  2. Tornare alla radice del progetto, controllare lo stato se è necessario eseguire il commit e premere nuovamente.

quando Pull. può provare a usare lo script per raggruppare insieme l'aggiornamento "pull/submodule". E fallo solo alla radice del tuo progetto.

2

Considerate questo:

  1. fonte sta puntando a testa (come si vorrebbe).
  2. si apportano modifiche alla fonte all'interno di progetto (si commette ma non li si spinge)
  3. ora si hanno due HEAD: uno nella fonte del progetto, un altro nella fonte comune.

Quale si vorrebbe essere presente nel progetto quando si effettua l'aggiornamento del modulo di sottomodulo?

Il problema (e la caratteristica principale) di git nel tuo caso è che consideri commit e push come operazione atomica. Non lo è. Git è decentrato. Non esiste un HEAD comune. Potresti avere più repository con HEAD diversi.

Considerate questo:

  1. si dispone di 3 sviluppatori (A, B e C) con un progetto Git.
  2. tutti tirano il TESTO di un progetto.
  3. ogni sviluppatore ha apportato modifiche al progetto
  4. ora ognuna di esse ha 3 TEST: A TESTA, A TESTA B A TESTA C.

Quale TESTE consideri "vero" TESTA?

Quindi, per rispondere alla tua domanda: Se vuoi che il sottomodulo sorgente comune sia sempre sincronizzato con il repository centrale, git non è la tua scelta. E probabilmente nessuno dei VCS ti può aiutare in questo.

Si dovrebbe trattare git modulo come una libreria di terze parti che dovrebbe essere aggiornato manualmente con questi due passaggi:

  1. tirare il modulo ("scarica libreria di terze parti")
  2. Commit il vostro progetto con modulo aggiornato (" inserire la nuova versione della libreria di terze parti al progetto ")

Se si desidera apportare modifiche al modulo si dovrebbe fare lo stesso in senso inverso:

  1. Commit tuo modulo ("apportare le modifiche alla libreria di terze parti")
  2. spingere il modulo ("invia le modifiche al manutentore libreria di terze parti")
  3. Commit il vostro progetto con modulo aggiornato ("inserire la nuova versione della libreria di terze parti al progetto ")
+0

Grazie Vanuan. Sì, lo so che ho avuto l'idea di git. Potresti avere ragione, potrebbe non essere la scelta giusta. Il problema è che mi ci è voluto molto tempo per capire cosa sta effettivamente facendo git rispetto allo svn usato in precedenza. Ho già davvero paura di spiegare questo ai miei co-sviluppatori ... Tuttavia, penso di aver già trovato il mio flusso di lavoro usando git. – cgart

+0

Non aver paura di spiegare. Git è semplice come il versioning distribuito può essere. L'unica cosa che i tuoi co-sviluppatori devono capire è che ogni copia di git repo è "svn-server" locale indipendente. La necessità di sincronizzazione tra "server" è la ragione per cui alcune cose non sono possibili con git. – Vanuan

Problemi correlati