Git
Des sous-modules
Recherche…
Ajouter un sous-module
Vous pouvez inclure un autre référentiel Git en tant que dossier dans votre projet, suivi par Git:
$ git submodule add https://github.com/jquery/jquery.git
Vous devez ajouter et valider le nouveau fichier .gitmodules ; Cela indique à Git quels sous-modules doivent être clonés lorsque la git submodule update est exécutée.
Cloner un dépôt Git avec des sous-modules
Lorsque vous clonez un référentiel utilisant des sous-modules, vous devez les initialiser et les mettre à jour.
$ git clone --recursive https://github.com/username/repo.git
Cela clone les sous-modules référencés et les place dans les dossiers appropriés (y compris les sous-modules dans les sous-modules). Cela équivaut à exécuter git submodule update --init --recursive immédiatement après la fin du clone.
Mise à jour d'un sous-module
Un sous-module référence une validation spécifique dans un autre référentiel. Pour vérifier l'état exact référencé pour tous les sous-modules, exécutez
git submodule update --recursive
Parfois, au lieu d'utiliser l'état référencé, vous souhaitez mettre à jour votre extraction locale vers le dernier état de ce sous-module sur une télécommande. Pour extraire tous les sous-modules du dernier état de la télécommande avec une seule commande, vous pouvez utiliser
git submodule foreach git pull <remote> <branch>
ou utilisez les arguments par défaut de git pull
git submodule foreach git pull
Notez que cela ne fera que mettre à jour votre copie de travail locale. L'exécution de git status indique que le répertoire du sous-module est sale s'il a été modifié à cause de cette commande. Pour mettre à jour votre référentiel afin de référencer le nouvel état à la place, vous devez valider les modifications:
git add <submodule_directory>
git commit
Si vous utilisez git pull pour avoir des conflits de fusion, vous pouvez utiliser git pull --rebase pour git pull --rebase en git pull --rebase sur vos modifications, ce qui diminue le plus souvent les risques de conflit. En outre, il tire toutes les branches vers le local.
git submodule foreach git pull --rebase
Pour vérifier l'état le plus récent d'un sous-module spécifique, vous pouvez utiliser:
git submodule update --remote <submodule_directory>
Définir un sous-module pour suivre une branche
Un sous-module est toujours extrait lors d'un commit spécifique SHA1 (le "gitlink", entrée spéciale dans l'index du rapport parent)
Mais on peut demander de mettre à jour ce sous-module avec la dernière validation d'une branche du dépôt à distance du sous-module.
Plutôt que d’aller dans chaque sous-module, en faisant un git checkout abranch --track origin/abranch, git pull , vous pouvez simplement faire (à partir du dépôt parent) a:
git submodule update --remote --recursive
Comme le SHA1 du sous-module changerait, vous devriez toujours suivre cela avec:
git add .
git commit -m "update submodules"
Cela suppose que les sous-modules étaient:
soit ajouté avec une branche à suivre:
git submodule -b abranch -- /url/of/submodule/repoou configuré (pour un sous-module existant) pour suivre une branche:
cd /path/to/parent/repo git config -f .gitmodules submodule.asubmodule.branch abranch
Retrait d'un sous-module
Vous pouvez supprimer un sous - module (par exemple the_submodule ) en appelant:
$ git submodule deinit the_submodule
$ git rm the_submodule
git submodule deinit the_submodulesupprime l'entréethe_submodules 'de .git / config. Cela exclut legit submodule updategit submodule sync, de lagit submodule sync-git submodule foreachet dugit submodule foreachappels et supprime son contenu local (source) . En outre, cela ne sera pas affiché comme un changement dans votre référentiel parent.git submodule initet lagit submodule updaterestaureront le sous-module, là encore sans changements dans votre référentiel parent.git rm the_submoduleva supprimer le sous-module de l'arborescence. Les fichiers disparaîtront ainsi que l'entrée des sous-modules dans le fichier.gitmodules(source) . Si seulementgit rm the_submodule(sans legit submodule deinit the_submoduleantérieur,git submodule deinit the_submoduleest exécuté, cependant, l'entrée du sous-module dans votre fichier .git / config restera.
Tiré d' ici :
- Supprimez la section pertinente du fichier
.gitmodules. -
.gitmodulesscène les modifications de.gitmodulesgit add .gitmodules - Supprimez la section correspondante de
.git/config. - Exécutez
git rm --cached path_to_submodule(pas de barre oblique). - Exécutez
rm -rf .git/modules/path_to_submodule - Commit
git commit -m "Removed submodule <name>" - Supprimer les fichiers de sous-modules désormais non suivis
-
rm -rf path_to_submodule
Déplacement d'un sous-module
Courir:
$ git mv old/path/to/module new/path/to/module Modifiez les
.gitmoduleset modifiez le chemin du sous-module de manière appropriée, puis placez-le dans l'index avecgit add .gitmodules.Si nécessaire, créez le répertoire parent du nouvel emplacement du sous-module (
mkdir -p new/path/to).Déplacer tout le contenu de l'ancien vers le nouveau répertoire (
mv -vi old/path/to/module new/path/to/submodule).Assurez-vous que Git suit ce répertoire (
git add new/path /to).Supprimez l'ancien répertoire avec
git rm --cached old/path/to/module.Déplacez le répertoire
.git/modules/ old/path/to/moduleavec tout son contenu vers.git/modules/ new/path/to/module.Editez le
.git/modules/ new/path/to /config, assurez-vous que l'élément worktree pointe vers les nouveaux emplacements. Dans cet exemple, cela devrait êtreworktree = ../../../../../ old/path/to/module. En règle générale, il devrait y en avoir deux..puis des répertoires dans le chemin direct à cet endroit. . Editez le fichiernew/path/to/module /.git, assurez-vous que le chemin dans ce fichier pointe vers le nouvel emplacement correct dans le dossier principal du projet.git, donc dans cet exemplegitdir: ../../../.git/modules/ new/path/to/module.git statussortie d'git statusressemble à ceci après:# 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 #Enfin, validez les modifications.
Cet exemple de Stack Overflow , par Axel Beckert