Estoy usando submódulos Git. Después de extraer los cambios del servidor, muchas veces la cabeza de mi submódulo se separa de la rama maestra.
¿Por que sucede?
Tengo que hacer siempre:
git branch
git checkout master
¿Cómo puedo asegurarme de que mi submódulo siempre apunte a la rama maestra?
git
git-submodules
om471987
fuente
fuente
Respuestas:
EDITAR:
Ver @Simba Answer para una solución válida
ANTIGUA RESPUESTA:
Personalmente, odio las respuestas aquí que dirigen a enlaces externos que pueden dejar de funcionar con el tiempo y compruebo mi respuesta aquí (a menos que la pregunta sea duplicada) : dirigir a la pregunta que cubre el tema entre las líneas de otro tema, pero en general es igual a: "Estoy sin contestar, lea la documentación ".
Volviendo a la pregunta: ¿por qué sucede?
Situación que describiste
Este es un caso común cuando uno no usa submódulos con demasiada frecuencia o acaba de comenzar con submódulos . Creo que estoy en lo correcto al afirmar que todos hemos estado allí en algún momento donde la CABEZA de nuestro submódulo se separa.
Solución: asegúrese de que su submódulo rastrea la rama correcta
Solución: Haga que su submódulo rastree su rama remota agregando nuevos submódulos con los siguientes dos comandos.
<branch>
.En los casos comunes, ya ha reparado su CABEZA DESCONECTADA ya que estaba relacionada con uno de los problemas de configuración anteriores.
Fijación de la cabeza separada cuando
.update = checkout
Pero si logró realizar algunos cambios localmente para el submódulo y se comprometió, los empujó al control remoto y luego cuando ejecutó 'git checkout', Git le notifica:
La opción recomendada para crear una rama temporal puede ser buena, y luego puede fusionar estas ramas, etc. Sin embargo, personalmente lo usaría solo
git cherry-pick <hash>
en este caso.Aunque hay algunos casos más en los que puede poner sus submódulos en el estado HEAD DETACHED, espero que ahora entienda un poco más cómo depurar su caso particular.
fuente
git submodule update --remote
. Eche un vistazo a la respuesta de Simba, creo que esa debería ser la respuesta correcta.Adición de una
branch
opción en la.gitmodule
que se NO relacionado con el comportamiento individual de los submódulos en absoluto. La antigua respuesta de @mkungla es incorrecta u obsoleta.De
git submodule --help
, HEAD detached es el comportamiento predeterminado degit submodule update --remote
.Primero, no hay necesidad de especificar una rama para rastrear .
origin/master
es la rama predeterminada que se debe rastrear.Por qué
Entonces, ¿por qué se desprende HEAD después
update
? Esto es causado por el módulo de comportamiento de actualización predeterminado:checkout
.Para explicar este extraño comportamiento de actualización, debemos entender cómo funcionan los submódulos.
Cita de Comenzando con submódulos en el libro Pro Git
El repositorio principal rastrea el submódulo con su estado en un punto específico , el id de confirmación . Entonces, cuando actualiza los módulos, está actualizando la identificación de confirmación a una nueva.
Cómo
Si desea que el submódulo se fusione con la rama remota automáticamente, use
--merge
o--rebase
.Todo lo que necesitas hacer es
Alias recomendado:
También hay una opción para hacer
--merge
o--rebase
como el comportamiento predeterminado degit submodule update
, mediante la configuraciónsubmodule.$name.update
demerge
orebase
.Aquí hay un ejemplo sobre cómo configurar el comportamiento de actualización predeterminado de la actualización de submódulos en
.gitmodule
.O configurarlo en la línea de comando,
Referencias
git submodule --help
fuente
git submodule update --remote --merge
, y tira hacia abajo el submódulo en un estado separado. También probé--rebase
con el mismo resultado.cd
en el submódulo, pago y envío el submódulo a una rama específica con,git checkout master
.git submodule foreach --recursive git checkout master
.git submodule foreach --recursive git checkout master
. Pero, ¿cómo puedo evitar que git los separe siempre? ¡Establecer opciones de configuración para cada submódulo no es una opción!git submodule update --remote --merge
no dejó el submódulo en un estado HEAD separado, sino que se ejecutógit submodule update
después de editar mi.gitmodule
archivo, ya que indicó que sí dejó el submódulo en un estado HEAD separado.Me cansé de que siempre se separe, así que solo uso un script de shell para construirlo para todos mis módulos. Supongo que todos los submódulos están en master: aquí está el script:
ejecutarlo desde su módulo padre
fuente
Mira mi respuesta aquí: submódulos Git: especifica una rama / etiqueta
Si lo desea, puede agregar la línea "branch = master" en su archivo .gitmodules manualmente. Lea el enlace para ver a qué me refiero.
EDITAR: para realizar un seguimiento de un proyecto de submódulo existente en una sucursal, siga las instrucciones de VonC aquí:
Submódulos Git: especifique una rama / etiqueta
fuente
branch = master" line into your .gitmodule
que de hecho es la respuesta completa, resolvió ese problema para mí.La otra forma de hacer que su submódulo revise la rama es ir al
.gitmodules
archivo en la carpeta raíz y agregar el campobranch
en la configuración del módulo de la siguiente manera:branch = <branch-name-you-want-module-to-checkout>
fuente
branch = my_wanted_branch
. Pero ejecutarlogit submodule update --remote
todavía se verifica como cabeza separada.Como han dicho otras personas, la razón por la que esto sucede es que el repositorio principal solo contiene una referencia a (el SHA1 de) una confirmación específica en el submódulo; no sabe nada acerca de las ramas. Así es como debería funcionar: la rama que estaba en esa confirmación puede haberse movido hacia adelante (o hacia atrás), y si el repositorio principal ha hecho referencia a la rama, entonces podría romperse fácilmente cuando eso suceda.
Sin embargo, especialmente si se está desarrollando activamente tanto en el repositorio principal como en el submódulo, el
detached HEAD
estado puede ser confuso y potencialmente peligroso. Si realiza confirmaciones en el submódulo mientras está endetached HEAD
estado, estas se vuelven colgantes y puede perder fácilmente su trabajo. (Los commits colgantes generalmente se pueden rescatar usandogit reflog
, pero es mucho mejor evitarlos en primer lugar).Si eres como yo, la mayoría de las veces si hay una rama en el submódulo que apunta a que se confirme la confirmación, preferirías verificar esa rama que estar en estado HEAD separado en la misma confirmación. Puede hacer esto agregando el siguiente alias a su
gitconfig
archivo:Ahora, después de hacerlo
git submodule update
, solo tiene que llamargit submodule-checkout-branch
, y cualquier submódulo que se desproteja en una confirmación que tenga una rama apuntando a ella, desprotegerá esa rama. Si a menudo no tiene varias sucursales locales que apuntan a la misma confirmación, esto generalmente hará lo que desee; si no, entonces al menos se asegurará de que cualquier confirmación que realice vaya a una rama real en lugar de quedar colgando.Además, si ha configurado git para actualizar automáticamente los submódulos al finalizar la compra (usando
git config --global submodule.recurse true
, vea esta respuesta ), puede hacer un enlace posterior a la finalización de la compra que llame a este alias automáticamente:Entonces no necesita llamar a ninguno de los dos ,
git submodule update
ogit submodule-checkout-branch
simplementegit checkout
actualizará todos los submódulos a sus respectivas confirmaciones y verificará las ramas correspondientes (si existen).fuente
La solución más simple es:
Luego cd en el directorio repo y:
Lectura adicional: mejores prácticas de submódulos de Git .
fuente