2011-08-10 18 views
7

He usado git por bastante tiempo pero me he mantenido alejado de los submódulos ya que no tenía una buena razón para usarlos. Sin embargo, recientemente comencé un proyecto que claramente necesita usar esta característica de git.Git actualiza el submódulo con una rama unmed

Sin embargo, cada vez que clono todo el proyecto, el submódulo termina en una rama sin nombre. Estos son los comandos que ejecutar:

git clone <url to project> 
git submodule update --init <submodule> 
cd <submodule>; git branch 

y imprime:

* (no branch) 
    master 

tengo que hacer un adicional

git checkout master 

Ahora mi pregunta es: ¿es éste el comportamiento estándar? Si no, ¿puedes ayudarme a entender lo que estoy haciendo mal?

Gracias

Respuesta

5

A diferencia de algunos otros SCM, se compromete en Git no pertenecen intrínsecamente a cualquier rama particular. Un encabezado de rama es como un marcador para una confirmación. Cuando tiene una rama desprotegida (es decir, el archivo .git/HEAD contiene una referencia a la sucursal), y realiza una confirmación, Git mueve ese marcador hacia adelante para señalar la nueva confirmación.

Pero este comportamiento de seguimiento no se aplica aquí. Como ya sabrá, un submódulo está anclado a una confirmación en particular; no rastrea un jefe de rama. Cuando actualiza un submódulo, Git comprueba ese compromiso particular solamente. Eso significa que .git/HEAD contiene el hash de confirmación, no una referencia de rama.

Puede haber una o más cabezas de ramificación que apuntan a este compromiso, pero eso es algo irrelevante. Solo cuando HEAD contiene una referencia de rama, no un hash de confirmación, mostrará git branch que está en una rama.

+0

Gracias! En realidad, no sabía que los submódulos estaban anclados a un compromiso específico y ahora que lo has explicado, tiene mucho sentido. – Fred

+0

¿Hay alguna manera de hacer que este 'maestro de pago de git' ocurra automáticamente? Me ha causado horas de frustración, y no veo una razón para no hacer que se compruebe master por defecto. –

+0

¡También me he sentido frustrado por este comportamiento 'git'! ¿Cómo no podemos usar 'git checkout ' desde el principio? –

Cuestiones relacionadas