J'utilise des sous-modules Git. Après avoir extrait les modifications du serveur, la tête de mon sous-module est souvent détachée de la branche principale.
Pourquoi cela arrive-t-il?
Je dois toujours faire:
git branch
git checkout master
Comment puis-je m'assurer que mon sous-module pointe toujours vers la branche principale?
git
git-submodules
om471987
la source
la source
Réponses:
ÉDITER:
Voir @Simba Answer pour une solution valide
ANCIENNE RÉPONSE:
Personnellement, je déteste les réponses ici qui dirigent vers des liens externes qui peuvent cesser de fonctionner avec le temps et vérifier ma réponse ici (à moins que la question ne soit dupliquée) - diriger vers une question qui couvre le sujet entre les lignes d'un autre sujet, mais globalement égale: "Je suis ne répond pas, lisez la documentation. "
Revenons donc à la question: pourquoi cela se produit-il?
Situation que vous avez décrite
C'est un cas courant lorsque l'on n'utilise pas trop souvent des sous-modules ou qu'on vient de commencer avec des sous-modules . Je crois avoir raison de dire que nous avons tous été là à un moment donné où la tête de notre sous-module se détache.
Solution: assurez-vous que votre sous-module suit la bonne branche
Solution: faites en sorte que votre sous-module suive sa branche distante en ajoutant de nouveaux sous-modules avec les deux commandes suivantes.
<branch>
.Dans les cas courants, vous avez déjà corrigé votre TETE DÉTACHÉE car elle était liée à l'un des problèmes de configuration ci-dessus.
fixation de la TÊTE DÉTACHÉE lorsque
.update = checkout
Mais si vous avez déjà réussi à apporter des modifications localement pour le sous-module et que vous avez commité, si vous les avez poussées vers remote puis lorsque vous avez exécuté 'git checkout', Git vous en informe:
L'option recommandée pour créer une branche temporaire peut être bonne, puis vous pouvez simplement fusionner ces branches, etc. Cependant, personnellement, j'utiliserais juste
git cherry-pick <hash>
dans ce cas.Bien qu'il existe d'autres cas où vous pouvez mettre vos sous-modules dans l'état DETACHED HEAD, j'espère que vous comprenez maintenant un peu plus comment déboguer votre cas particulier.
la source
git submodule update --remote
. Jetez un œil à la réponse de Simba, je pense que cela devrait être la bonne réponse.L'ajout d'une
branch
option dans.gitmodule
n'est PAS du tout lié au comportement détaché des sous-modules. L'ancienne réponse de @mkungla est incorrecte ou obsolète.De
git submodule --help
, HEAD détaché est le comportement par défaut degit submodule update --remote
.Tout d'abord, il n'est pas nécessaire de spécifier une branche à suivre .
origin/master
est la branche par défaut à suivre.Pourquoi
Alors pourquoi HEAD est-il détaché après
update
? Ceci est causé par le comportement de mise à jour du module par défaut:checkout
.Pour expliquer ce comportement de mise à jour étrange, nous devons comprendre comment fonctionnent les sous-modules?
Citation de Démarrer avec des sous-modules dans le livre Pro Git
Le référentiel principal suit le sous-module avec son état à un point spécifique , l' ID de validation . Ainsi, lorsque vous mettez à jour des modules, vous mettez à jour l'ID de validation vers un nouveau.
Comment
Si vous souhaitez que le sous-module soit fusionné automatiquement avec la branche distante, utilisez
--merge
ou--rebase
.Tout ce que tu as à faire c'est,
Alias recommandé:
Il existe également une option pour créer
--merge
ou--rebase
comme comportement par défaut degit submodule update
, en définissantsubmodule.$name.update
surmerge
ourebase
.Voici un exemple de configuration du comportement de mise à jour par défaut de la mise à jour du sous-module dans
.gitmodule
.Ou configurez-le en ligne de commande,
Références
git submodule --help
la source
git submodule update --remote --merge
, et il abaisse le sous-module dans un état détaché. Également essayé--rebase
avec le même résultat.cd
dans le sous - module, le sous - module à la caisse une branche spécifique,git checkout master
.git submodule foreach --recursive git checkout master
.git submodule foreach --recursive git checkout master
. Mais comment puis-je empêcher git de toujours les détacher? La définition des options de configuration pour chaque sous - module n'est pas une option!git submodule update --remote --merge
ne laissait pas le sous-module dans un état HEAD détaché, mais l'exécutiongit submodule update
après l'édition de mon.gitmodule
fichier comme vous l'avez indiqué AIT laissé le sous-module dans un état HEAD détaché.J'en ai eu marre qu'il se détache toujours donc j'utilise juste un script shell pour le construire pour tous mes modules. je suppose que tous les sous-modules sont sur le maître: voici le script:
exécutez-le depuis votre module parent
la source
Découvrez ma réponse ici: Sous-modules Git: Spécifiez une branche / une balise
Si vous le souhaitez, vous pouvez ajouter manuellement la ligne "branch = master" dans votre fichier .gitmodules. Lisez le lien pour voir ce que je veux dire.
EDIT: Pour suivre un projet de sous-module existant dans une succursale, suivez les instructions de VonC ici à la place:
Sous-modules Git: spécifiez une branche / une balise
la source
branch = master" line into your .gitmodule
c'est en fait la réponse complète, a résolu ce problème pour moi.L'autre façon de faire en sorte que votre sous-module extrait la branche est d'aller dans le
.gitmodules
fichier dans le dossier racine et d'ajouter le champbranch
dans la configuration du module comme suit:branch = <branch-name-you-want-module-to-checkout>
la source
branch = my_wanted_branch
. Mais le faire fonctionnergit submodule update --remote
vérifie toujours que la tête est détachée.Comme d'autres personnes l'ont dit, la raison pour laquelle cela se produit est que le référentiel parent ne contient qu'une référence (au SHA1 de) un commit spécifique dans le sous-module - il ne sait rien sur les branches. Voici comment cela devrait fonctionner: la branche qui était à ce commit peut avoir avancé (ou reculer), et si le référentiel parent avait référencé la branche, il pourrait facilement se rompre lorsque cela se produit.
Cependant, en particulier si vous développez activement à la fois le repo parent et le sous-module, l'
detached HEAD
état peut être déroutant et potentiellement dangereux. Si vous effectuez des commits dans le sous-module alors qu'il est endetached HEAD
état, ceux-ci deviennent suspendus et vous pouvez facilement perdre votre travail. (Les commits en suspens peuvent généralement être sauvés en utilisantgit reflog
, mais il est préférable de les éviter en premier lieu.)Si vous êtes comme moi, alors la plupart du temps, s'il y a une branche dans le sous-module qui indique que le commit est extrait, vous préférez vérifier cette branche plutôt que d'être dans l'état HEAD détaché au même commit. Vous pouvez le faire en ajoutant l'alias suivant à votre
gitconfig
fichier:Maintenant, après cela, il
git submodule update
vous suffit d'appelergit submodule-checkout-branch
, et tout sous-module qui est extrait à un commit qui a une branche pointant vers lui va extraire cette branche. Si vous n'avez pas souvent plusieurs branches locales pointant toutes vers le même commit, alors cela fera généralement ce que vous voulez; sinon, alors au moins, cela garantira que tous les commits que vous effectuez vont sur une branche réelle au lieu d'être laissés en suspens.De plus, si vous avez configuré git pour mettre à jour automatiquement les sous-modules lors du paiement (en utilisant
git config --global submodule.recurse true
, voir cette réponse ), vous pouvez créer un hook post-checkout qui appelle automatiquement cet alias:Ensuite, vous n'avez pas besoin d'appeler
git submodule update
ougit submodule-checkout-branch
, le simple fait degit checkout
mettre à jour tous les sous-modules avec leurs commits respectifs et de vérifier les branches correspondantes (si elles existent).la source
La solution la plus simple est:
Puis cd dans le répertoire repo et:
Lecture supplémentaire: Bonnes pratiques des sous-modules Git .
la source