Git
sottomoduli
Ricerca…
Aggiungere un sottomodulo
Puoi includere un altro repository Git come cartella all'interno del tuo progetto, monitorato da Git:
$ git submodule add https://github.com/jquery/jquery.git
Dovresti aggiungere e salvare il nuovo file .gitmodules ; questo dice a Git quali sottomoduli devono essere clonati quando viene eseguito l' git submodule update .
Clonazione di un repository Git con sottomoduli
Quando cloni un repository che utilizza i sottomoduli, dovrai inizializzarli e aggiornarli.
$ git clone --recursive https://github.com/username/repo.git
Questo clonerà i sottomodelli referenziati e li colloca nelle cartelle appropriate (inclusi i sottomoduli all'interno dei sottomoduli). Questo è equivalente all'esecuzione git submodule update --init --recursive immediatamente dopo che il clone è finito.
Aggiornamento di un submodulo
Un sottomodulo fa riferimento a un commit specifico in un altro repository. Per verificare lo stato esatto cui si fa riferimento per tutti i sottomoduli, esegui
git submodule update --recursive
A volte invece di utilizzare lo stato a cui si fa riferimento si desidera aggiornare il checkout locale allo stato più recente di quel sottomodulo su un telecomando. Per controllare tutti i sottomoduli allo stato più recente sul telecomando con un singolo comando, puoi usare
git submodule foreach git pull <remote> <branch>
o usa gli argomenti git pull predefiniti
git submodule foreach git pull
Nota che questo aggiornerà solo la tua copia di lavoro locale. L'esecuzione dello git status elencherà la directory del sottomodulo come sporca se modificata a causa di questo comando. Per aggiornare il repository in modo che faccia riferimento al nuovo stato, è necessario eseguire il commit delle modifiche:
git add <submodule_directory>
git commit
Potrebbero esserci alcune modifiche che possono avere unire conflitti se si utilizza git pull modo da poter utilizzare git pull --rebase per riavvolgere le modifiche in alto, il più delle volte diminuisce le probabilità di conflitto. Inoltre tira tutti i rami al locale.
git submodule foreach git pull --rebase
Per controllare lo stato più recente di un sottomodulo specifico, puoi utilizzare:
git submodule update --remote <submodule_directory>
Impostazione di un sottomodulo per seguire un ramo
Un sottomodulo viene sempre controllato a un commit specifico SHA1 (il "gitlink", voce speciale nell'indice del repository padre)
Ma si può richiedere di aggiornare quel sottomodulo all'ultima commit di un ramo del repository remoto del sottomodulo.
Piuttosto che andare in ogni sottomodulo, facendo un git checkout abranch --track origin/abranch, git pull , puoi semplicemente fare (dal repository padre) a:
git submodule update --remote --recursive
Poiché lo SHA1 del sottomodulo cambierebbe, avresti comunque bisogno di seguirlo con:
git add .
git commit -m "update submodules"
Questo suppone che i sottomoduli fossero:
o aggiunto con un ramo da seguire:
git submodule -b abranch -- /url/of/submodule/repoo configurato (per un sottomodulo esistente) per seguire un ramo:
cd /path/to/parent/repo git config -f .gitmodules submodule.asubmodule.branch abranch
Rimozione di un sottomodulo
Puoi rimuovere un sottomodulo (ad es. the_submodule ) chiamando:
$ git submodule deinit the_submodule
$ git rm the_submodule
git submodule deinit the_submodulecancella la voce dithe_submoduleda .git / config. Questo esclude the_submodule dagit submodule update,git submodule syncegit submodule foreachchiama ed elimina il suo contenuto locale (source) . Inoltre, questo non verrà mostrato come modifica nel repository principale.git submodule initegit submodule updateripristinano il sottomodulo, anche in questo caso senza modifiche commettibili nel repository principale.git rm the_submodulerimuoverà il sottomodulo dall'albero di lavoro. I file saranno scomparsi così come la voce dei sottomoduli nel file.gitmodules(source) . Se sologit rm the_submodule(senza ilgit rm the_submodulegit submodule deinit the_submoduleprecedentegit submodule deinit the_submoduleviene eseguito, tuttavia, la voce dei sottomoduli nel file .git / config rimarrà.
Preso da qui :
- Elimina la sezione pertinente dal file
.gitmodules. - Stage the
.gitmodulescambiagit add .gitmodules - Elimina la sezione pertinente da
.git/config. - Esegui
git rm --cached path_to_submodule(nessuna barra finale). - Esegui
rm -rf .git/modules/path_to_submodule - Commit
git commit -m "Removed submodule <name>" - Elimina i file del sottomodulo ora non tracciati
-
rm -rf path_to_submodule
Spostare un sottomodulo
Correre:
$ git mv old/path/to/module new/path/to/module Modifica
.gitmodulese cambia il percorso del sottomodulo in modo appropriato, e inseriscilo nell'indice congit add .gitmodules.Se necessario, creare la directory padre della nuova posizione del sottomodulo (
mkdir -p new/path/to).Sposta tutto il contenuto dalla vecchia alla nuova directory (
mv -vi old/path/to/module new/path/to/submodule).Assicurati che Git tenga traccia di questa directory (
git add new/path /to).Rimuovere la vecchia directory con
git rm --cached old/path/to/module.Sposta la directory
.git/modules/ old/path/to/modulecon tutto il suo contenuto in.git/modules/ new/path/to/module.Modifica il file
.git/modules/ new/path/to /config, assicurati che l'elemento worktree punti alle nuove posizioni, quindi in questo esempio dovrebbe essereworktree = ../../../../../ old/path/to/module. In genere dovrebbero esserci altre due..quindi le directory nel percorso diretto in quel luogo. . Modifica il filenew/path/to/module /.git, assicurati che il percorso in esso punti alla nuova posizione corretta all'interno della cartella.gitprogetto principale, quindi in questo esempiogitdir: ../../../.git/modules/ new/path/to/module.git statusoutput dellogit statuspresenta in questo modo in seguito:# On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # modified: .gitmodules # renamed: old/path/to/submodule -> new/path/to/submodule #Alla fine, commetti i cambiamenti.
Questo esempio di Stack Overflow , di Axel Beckert