tag - Cómo agregar origen faltante/HEAD en git repo
git tag best practices (1)
Tengo un git repo de trabajo. Sin embargo, echo de menos los remotes/origin/HEAD -> origin/master
al escribir git branch -a
. ¿Por qué falta el HEAD y cómo puedo agregar el HEAD que falta a mi repositorio?
Respuesta original:
La HEAD
del origen solo se obtiene cuando clonas el repositorio. Si de otro modo agrega el control remoto (por ejemplo, al usar git remote add
o al cambiar el nombre de otro control remoto existente), esta referencia no existirá, porque no hay razón para tenerlo.
Los repositorios remotos deben ser repositorios vacíos en la mayoría de los casos, y en repositorios pelados HEAD
simplemente apunta a la rama "predeterminada". Esto solo es relevante al mismo tiempo: cuando se clona. Por lo tanto, después de la clonación, cualquier HEAD
remoto ya no es importante para su clon y Git no obtendrá esa referencia de ningún control remoto.
Como lo solicitó el usuario lesmana , volví a mirar esto para encontrar más información:
"¿Cómo eliminar el origin/HEAD
?"
No tienes que hacer esto.
La referencia no influye en la forma en que funciona su repo, y una referencia es literalmente solo un pequeño archivo de texto en su sistema de archivos, por lo que no ocupa casi espacio (solo unos pocos bytes).
Si todavía quieres eliminarlo, puedes usar
git update-ref -d refs/remotes/origin/HEAD
(Si desea eliminar un HEAD remoto que no está en el origin
, use el nombre del remoto respectivo).
"¿Cómo crear origin/HEAD
?"
Como se señaló anteriormente, una referencia HEAD remota solo se usa para la clonación, y Git nunca la requiere más adelante. A menos que lo use manualmente (lo que no parece muy útil, solo puede usar la rama a la que apunta), no hay razón para crearlo manualmente.
Sin embargo, si es absolutamente necesario, puede utilizar
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/master
"¿Por qué un HEAD remoto no se elimina automáticamente por clonación si realmente es inútil?"
No hay una razón específica, por lo que puedo decir, aparte de informar al usuario explícitamente de qué rama se considera la rama predeterminada en el repositorio remoto clonado. Sin embargo, como mencioné anteriormente, su existencia no causa problemas y casi no ocupa espacio, por lo que no hay una razón real para eliminarlo.
Para obtener más detalles, no dude en preguntar a los desarrolladores de Git directamente en la lista de correo de Git :)
"¿Cuál es la razón exacta por la que el clon lo necesita?"
Ninguna de las páginas del manual explica directamente que git clone
siempre usa esto, pero encuentra menciones de lado en algunos lugares.
Por ejemplo, el man git clone
dice:
--branch <name>
-b <name>
En lugar de señalar la HEAD recién creada a la rama a la que apunta HEAD del repositorio clonado, apunte a la rama
<name>
lugar. [...]
y
--[no-]single-branch
Clone solo el historial que lleva a la punta de una sola rama, ya sea especificado por la opción
--branch
o los puntos HEAD del control remoto de la rama principal en. [...]
Además, man gitrepository-layout
dice:
HEAD
[...] No significa mucho si el repositorio no está asociado con ningún árbol de trabajo (es decir, un repositorio simple), pero un repositorio Git válido debe tener el archivo
HEAD
; algunas porcelanas pueden usarlo para adivinar la rama "predeterminada" designada del repositorio (generalmente maestra ).
Esto significa que
- a) el propio repositorio remoto debe tener la referencia HEAD (para que sea válido), aunque no es importante desde el punto de vista semántico (aparte de señalar la rama predeterminada)
- b)
git clone
utiliza la referencia HEAD del repositorio remoto para determinar dónde apuntar laHEAD
local (a menos que especifique una anulación con--branch
). Para trabajar con esa referencia, debe crearla localmente (por lo tanto,origin/HEAD
). Como se mencionó anteriormente, entonces simplemente no se elimina.