2011-02-10 21 views
9

Sto cercando di capire il modo corretto di clonare una libreria di terze parti (engagement.iphone di Janrain) nella struttura della directory della mia app in un modo che mi consenta di estrarre le ultime modifiche e unirle con qualsiasi modifica fare localmente. Voglio anche che la libreria di terze parti (unita alle mie modifiche) sia inclusa nel repository git per la mia app quando la spingo.Git: come clonare una libreria di terze parti in una sottodirectory del repository della mia app?

Struttura sarebbe qualcosa di simile a questo:

myApp/ <- this is my app, which is its own git repo 
    external/ 
     engage.iphone/ <- this is the 3rd party library I want to keep up-to-date 
    mySource1.h 
    mySource2.m 
    ... 

Come faccio a configurarlo in questo modo in modo sicuro? C'è qualche processo speciale per la fusione più avanti, dopo che è stato installato?

risposta

9

I sottomoduli sono il modo più semplice per ottenere ciò.

Ci sono due modi comuni di lavorare con i sottomoduli - aggiungerne di nuovi e inizializzare quelli esistenti.

Aggiunta di nuovi moduli di

Dalla radice della corsa repository locale:

git submodule add <repository> external/engage.iphone.

Il comando add è per quando si aggiunge inizialmente un sottomodulo al repository, a differenza di quando è stato clonato un repository con i sottomoduli esistenti). Aggiunge un altro repository che può essere su un percorso locale o remoto (ricorda che altri sviluppatori hanno bisogno di accedere a questo se si pubblica il repository!) Nel file .gitmodules nella root del repository, quindi clona il repository nella posizione specificata; external/engage.iphone nell'esempio precedente. A questo punto hai i file del repository secondario sul tuo sistema ed è elencato come sottomodulo in entrambi i file .gitmodules, la configurazione dei repository locali.

Tuttavia potrebbe non essere l'aggiunta i moduli stessi ...

Inizializzazione moduli esistenti

Le cose cambiano un po 'se si sta clonando un repository che ha già sottomoduli aggiunto ad essa. In questa situazione il file .gitmodules avrà i sottomoduli elencati in esso con le posizioni da cui recuperarli, ma la configurazione del repository locale non ne sa nulla e i file effettivi non esistono ancora sul tuo sistema. In primo luogo è necessario inizializzare i sottomoduli:

git submodule init

Questo verrà eseguito tramite qualunque repository elencati nelle vostre .gitmodules e aggiungerli al tuo .git/config. Git ora conosce il repository, ma non ha effettivamente clonato ancora, in modo da eseguire:

git submodule update

È possibile eseguire questo comando in qualsiasi momento per aggiornare i moduli registrati, vale a dire clone quelli mancanti.

git submodule sync <submodule>

Esegui questo per aggiornare tutti i moduli di montare la testa a distanza, a meno che non è stata specificata una specifica commit quando si ha il modulo aggiunto! Specificando un sottomodulo specifico, si sincronizzerà solo quello.

In puro stile git il comando init può essere combinato con il update per risparmiare tempo:

git submodule update --init.

Ovviamente, puoi sempre aggiornare manualmente i tuoi .gitmodules e .git/config una volta che hai appreso il layout che usano (simile alle sezioni branch e remote nella configurazione).

Tutte le specifiche sono disponibili nella pagina man (kernel.org version).

+0

Grazie. Sto ricevendo questo errore ora: "Nessuna mappatura del sottomodulo trovata in .gitmodules per il percorso 'engage.iphone/Contrib/json-framework'" ... qualche idea? –

+0

... questo accade quando eseguo "git submodule init" –

+0

@SteveN Come è stato eseguito il comando add? E cosa ha messo nei tuoi .gitmoduli? – ghickman

Problemi correlati