2014-10-20 23 views
6

Sto lavorando su un sito Web utilizzando Sharelatex(github) ma contiene altri repository utilizzati per creare il progetto principale. Ho clonato il repository principale e ho fatto grunt install che viene utilizzato per scaricare quei repository.Mantenimento del repository git contenente altro repository di git clonato

Ma il problema è che ho bisogno di cambiare il codice nel repository principale e quelli scaricati.

Poiché questi progetti possono ottenere nuovi aggiornamenti, desidero unire anche questi cambiamenti. Devo anche mantenere un repository, ma quando spingo le modifiche su Github mostra solo i cambiamenti nel repository principale.

Mi sono imbattuto in submodules in git ma dal momento che il progetto principale non contiene alcun tipo di sottomodulo non riesco a utilizzarlo.

Ad esempio:

C'è un repo web utilizzato nel progetto principale. Inizio con alcune modifiche nei file in web. Ho bisogno che queste modifiche si riflettano nel mio repository remoto in modo che altri possano usarle.

Ora supponiamo che dopo qualche tempo sia disponibile un aggiornamento importante per il repository web, come dovrei utilizzarlo?

Inserisco grunt install nella riga di comando per scaricare questo repository. Non crea un sottomodulo ma i cloni che vengono reinseriti nella mia cartella, che viene successivamente ignorato dal mio repository git principale.

La domanda potrebbe non essere chiara ma ho fatto del mio meglio per spiegare il problema.

Nel guscio di noce:

  • voglio non solo di effettuare cambiamenti sia principale e qualsiasi altro repository che è coinvolto, ma tirare e unire quelle altre operazioni pronti contro termine, così, quando i loro aggiornamenti sono disponibili .

  • Ho anche bisogno di mantenere un repository remoto del mio progetto.

risposta

6

Sto lavorando su un sito web utilizzando Sharelatex (GitHub), ma contiene altri repository che vengono utilizzati per costruire il progetto principale. [...] Mi sono imbattuto in sottomoduli in git ma dal momento che il progetto principale non contiene alcun tipo di sottomodulo non sono in grado di usarlo.

In realtà, si dispone di un sottomodulo. Questo è ciò che un repository nidificato è, e (io sono serio su questo) per quanto riguarda ciò che è necessario capire per ingannare i sottomoduli, quello è tutti i c'è per i sottomoduli. Per capire i sottomoduli, immagina di avere un repository nidificato (fai) e pensa ai requisiti amministrativi, cosa deve essere fatto per supportare tale impostazione in un dvcs.

Per i principianti, quando le persone clonano un progetto che utilizza i sottomoduli di alcuni repository che hai deciso contiene commit pubblicati, quel clone ovviamente non avrà anche il repository del sottoprogetto (certamente non dovrebbe ottenere il tuo privato e sa-cosa-hai-fatto-per-versione). Quindi devono anche ottenere il repository del sottoprogetto da alcuni dei propri repository pubblicati.

Come si fa a dire alla gente che recupera i propri commit dove si impegna il sottoprogetto necessario?Chiaramente, devi rilasciare una nota da qualche parte in un file impegnato dicendo "ecco un repository che dovrebbe avere qualsiasi sottoprogetto $ necessario". git submodule si è stabilito su .gitmodules come luogo convenzionale in cui memorizzare note come questa.

Successivo: quali sono gli altri da fare se l'URL che hai consegnato va offline? Avranno chiaramente bisogno di usare un altro repository. Quindi, .gitmodules è solo un suggerimento, il comando git submodule utilizza i valori correnti nel tuo .git/config, che è stato popolato da git submodule init da quelli suggeriti in .gitmodules`.

git submodule le operazioni sono tutte come questo. Dimenticalo. Non preoccuparti nemmeno di guardare il comando finché non hai bisogno di un po 'di assistenza per fare ciò che hai già trovato. Partendo dalla conoscenza, il semplice fatto, che un sottomodulo non è altro che un repository annidato, e il progetto che lo utilizza non impegna nient'altro che un ID commit che dovrebbe essere da qualche parte in quel repository annidato. Questo è tutto. È tutto un sottomodulo.

Mentre svolgi compiti noiosi che devono essere eseguiti, cerca un sottocomando git submodule che li faccia per te. Non è necessario utilizzare il sottocomando. Tutto ciò che sta facendo il sottocomando è l'automazione di compiti semplici che altrimenti sarebbero laboriosi. È un kit di strumenti per fare qualsiasi cosa tu debba fare, e non c'è verso che possa o debba imporre un'arbitraria e sufficiente (< - quella è la parte difficile) all'astrazione di tutti nel mondo. Quindi è un cesto.

Detto questo, c'è un importante gioco di sicurezza git submodule update e git submodule add eseguito per te quando fanno il git clone per te. I repository hanno convenzionalmente il contenuto effettivo del repository sotto il progetto [sub] toplevel .git, ma se si controlla un ramo che non ha quel sottoprogetto o altrimenti necessita o desidera che quel sottoprogetto non sia andato, anche il suo .git andrà via - non cosa vuoi quando non contiene solo il tuo contenuto estratto ma l'intero repository effettivo. Quindi, quando git submodule update fa il suo clone iniziale, solleva la directory .git del sottomodulo in un pratico (e arbitrario) piccolo angolo nel repository del progetto contenente e sostituisce la directory .git appena spostata dal sottomodulo con un file .git contenente il percorso relativo a la directory spostata.

Per ottenere il sollevamento iniziale eseguito sul repository attualmente disponibile, spostarlo fuori dal repository corrente, aggiungere e aggiornare da qualsiasi posizione, quindi correggere gli URL a monte in .gitmodules per comodità di altri.

Lì. Ora sai assolutamente tutto ciò che devi sapere per capire i sottomodelli git e acquisire in modo incrementale i dettagli solo quando trovi che ne hai bisogno, per capire cosa sta facendo il comando git submodule per te e perché non devi preoccuparti di capire ogni piccolo cosa sulla sua manpage in anticipo. Almeno credo.

Se ho perso qualcosa di importante, sarei molto contento di (gentile o schietto, non mi interessa) le correzioni nei commenti.

Problemi correlati