Desde git submodule --help
, HEAD détaché est le comportement par défaut de git submodule update --remote
. Cela n'a rien à voir avec la branche qui est suivie dans un sous-module.
Pour ceux qui ne veulent qu'une solution, passez directement à la 2ème partie.
Raison
Nous devons comprendre ce qu'est un sous-module.
Le sous-module est un moyen d'inclure un autre projet dans votre projet actuel. Il ne s'agit pas vraiment d'ajouter ces fichiers dans l'historique de commit de votre projet principal, mais en référençant un instantané (commit) du sous-module.
Citation de Commencer avec les sous-modules section du livre Pro Git
Bien que sbmodule DbConnector
est un sous-répertoire de votre répertoire de travail, Git le voit comme un sous-module et ne suit pas son contenu lorsque vous n'êtes pas dans ce répertoire. A la place, Git le voit comme un un commit particulier de ce référentiel .
Chaque commit d'un repo est un instantané/état de votre code à ce moment-là. L'état du sous-module à ce moment-là doit être déterministe aussi. Vous ne pouvez pas dire que dans ce commit, j'inclus la branche master (ou autre) d'un autre repo. Vous devez spécifier l'état d'un sous-module par un id de commit .
Inclure un autre dépôt en tant que sous-module est essentiellement
git clone uri://another-repo path/to/submodule
cd path/to/submodule
git checkout <commit-id>
# git submodule system will add the reference commit id but not the files
Quand quelqu'un utilise votre repo avec un submodule, il clonera le submodule et checkout
le commit spécifié aussi.
Et la vérification d'un commit résulte HEAD détaché. Pourquoi mon repo Git est-il entré dans un état HEAD détaché ?
Solution
Si vous voulez que le sous-module soit fusionné avec la branche distante automatiquement, utilisez --merge
o --rebase
.
man git-submodule
--merge
Cette option est uniquement valable pour la mise à jour commande. Fusionne le commit enregistré dans le superprojet dans la branche courante du sous-module. Si cette option est donnée, le HEAD du sous-module sera ne pas être détaché .
--rebase
Rebase la branche courante sur le commit enregistré dans le superprojet. Si cette option est donnée, le HEAD du sous-module sera ne pas être détaché .
Si votre sous-module a déjà été détaché, corrigez l'état détaché avant d'utiliser les deux solutions suivantes.
cd path/to/submodule
# Assuming you're tracking the 'master' in the submodule
git checkout master
Solution 1 : Utilisez les options dans la ligne de commande
# cd back to project root
git submodule update --remote --merge
# or
git submodule update --remote --rebase
Alias recommandés :
git config alias.supdate 'submodule update --remote --merge'
# do submodule update with
git supdate
Solution 2 : Ajouter des options dans le fichier de configuration
Une autre solution consiste à modifier le comportement de mise à jour du sous-module dans le fichier gitmodule
par en fixant submodule.$name.update
a merge
o rebase
. En gros, cela signifie que vous pouvez faire git submodule update --remote
sans passer --merge
o --rebase
explcitly, mais lue depuis le fichier de configuration automatiquement.
Voici un exemple de la façon de configurer le comportement de mise à jour par défaut du submodule update en .gitmodule
.
[submodule "bash/plugins/dircolors-solarized"]
path = bash/plugins/dircolors-solarized
url = https://github.com/seebi/dircolors-solarized.git
update = merge # <-- this is what you need to add
Ou le configurer par la ligne de commande,
# replace $name with a real submodule name
git config -f .gitmodules submodule.$name.update merge
Autres
Ajout d'un branch
option dans .gitmodule
n'est PAS du tout liée au comportement détaché des submodules. L'ancienne réponse de mkungla est incorrecte, ou obsolète.
Disons clairement qu'il y a il n'est pas nécessaire de spécifier une branche à suivre . origin/master
est la branche par défaut à suivre.
-- distant
Au lieu d'utiliser le SHA-1 enregistré du superprojet pour mettre à jour le sous-module, utilisez l'état de la branche de suivi à distance du sous-module. Le distant utilisé est le distant de la branche ( branch.<name>.remote
), par défaut origin
. La branche distante utilisée est par défaut master
.
Références