Come impostare un progetto git per usare un sottomodulo repo esterno?


213

Vorrei creare un repository che inserisce un repository remoto.

Ad esempio, diciamo jQuery come sottomodulo:

git://github.com/jquery/jquery.git

Quale sarebbe il processo di creazione di un repository con jQuery come sottomodulo e l'aggiunta del mio esterno come repository remoto.

Anche una volta impostato, se spingo / tiro sul mio telecomando, l'esterno rimarrà intatto?


1
Quando dici "pull in" stai dicendo che vuoi che il repository jQuery sia un sottomodulo del tuo repository?
Ezod,

Sì esatto, scusa se non è chiaro. Mi piacerebbe sapere come ho impostato questo come esterno mentre spingevo e tiravo le modifiche sul mio telecomando
Tom

Vedi il tutorial sul sottomodulo Git sul wiki di git.
Greg Bacon,

Risposte:


343
  1. Hai un progetto: chiamalo MyWebApp che ha già un repository github
  2. Vuoi usare il repository jquery nel tuo progetto
  3. Desideri inserire il repository jquery nel tuo progetto come sottomodulo .

I sottomoduli sono davvero molto facili da consultare e utilizzare. Supponendo che MyWebApp sia già configurato come repository, dal terminale emettere questi comandi:

cd MyWebApp
git submodule add git://github.com/jquery/jquery.git externals/jquery

Ciò creerà una directory denominata externals/jquery* e la collegherà al repository github jquery. Ora non ci resta che avviare il sottomodulo e clonare il codice su di esso:

git submodule update --init --recursive

Ora dovresti clonare tutto il codice più recente nel sottomodulo. Se il repository jquery cambia e si desidera abbattere l'ultimo codice, submodule updateimmettere nuovamente il comando. Nota: in genere ho un numero di repository esterni nei miei progetti, quindi raggruppo sempre i repository in una directory "esterna".

Il Pro Git Book online contiene alcune buone informazioni sui sottomoduli (e git in generale) presentati in modo facile da leggere. In alternativa, git help submodulefornirà anche buone informazioni. Oppure dai un'occhiata al tutorial sul sottomodulo Git sul wiki di git.

Ho notato questo post sul blog che parla di sottomoduli e li confronta con il meccanismo svn: externals di Subversion: http://speirs.org/blog/2009/5/11/understanding-git-submodules.html

* Come best practice, dovresti sempre posizionare i tuoi sottomoduli nella loro directory, come Externals. In caso contrario, la directory del progetto principale può diventare molto ingombra molto velocemente.


4
Grande spiegazione! :) Inoltre, "git help submodules" aiuta se si desidera un po 'più di dettagli, interni, ecc.
WhyNotHugo

2
Grazie, esattamente quello di cui avevo bisogno.
MikeSchinkel,

1
@Chevi Dipende dalle tue esigenze. In generale, aggiungere un progetto git come sottomodulo al progetto è una buona soluzione per i progetti che cambiano spesso o sono ancora in fase di sviluppo. Ciò consente di assicurarsi facilmente che tutto il codice di terze parti nel progetto sia aggiornato. Per il codice di terze parti che è essenzialmente statico - codice stabile e maturo che probabilmente non cambierà molto da versione a versione - l'uso di un sottomodulo non fornisce molto valore.
Memmons,

2
scusate ma rispetto agli esterni svn, non è così facile
Keil

2
@Keil Sono due comandi git submodule adde git submodule update... Non sono sicuro di quanto possa essere più semplice.
Memmons

24

Alla maggior parte di ciò che devi sapere è già stata data una risposta, quindi non mi preoccuperò di risolverlo, tuttavia ho trovato una piccola informazione che di solito manca.

Come sapete, "git pull" non aggiorna i sottomoduli, e "git submodules update" non scaricherà neanche l'ultimo HEAD di quei sottomoduli.

Per aggiornare tutti i sottomoduli all'ultima revisione a monte, è possibile utilizzare

git submodule foreach git pull

Se spesso modifichi i tuoi sottomoduli e ne hai molti, allora "git foreach" diventerà prezioso.



0

Penso che la risposta di @Hugo potrebbe essere ciò di cui hai bisogno e funziona bene. Quindi ho trovato un modo più semplice.

git submodule update --remote

È tutto.

Quindi un flusso di lavoro completo potrebbe essere:

git clone project-with-submodules
git submodule init
git config -l
git submodule update --remote
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.