Cette page GitPro résume bien les conséquences d'une mise à jour du sous-module git
Lorsque vous exécutez git submodule update
, il extrait la version spécifique du projet, mais pas dans une branche. C'est ce qu'on appelle avoir une tête détachée - cela signifie que le fichier HEAD pointe directement vers une validation, pas vers une référence symbolique.
Le problème est que vous ne voulez généralement pas travailler dans un environnement de tête détachée, car il est facile de perdre les modifications .
Si vous effectuez une mise à jour initiale du sous-module, validez dans ce répertoire de sous-module sans créer de branche dans laquelle travailler, puis réexécutez la mise à jour du sous-module git à partir du superprojet sans vous engager entre-temps, Git écrasera vos modifications sans vous le dire. Techniquement, vous ne perdrez pas le travail, mais vous n'aurez pas de branche pointant dessus, il sera donc quelque peu difficile à récupérer.
Remarque mars 2013:
Comme mentionné dans " git submodule tracking latest ", un sous-module maintenant (git1.8.2) peut suivre une branche.
# add submodule to track master branch
git submodule add -b master [URL to Git repo];
# update your submodule
git submodule update --remote
# or (with rebase)
git submodule update --rebase --remote
Voir " git submodule update --remote
vsgit pull
".
La réponse de MindTooth illustre une mise à jour manuelle (sans configuration locale):
git submodule -q foreach git pull -q origin master
Dans les deux cas, cela changera les références des sous-modules (le gitlink , une entrée spéciale dans l'index du référentiel parent ), et vous devrez ajouter, valider et pousser lesdites références depuis le référentiel principal.
La prochaine fois que vous clonerez ce référentiel parent, il remplira les sous-modules pour refléter ces nouvelles références SHA1.
Le reste de cette réponse détaille la fonctionnalité de sous-module classique (référence à un commit fixe , qui est le point derrière la notion de sous-module).
Pour éviter ce problème, créez une branche lorsque vous travaillez dans un répertoire de sous-module avec git checkout -b work ou quelque chose d'équivalent. Lorsque vous effectuez la mise à jour du sous-module une deuxième fois, il reviendra toujours à votre travail, mais au moins vous avez un pointeur sur lequel revenir.
Changer de branche avec des sous-modules peut également être délicat. Si vous créez une nouvelle branche, y ajoutez un sous-module, puis revenez à une branche sans ce sous-module, vous avez toujours le répertoire du sous-module en tant que répertoire non suivi:
Donc, pour répondre à vos questions:
puis-je créer des branches / modifications et utiliser push / pull comme je le ferais dans les dépôts réguliers, ou y a-t-il des choses à faire attention?
Vous pouvez créer une branche et pousser les modifications.
AVERTISSEMENT (à partir du didacticiel de sous-module Git ): publiez (poussez) toujours la modification de sous-module avant de publier (poussez) la modification dans le superprojet qui la référence. Si vous oubliez de publier la modification du sous-module, les autres ne pourront pas cloner le référentiel.
comment pourrais-je faire avancer le commit référencé du sous-module de say (tagged) 1.0 à 1.1 (même si la tête du dépôt d'origine est déjà à 2.0)
La page " Comprendre les sous-modules " peut vous aider
Les sous-modules Git sont implémentés à l'aide de deux parties mobiles:
- le
.gitmodules
fichier et
- un type d'arbre particulier.
Ensemble, ils triangulent une révision spécifique d'un référentiel spécifique qui est extrait dans un emplacement spécifique de votre projet.
Depuis la page du sous-module git
vous ne pouvez pas modifier le contenu du sous-module depuis le projet principal
100% correct: vous ne pouvez pas modifier un sous-module, ne vous référez qu'à l'un de ses commits.
C'est pourquoi, lorsque vous modifiez un sous-module à partir du projet principal, vous:
- besoin de s'engager et de pousser dans le sous-module (vers le module en amont), et
- remontez ensuite dans votre projet principal, et recommencez (pour que ce projet principal fasse référence au nouveau commit de sous-module que vous venez de créer et de pousser)
Un sous-module vous permet d'avoir une approche de développement basée sur les composants , où le projet principal ne fait référence qu'à des validations spécifiques d'autres composants (ici "d'autres référentiels Git déclarés comme sous-modules").
Un sous-module est un marqueur (commit) vers un autre référentiel Git qui n'est pas lié par le cycle de développement principal du projet: il (l '"autre" dépôt Git) peut évoluer indépendamment.
Il appartient au projet principal de choisir dans cet autre référentiel tout engagement dont il a besoin.
Cependant, si vous souhaitez, par commodité , modifier l'un de ces sous-modules directement à partir de votre projet principal, Git vous permet de le faire, à condition de publier d' abord ces modifications de sous-module dans son référentiel Git d'origine, puis de valider votre projet principal en vous référant à une nouvelle version dudit sous-module.
Mais l'idée principale reste: référencer des composants spécifiques qui:
- ont leur propre cycle de vie
- ont leur propre jeu de balises
- avoir leur propre développement
La liste des validations spécifiques à laquelle vous vous référez dans votre projet principal définit votre configuration (c'est de cela dont parle la gestion de la configuration , englobant un simple système de contrôle de version )
Si un composant pouvait vraiment être développé en même temps que votre projet principal (car toute modification sur le projet principal impliquerait de modifier le sous-répertoire, et vice-versa), alors ce ne serait plus un "sous-module", mais un fusion de sous-arborescence (également présentée dans la question Transfert de la base de code héritée des cv vers le référentiel distribué ), reliant ensemble l'historique des deux référentiels Git.
Est-ce que cela aide à comprendre la vraie nature des sous-modules Git?