2009-06-15 11 views
20

Qualcuno sta usando la nuova funzione git super/subproject nei progetti reali? Quanto bene funziona? Per esempio, capisco che se spingo a un sottoprogetto devo chiamare manualmente i ganci di superprogetti (magari usando l'hook dei sottoprogetti, ma comunque)?Qualcuno sta davvero usando git super/sottoprogetti?

+4

È un sottoprogetto uguale a un sottomodulo? Li ho usati – Apreche

risposta

11

Utilizzando modulo, si definisce nello spazio di lavoro Git (cioè il repository Git "super-progetto") una configurazione.
Per "configurazione", intendo "l'elenco di tag o nodo SHA-1 necessario per lavorare nel proprio spazio di lavoro".
(e per lavoro, intendo qualsiasi "sforzo di sviluppo" che si sta facendo all'interno del proprio spazio di lavoro: compilazione classica, patch o fusione, distribuzione o ...).
Questo è il caso in cui il vostro sono la clonazione di un super-progetto e "git update" i tuoi sottomoduli: si sta checkouting l'esatto SHA1 pronti contro termine che sono stati precedentemente impegnati nel super-progetto (registrato come gitlink in the index).

L'altra modalità è quando si sta lavorando sul progetto di super-e su uno o più moduli.
Ciò significa che per un determinato sottomodulo è stato estratto un ramo specifico (non si utilizza più un HEAD distaccato per il contenuto di tali sottomoduli, ma piuttosto un puntatore alla punta di un ramo).
Quindi, "premere un sottomodulo" significa aggiornare un repository distante contenente quel sottomodulo (e solo quello).

Il trucco effettivo in quest'ultimo scenario (che potrebbe meritare un aggancio di quello che vuoi) è quando stai spingendo il super-progetto: devi essere sicuro di aver spinto prima tutti i tuoi sotto-moduli.

Dal submodule tutorial:

pubblicare sempre il cambio modulo prima di pubblicare la modifica alla SuperProject che fa riferimento a esso. Se si dimentica di pubblicare il cambio modulo, gli altri non saranno in grado di clonare il repository (del super-progetto)

Non dimenticate che can configure a submodule to follow a branch.

+5

Sembra una versione alfa di sottomoduli, troppe complicazioni ...: S – inf3rno

3

Se si intende sottomoduli, allora certamente.

I sottomoduli non devono e non devono sapere ovunque vengano utilizzati. Ad esempio, ho un sottomodulo che viene utilizzato in diversi progetti che conosco (e probabilmente diversi che non lo sono).

La spinta a un sottomodulo non influisce in alcun modo sulla versione del codice utilizzata dal progetto contenente il sottomodulo, quindi non sono sicuro di cosa si vorrebbe fare un hook in ogni caso.

+0

Se, ad esempio, il sottomodulo è solo una parte di un sw più grande, potrei voler compilare l'intero pacchetto quando qualcuno fa una push. – Makis

+0

Ti mancano entrambi i punti. 1) La modifica del sottomodulo non cambia alcun progetto che lo contiene. Affatto. Una nuova build sarebbe identica alla build precedente. 2) Un determinato sottomodulo può essere utilizzato da migliaia di applicazioni e non può sapere quali sono tutti. – Dustin

+0

Ovviamente il modulo potrebbe essere utilizzato da diverse applicazioni, ma ovviamente il progetto principale avrebbe lo script di build che include il modulo. Non capisco questa cosa "affatto" - se ho un progetto con due sottomoduli e qualcuno spinge le loro modifiche su uno dei sottomoduli come mai il sottomodulo non cambia? Se cambia e ho uno script di build che include quel sottomodulo, ovviamente la build è diversa. – Makis

11

FWIW, stiamo cercando di fare il salto a git, e il nostro progetto (bitweaver, un sistema di gestione dei contenuti) è un sistema altamente modulare, con nearly 160 repositories). Una "build" generalmente contiene due dozzine o più sotto-repository. Abbiamo usato "moduli virtuali" in CVS, e questo ha funzionato in modo fantastico per noi, tuttavia CVS ha i propri limiti per la messa in scena di commit.

I sottomoduli Git presentano alcune limitazioni gravi e si consiglia di valutare l'implementazione di Mercurial in quanto è sicuramente più amichevole e flessibile per progetti esterni/modulari (ovvero supporta altri sistemi VCS, anche HgGit).

Qui ci sono le sfide più grandi:

  1. Ogni modulo è difficile legata ad un particolare commettere quando si "git modulo aggiunge" nel super-respository. Questo è dal progetto e cercato come vantaggio dai manutentori di git , quindi non mi aspetto che cambi presto. Ciò è doloroso in un sistema come il nostro in cui sono sempre attivi i commit nei sottomoduli . È necessario aggiornare il super progetto per tenere il passo o aggiornare i repository secondari da gestire dopo l'aggiornamento del sottomodulo iniziale . (vedi sotto il dominio per la nostra soluzione).

  2. Non è possibile eseguire facilmente il commit e premere su tutti i repository secondari dalla radice. Anche questo è molto fastidioso, vedi il sottomenu qui sotto.

  3. Vari gotchas che può essere insopportabile, in particolare le cose che "silenziosamente sovrascrivere i cambiamenti".

supergit

Abbiamo scritto una shell script call supergit che gestisce alcuni dei dolore. Fa il clone, il sottomodulo init, update e checkout master tutti in un colpo solo. Eseguirà anche comandi git su tutte le directory nel super-repo singolarmente (elaborazione di tipi git di massa).

HTH, buona fortuna.

+0

+1 questa è una buona panoramica dei pro e dei contro. Cordiali saluti, per i commit hard-coded, questo dovrebbe essere utile nei casi in cui i sottomoduli sono raramente (o manualmente) aggiornati alle versioni conosciute, buone (ad esempio i tag di produzione) - quindi funziona molto bene in quel caso. – ashes999

Problemi correlati