advertencia: HEAD remoto se refiere a una referencia inexistente, no se puede pagar

86

Esto parece un error popular por diferentes causas.

Tengo un repositorio de git simple llamado "kiflea.git", lo clono así:

git clone git://kipdola.be/kiflea.git

Entonces git me dice: warning: remote HEAD refers to nonexistent ref, unable to checkout.

Y sí, no hay archivos versionados en el mapa, excepto el directorio .git. De todos modos, lo único que tengo que hacer es:

cd kiflea
git checkout master

Y funciona, todos los archivos están ahí. Pero pensé que la clonación de un repositorio verifica automáticamente el maestro, entonces, ¿qué está pasando exactamente y cómo lo soluciono?

Me he dado cuenta de que, después de hacer el git checkout masterbit, esto se agrega a mi archivo de configuración .git local:

[branch "master"]
    remote = origin
    merge = refs/heads/master

Probablemente sea interesante saber que este repositorio de git solía ser un repositorio de svn en un pasado lejano.

Ps: al navegar por el repositorio simple usando gitweb, claramente hay una masterrama allí: http://kipdola.be/gitweb/?p=kiflea.git;a=summary

skerit
fuente
2
¿Qué git ls-remote originte muestra?
CB Bailey
Es lo mismo antes o después del checkout masterbit:25f600739343a7ce32d6311a1e6140870774810b refs/heads/master
skerit
1
Parece que el repositorio remoto ha perdido (o nunca tuvo) su HEAD. ¿Tiene acceso directo a él? Si es así, vea aquí
CB Bailey
1
Si clona un repositorio y no especifica la rama, intenta usar el cabezal remoto. Como se explica a continuación en las respuestas, no puede influir en qué rama directamente. Sin embargo, al verificar una rama diferente en el momento de la clonación, evita esta verificación. En su caso, parece que existe maestro, pero los puntos remotos de la cabeza en otro lugar, por lo que su uso:git clone -b master <url> <dir>
Eckes

Respuestas:

125

Los warning: remote HEAD refers to nonexistent ref, unable to checkout.medios de que el mando a distancia (desnudo) repositorio contiene referencia rama en el archivo llamado HEADque no coincide con ninguna rama publicado en el mismo repositorio.

Tenga en cuenta que la advertencia solo significa que git no realizó el pago. El repositorio clonado está bien por lo demás. Solo hazlo git branch -apara ver posibles ramas y git checkout the-branch-you-wantsolucionar el problema.

Esto suele suceder porque el contenido predeterminado para ese archivo ( .git/HEADo simple HEADpara repositorios desnudos) es el ref: refs/heads/masterque dice que si alguien va a cloneeste repositorio, debería clonar la rama por defecto refs/heads/master. De forma predeterminada, Git creará una rama local sin el refs/heads/prefijo (es decir, masterde forma predeterminada). Intente git help symbolic-refobtener más información.

El problema con esta situación es que Git no proporciona un método para modificar referencias simbólicas remotas, por lo que puede usar algo que el proveedor de alojamiento de Git haya implementado (por ejemplo, Configuración - Rama predeterminada en GitHub si tiene derechos de administrador) o tiene que usar el nombre de la rama mastercomo la rama predeterminada (porque ese es el valor predeterminado para esa referencia simbólica).

Si tiene acceso de shell a su repositorio de git remoto, puede simplemente cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZdónde XYZestá el nombre de la rama que desea usar de forma predeterminada.

Una forma de solucionar este problema es crear un nuevo repositorio desnudo remoto sin confirmaciones y luego hacer git push name-of-the-remote my-special-branch-namelo que resultará en un repositorio vacío que contenga una sola rama, my-special-branch-namepero la HEADreferencia simbólica aún contiene el valor predeterminado que apunta master. Como resultado, recibirá la advertencia antes mencionada.

Mikko Rantalainen
fuente
20
Tenga en cuenta que la advertencia solo significa que git no funcionó checkout. El repositorio clonado está bien por lo demás. Hazlo git branch -apara ver posibles ramificaciones y git checkout the-branch-you-want"solucionar" el problema.
Mikko Rantalainen
2
Al menos uno puede evitar usar el cabezal remoto al usar git clone -b master(o cualquiera que sea el nombre de la rama existente).
eckes
Hice exactamente lo que escribiste en el último párrafo; Hay archivos en la rama en el repositorio desnudo (dentro de gitlab) pero el clon parece estar vacío. {git branch -a} no muestra nada. {git clone -b my-special-branch-name <url>} tampoco parece funcionar (el extremo remoto colgó).
Ed Randall
Lo "arreglé" copiando refs / remotes / my-special-branch-name en refs / heads y editando HEAD para que coincida (en el repositorio de gitlab). Entonces podría clonar con éxito usando -b my-special-branch-name. Pero, ¿cuál es la forma correcta de configurar el repositorio vacío después del ciclo "init" / "push" para que clone -b no encuentre problemas, por favor?
Ed Randall
1
@EdRandall cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZdonde XYZes el nombre de rama predeterminado que desea utilizar si git clonese hace sin la -bbandera. Si tiene algún otro problema, haga una nueva pregunta en lugar de agregar preguntas como comentarios.
Mikko Rantalainen
10

Tuve el mismo problema porque ya no usaba la masterrama y se perdió en mi repositorio local y remoto.

El repositorio remoto todavía tenía HEADconfigurado master, lo cambié a una de las ramas remotas que realmente uso y todo funciona bien.

Si puede acceder a su repositorio remoto:

  • Vaya a su remote_repo.git;
  • Editar HEADarchivo
  • Cambiar ref: refs/heads/masteraref: refs/heads/your_branch
Marco Bonifazi
fuente
Ambas condiciones son posibles, se eliminó el maestro y el HEAD todavía apunta hacia él o HEAD se cambió a una rama que se eliminó después. Supongo que (dado que el pago del maestro funciona) la segunda opción es nuestro caso. @MarcoBonifazi En ese caso, el "cambio" sería reemplazar broken_branchcon refs/heads/master.
eckes
2
¿Existe una forma "adecuada" de configurar la rama HEAD de esta manera sin tener que editar los archivos?
Ed Randall
@EdRandall cd path/to/bare/git/repo; git symbolic-ref HEAD refs/heads/XYZdonde XYZes el nombre de rama predeterminado que desea usar si git clonese hace sin la -bbandera, como dije en otro comentario.
Mikko Rantalainen
7

Sí, esto está relacionado con su clon de git que intenta verificar una rama diferente a la maestra. Solo haz esto

git clone user@git-server:project_name.git -b branch_name /some/folder

Esto le ayudará a clonar la rama exacta a través de su nombre de rama.

pal4life
fuente
2

A pesar de que se mostró este error, mi proyecto todavía estaba conectado al repositorio correspondiente, ejecuté el git branchcomando y vi las ramas adecuadas, luego ejecuté git checkout *branchnamey BOOM, todo estaba bien.

anuncios web
fuente
Sí, @Mikko explicó cuál es el motivo. Si desea omitir el pago, puede usar la opción -b. (¡Pero es mejor arreglar su repositorio remoto a largo plazo!)
eckes
1

Definitivamente hay algo mal con su repositorio remoto. Es posible que pueda solucionarlo haciendo un nuevo clon del repositorio. También podría funcionar enviar una nueva confirmación a la rama maestra.

Jason Axelson
fuente
Supongo que quiso decir: "git push -u origin HEAD: HEAD" No resolvió nada para mí ...
RzR
1

Supongo que es el líder *en el registro de confirmación lo que de alguna manera engaña al servidor remoto.

Puedo navegar por la interfaz web del repositorio usando algunos de los enlaces del menú, pero otros fallan con un 404 - Unknown commit objecto similar, particularmente desde la página de resumen.

Vea si puede enmendar ese último mensaje de confirmación y luego forzar la actualización para ver si eso lo soluciona. Puede haber un error en el demonio del servidor. Si lo soluciona, valdría la pena informar en la lista de git [email protected] (solo mensajes de texto sin formato)

Philip Oakley
fuente
1

Tuve el mismo problema al crear un repositorio básico.

Lo resolví simplemente clonando el repositorio, creando una rama maestra local y luego empujando el maestro al repositorio remoto.

1) clonar el repositorio

$ git.exe clone --progress -v "the remote path" "my local path"

2) cree una rama maestra localmente.

   $ git checkout -b master

3) cometer algo en la sucursal local

$ git add readme.md 
$ git commit –m “Added readme”

4) Empuje maestro local en el control remoto

   $ git push origin master
Corrado
fuente
0

Si no hay una rama maestra realmente disponible, verifique lo siguiente; Si hay un archivo llamado 'pack-refs' dentro de la carpeta '.git', ábralo y podrá encontrar todas las referencias en la lista.

Algo como a continuación;

# pack-refs with: peeled fully-peeled 
e7cc58650190bd28599d81917f1706445d3c6d8b refs/tags/afw-test-harness-1.5
^cfae4f034e82591afdf4e5ed72279297d0eee618
6afe1bcfa4bd74de8e0c8f64d024e1cc289206df refs/tags/afw-test-harness-2.1
^c32f7fa495d4b44652f46c065fcd19c3acd237a6
72f2e4284dfbf27c82967da096c6664646bbdd19 refs/tags/android-1.6_r1
^50992e805e758e2231f28ec2127b57a1a9fd0ddc
0cbd528cad1cee9556098b62add993fc3b5dcc33 refs/tags/android-1.6_r1.1

Entonces usa;

git checkout refs/tags/xxxx

O

git checkout 'HASH value'

para verificar la versión requerida. Gracias.

Samantha
fuente
0

Parecía arreglarlo con:

git checkout -b  master
git push

Esto creó el maestro predeterminado, y luego pude verificar mis otras ramas

Brendan
fuente
0

En mi caso, el repositorio estaba vacío.

git checkout --orphan master

git add some_file
git commit -m 'init'
git push origin master 
László Tóth
fuente
0

Para Gitlab, incluso si muestra que estás en una rama predeterminada (por ejemplo, masteres posible que no estés en ella), configurándolo de nuevo, arréglalo, así:

  1. Cree una nueva rama, tal vez asd
  2. configuración> repositorio> Rama predeterminada, que muestra que la rama predeterminada es master
  3. Ponlo en asd
  4. Vuelve a ponerlo en master
  5. Eliminar asdrama

Listo, ahora tu rama predeterminada es master

Ng Sek Long
fuente