Git submodule

Anne git

Comment gérer les sous-modules de git.

Créer un sous-module

La commande suivante doit se faire à la racine du dépôt :

$ git submodule add [-b <branch>] <url> [path/to/submodule]
  • <url> est l’adresse du sous-module (la même que quand on clone) ;
  • path/to/submodule est optionnel et donne le chemin local où mettre submodule. Si on ne le spécifie pas, c’est le nom du dépôt cloné par défaut.
  • -b <branch> est également optionnel et spécifie le nom de la branche à utiliser dans le sous-module. C’est la branche master par défaut.

Supprimer un sous-module

  • On enlève d’abord le sous-module de .git/config avec :

      $ git submodule deinit path/to/submodule
    
  • puis on supprime le répertoire du sous-module du répertoire .git/modules :

      $ rm -rf .git/modules/path/to/submodule
    
  • enfin on supprime répertoire ainsi que l’entrée dans le .gitmodules avec :

      $ git rm path/to/submodule`
    

Déplacer un sous-module

Si on veut changer la source d’un sous-module, on peut directement éditer le fichier .gitmodules pour modifier l’URL. Après, il faut juste faire :

$ git submodule sync
$ git submodule update --init --recursive --remote

Ignorer les modifications dans un sous-module

Quand on utilise un sous-module externe, et qu’on ne souhaite pas le modifier, on peut être embêté lorsque le .gitignore n’est pas complet. En effet, la compilation peut par exemple générer des fichiers dont on a besoin (on ne peut donc pas faire un clean), mais on veut néanmoins voir le sous-module comme étant à jour.

L’astuce est d’ajouter une ligne ignore dans le .gitmodules. Dans mon cas (i.e. l’exemple ci-dessus), j’ai ajouté :

[submodule "sources"]
	path = sources
	url = ...
	ignore = untracked

Les valeurs possibles sont les mêmes que celles de l’option --ignore-submodules[=<when>], c’est-à-dire untracked, dirty ou all.

Voir aussi :