Pourquoi mon sous-module GIT HEAD est-il détaché du maître?

J’utilise des sous-modules GIT. Après avoir extrait les modifications du serveur, ma tête de sous-module s’est souvent détachée de la twig principale.

Pourquoi ça arrive?

Je dois toujours faire:

git branch git checkout master 

Comment puis-je m’assurer que mon sous-module pointe toujours vers la twig principale?

Merci beaucoup

Personnellement, je déteste les réponses directes aux liens externes qui peuvent cesser de fonctionner avec le temps et vérifier ma réponse ici (à moins que la question soit en double) – orienter la question qui couvre le sujet entre les lignes du sujet ne répondant pas, lisez la documentation. ”

Donc, revenons à la question: pourquoi cela se produit-il?

Situation que vous avez décrite

Après avoir extrait les modifications du serveur, ma tête de sous-module s’est souvent détachée de la twig principale.

C’est un cas courant lorsque l’on n’utilise pas trop souvent de sous-modules ou que l’on vient de démarrer avec des sous-modules . Je crois que j’ai raison de dire que nous avons tous été là à un moment ou la tête de notre sousmodule s’est détachée.

  • Cause: Votre sous-module ne suit aucune twig ou Solution: assurez-vous que votre sous-module suit la bonne twig
 $ cd  # if the master branch already exists locally: # (From git docs - branch) # -u  # --set-upstream-to= # Set up 's tracking information so  # is considered 's upstream branch. # If no  is specified, then it defaults to the current branch. $ git branch -u /  # else: $ git checkout -b  --track / 
  • Cause: Votre repository parent n’est pas configuré pour suivre la twig des sous-modules. Solution: Faites en sorte que votre sous-module suive sa twig distante en ajoutant de nouveaux sous-modules avec les deux commandes suivantes.
    • D’abord, vous indiquez à git de suivre votre distante.
    • Deuxièmement, vous dites à Git de mettre à jour votre sous-module à distance.
  $ git submodule add -b   [] $ git submodule update --remote 
  • Si vous n’avez pas ajouté votre sous-module existant, vous pouvez facilement résoudre ce problème:
    • Tout d’abord, vous voulez vous assurer que votre sous-module a la twig que vous voulez suivre.
  $ cd  $ git checkout  $ cd  #  is here path releative to parent repo root # without starting path separator $ git config -f .gitmodules submodule..branch  

Cependant, même si vous avez configuré votre sous-module pour suivre la twig correcte, vous pouvez toujours vous retrouver dans des situations où votre sous-module se HEAD detached at

Dans les cas les plus courants, vous avez déjà corrigé votre DETACHED HEAD, car il était lié à l’un des problèmes de configuration ci-dessus. Mais souvenez-vous que votre repository parent ne gère plus l’état de votre sous-module (en utilisant un hachage de validation commis dans le référentiel parent), car votre sous-module suit sa propre twig distante, ce qui ouvre de nouvelles possibilités d’échec.

Exécutez $ git status dans votre parent et dans le chemin du sous-module pour vérifier que tout est correctement suivi et que tout est à jour, puis exécutez $ cd et git submodule update --remote . Comme vous le voyez, si vous lancez git status à nouveau, tout va bien pour le moment.

Pour démontrer que lorsque tout semble être correctement configuré et que vous ne vous attendez pas à recevoir DETACHED HEAD, les choses peuvent mal tourner, voyons ceci:

 $ cd  # and make modification to your submodule $ git add . $ git commit -m"Your modification" # Let's say you forgot to push it to remote. $ cd  $ git status # you will get Your branch is up-to-date with '/'. Changes not staged for commit: modified: path/to/submodule (new commits) # As normally you would commit new commit hash to your parent repo $ git add -A $ git commit -m"Updated submodule" $ git push  . $ git status Your branch is up-to-date with '/'. nothing to commit, working directory clean # If you now update your submodule $ git submodule update --remote Submodule path 'path/to/submodule': checked out 'commit-hash' $ git status # will show again that (submodule has new commits) $ cd  $ git status HEAD detached at  # as you see you are DETACHED and you are lucky if you found out now # since at this point you just asked git to update your submodule # from remote master which is 1 commit behind your local branch # since you did not push you submodule chage commit to remote. # Here you can fix it simply by. (in submodules path) $ git checkout  $ git push / # which will fix the states for both submodule and parent since # you told already parent repo which is the submodules commit hash # to track so you don't see it anymore as untracked. 

Mais si vous avez déjà apporté des modifications au sous-module et que vous les avez commises, les avez repoussées à distance puis, lorsque vous avez exécuté la commande «Git Checkout», Git vous en informe:

 $ git checkout  Warning: you are leaving 1 commit behind, not connected to any of your twigs: If you want to keep it by creating a new branch, this may be a good time to do so with: 

L’option recommandée pour créer une twig temporaire peut être bonne, puis vous pouvez simplement fusionner ces twigs, etc. Cependant, personnellement, j’utiliserais simplement git cherry-pick dans ce cas.

 $ git cherry-pick  # hash which git showed you related to DETACHED HEAD # if you get 'error: could not apply...' run mergetool and fix conflicts $ git mergetool $ git status # since your modifications are staged just remove untracked junk files $ rm -rf  $ git commit # without arguments # which should open for you commit message from DETACHED HEAD # just save it or modify the message. $ git push   $ cd  $ git add -A # or just the unstaged submodule $ git commit -m"Updated " $ git push   

Bien qu’il y ait d’autres cas où vous pouvez placer vos sous-modules dans l’état DETACHED HEAD, j’espère que vous comprenez maintenant un peu plus comment déboguer votre cas particulier.

Découvrez ma réponse ici: Sous-modules Git: spécifiez une twig / tag

Si vous le souhaitez, vous pouvez append la ligne “branch = master” dans votre fichier .gitmodules manuellement. Lisez le lien pour voir ce que je veux dire.

EDIT: Pour suivre un projet de sous-module existant dans une twig, suivez plutôt les instructions de VonC:

Sous-modules Git: spécifiez une twig / une étiquette

Je me suis fatigué de toujours le détacher, donc j’utilise 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:

 #!/bin/bash echo "Good Day Friend, building all submodules while checking out from MASTER branch." git submodule update git submodule foreach git checkout master git submodule foreach git pull origin master 

l’exécuter à partir de votre module parent

L’autre façon de faire en sorte que votre sous-module extrait la twig est de .gitmodules fichier .gitmodules dans le dossier racine et d’append la branch champ dans la configuration du module comme suit:

branch =