example - ¿Qué determina la rama predeterminada después de "git clone"?
git clone ssh (3)
A partir de Git 1.8.5 , el servidor enviará el nombre real de la rama a la que apunta HEAD
, en la capacidad "symref". Si tiene un cliente y un servidor más nuevos que Git 1.8.5, actualizará HEAD
correctamente .
Antes de eso, el cliente adivinará a qué se habrá referido HEAD al comparar el ID del objeto al que HEAD (en última instancia) apunta con todos los ID de objetos de todas las ramas. Prefiere una rama llamada refs/heads/master
: si tanto HEAD
como master
apuntan a la misma ID de objeto, clone establecerá la rama predeterminada en el nuevo repositorio en la master
.
De lo contrario, la primera rama con un OID coincidente (cuando las ramas se ordenan alfanuméricamente) será la rama predeterminada. Si no hay ramas que coincidan con los OID, entonces HEAD
se establecerá directamente en la ID del objeto (es decir, un HEAD separado).
Según entiendo, la rama predeterminada de un repositorio clonado debe ser lo que HEAD señale en el repositorio que se clona.
Ahora tengo un caso donde esto no es verdad. Mi comprensión es obviamente defectuosa, entonces, ¿qué determina la rama de pago predeterminada al clonar un repositorio (al descubierto)?
La última confirmación en ese repositorio fue una combinación entre la rama a la que se hace referencia en el encabezado de la sección de repositorio simple en la rama que obtengo como la rama de pago y envío en el clon.
Ejecutando git remote show origin
devuelve el git remote show origin
:
Fetch URL: ...
Push URL: ...
HEAD branch (remote HEAD is ambiguous, may be one of the following):
<bad-branch>
live
Remote branches:
...
Bare repo utiliza Git versión 1.8.2.1, el cliente usa 1.7.12.4, el transporte es SSH.
Tal vez la respuesta es en realidad esta aquí . Esta respuesta lo confirma. Si hay una selección de referencias simbólicas que apuntan a la misma revisión que HEAD, el cliente adivinará qué rama usar.
En realidad es lo que apunta HEAD. Utilice git symbolic-ref HEAD refs/heads/mybranch
para configurar HEAD. (fuente: http://feeding.cloud.geek.nz/posts/setting-default-git-branch-in-bare/ )
Un repositorio desnudo tiene una HEAD
también. Eso es lo que obtienes cuando lo clonas.
De la documentación de git clone
:
Clona un repositorio en un directorio recién creado, crea ramas de seguimiento remoto para cada rama en el repositorio clonado (visible usando la
git branch -r
), y crea y verifica una rama inicial que se bifurca de la rama actualmente activa del repositorio clonado.
El bit sobre "rama actualmente activa" se refiere a la revisión HEAD
del control remoto.
Si quieres un comportamiento diferente, puedes usar --branch
o -b
:
--branch <name>
-b <name>
En lugar de señalar laHEAD
recién creada a la rama señalada porHEAD
del repositorio clonado, apunte a la rama<name>
lugar. En un repositorio no desnudo, esta es la rama que se controlará.--branch
también puede tomar etiquetas y separa elHEAD
en ese commit en el repositorio resultante.