Comment transformer un répertoire dans un référentiel Git en un sous-module
Les sous-modules Git sont comme des référentiels dans des référentiels, qui vous permettent d’inclure des bibliothèques de code externes ou des dépendances dans votre projet, le tout sans lier le contrôle de version du module au projet lui-même. Cela maintient les modules séparés et faciles à mettre à jour, et il est facile de convertir un répertoire en un nouveau sous-module.
Sommaire
Qu’est-ce qu’un sous-module dans Git ?
Un sous-module est un référentiel Git qui est intégré dans un autre référentiel Git. Cela vous permet d’inclure le code d’un autre projet en tant que dépendance, tout en conservant son propre contrôle de version.
Lorsque vous clonez le référentiel parent, il clone également automatiquement le référentiel de sous-modules. Cela signifie que le code du sous-module et l’historique Git sont séparés du contrôle de version principal et peuvent être mis à jour pour plusieurs référentiels qui utilisent la bibliothèque.
Une alternative aux sous-modules consiste à publier vos bibliothèques sous forme de packages dans des gestionnaires de packages tels que NPM, Maven ou NuGet. Cependant, cela ne fonctionne pas pour tous les types de projets, et si vous travaillez avec du code privé, vous devrez configurer un registre de packages privé, ce qui peut être plus compliqué que de simplement intégrer le code source de la bibliothèque en tant que sous-module. .
L’un des principaux problèmes liés à la transformation d’un répertoire existant en sous-module est que le sous-module doit être géré en externe. Git s’attend à ce que vous lui créiez un nouveau répertoire vide et que vous cloniez le sous-module dans le projet. Vous pouvez copier le code dans un nouveau dossier, mais vous perdrez tout l’historique Git qui s’y rapporte, ce qui peut être très préjudiciable dans les grands projets. Au lieu de cela, nous allons cloner le référentiel, filtrer le code inutile et pousser le nouvel historique vers le nouveau sous-module.
Comment transformer un répertoire en sous-module
La première étape consiste à créer un nouveau référentiel pour le sous-module. Il s’agit généralement d’un service d’hébergement Git tel que GitHub, bien que vous puissiez créer un référentiel local sur votre ordinateur.
Ensuite, vous voudrez obtenir une nouvelle copie de votre référentiel principal pour créer le référentiel de sous-modules.
git clone git@github.com:username/repository.git submodule-repo cd submodule-repo
Ensuite, vous voudrez filtrer tout ce qui n’est pas lié à votre sous-module. Cela supprimera tout l’historique de validation qui n’est pas lié au code contenu dans le sous-module. C’est un opération destructricealors assurez-vous de le faire sur la copie de votre dépôt, pas sur la copie principale.
git filter-branch --subdirectory-filter submoduledirectory -- --all
Il ne vous restera plus que le code qui se trouvait dans le répertoire et uniquement les commits qui s’y rapportent. Cela vous permettra de transférer tout l’historique Git lié à ce sous-module.
Vous souhaiterez remplacer l’URL distante de ce répertoire de modules par votre nouveau référentiel de sous-modules, généralement nommé « origine ».
git remote set-url origin https://github.com/new-repository.git
Ensuite, vous pouvez pousser l’historique comme vous le feriez normalement.
git push -u origin main
Ajout d’un nouveau sous-module
De retour dans le projet principal, vous voudrez ajouter le sous-module.
Tout d’abord, vous devez arrêter de suivre le répertoire que vous souhaitez transformer en sous-module à partir du référentiel parent. Il sera toujours là dans l’historique des versions de Git, et vous venez de l’ajouter au nouveau référentiel de modules de toute façon.
rm -rf directory_name
Ensuite, vous pouvez ajouter l’URL distante du référentiel de sous-modules que vous avez créé sur Github, en utilisant le git submodule add
commande:
git submodule add git@github.com:username/repository.git directory_name
Lorsque vous exécutez cette commande, Git créera un nouveau répertoire de sous-modules dans le référentiel parent et clonera le référentiel de sous-modules dans ce répertoire. Il recommencera également à suivre le dossier du module.
Pour mettre à jour le sous-module, vous pouvez utiliser le git submodule update
commande:
git submodule update --remote submodule_name