Repositorio de Git roto después de que la computadora murió

94

Mi computadora se apagó y ahora uno de mis repositorios de git está roto. Cuando trato de pagar master, me dice:

warning: ignoring broken ref refs/heads/master.
error: Your local changes to the following files would be overwritten by checkout:
        com.vainolo.jdraw2d.releng.p2/pom.xml
Please, commit your changes or stash them before you can switch branches.
Aborting

Cuando ejecuto git stashobtengo:

fatal: bad revision 'HEAD'
fatal: bad revision 'HEAD'
fatal: Needed a single revision
You do not have the initial commit yet

¿Entonces Que puedo hacer?

Actualizar salida de git reflog:

fatal: bad default revision 'HEAD'

No muy prometedor ... Resultado de git fsck:

error: Invalid HEAD
Checking object directories: 100% (256/256), done.
error: unable to unpack 59551f96b4e87a1c14293c19eb548ce6fa1f196f header
error: inflateEnd: stream consistency error (no message)
fatal: loose object 59551f96b4e87a1c14293c19eb548ce6fa1f196f (stored in .git/objects/59/551f96b4e87a1c14293c19eb548ce6fa1f196f) is corrupt
vainolo
fuente
¿Puede comprobar si .git/refs/heads/masterexiste y si su contenido es un hash de confirmación válido de su repositorio (puede comprobarlo, por ejemplo, usando git show <hash>)?
Empuje el
Sé que esto es obvio, pero sigo preguntando: ¿tiene algún repositorio remoto del mismo repositorio de git?
Tuxdude
@poke el contenido de .git/refs/heads/master/son un montón de^@
vainolo
@Tuxdude sí, pero no actualizado a mis últimos cambios
vainolo
1
¿Qué git reflogte dice? ¿Has probado a correr git fsck?
kynan

Respuestas:

173

Logré recuperarme a través de:

rm .git/refs/remotes/origin/HEAD
git fetch --all
jfrumar
fuente
En mi caso, sucedió porque eliminé algunas ramas locales y remotas (de alguna manera, el archivo .git / refs / remotes / origin / HEAD permaneció en un estado inconsistente). Cambiar el contenido del archivo mencionado anteriormente para que apunte a una rama local existente (por ejemplo, ref: refs / remotes / origin / master) resolvió este problema. Aún así, el enfoque anterior podría ser mejor ya que HEAD podría apuntar a una confirmación que no está en la rama actual.
crissdev
En caso de que el problema le ocurra a un submódulo de git específico, el primer comando cambia ligeramente arm <root repository path>/.git/modules/<path to the submodule>/refs/remotes/origin/HEAD
Gobe
1
Tenía que hacerlo rm -rf .git/refs/remotes/origin, pero me
indicaste la
23

Comience siguiendo los pasos sugeridos en Recuperación del repositorio de git roto :

  • comprobar si .git/refstodavía contiene algo útil
  • verificar git reflogy en su defecto que el contenido de .git/logs/refs/heads/mastero cualquier rama en la que estuviste por última vez
  • correr git fsck, potencialmente con --unreachableo--lost-found

Con suerte, esto le permitirá averiguar cuál masterdebería ser la referencia para que pueda restaurarla (es decir, colocar el SHA1 correcto .git/refs/heads/master).

En caso de que cualquier objeto contenido en esa confirmación esté realmente dañado, HEADlamentablemente no podrá restaurar su confirmación. Suponiendo que su árbol de trabajo y / o índice están intactos, puede intentar git reset --soft(o en su defecto a git reset) la confirmación anterior y luego volver a realizar la confirmación. Evite cualquier operación que cambie su árbol de trabajo sa git checkout -fo git reset --hard.

kynan
fuente
Miré .git/logs/refs/heads/mybranch. Muestra algún tipo de historial de confirmaciones en esta rama. Indagando en eso, elegí SHA y traté de mostrarlos con git show. (Cada confirmación tiene dos SHA, elegí el segundo, justo antes del nombre del autor). El último estaba dañado, pero el anterior podría ser git showny pude presionarlo con git push origin abcdef:mybranch.
Ed Avis
12

Tuve un problema similar después de una pantalla azul de la muerte en Windows 8.1

Tenía un archivo en esta ubicación ...

C:\www\<project>\.git\refs\remotes\origin\<problem-branch>

Y estaba vacío mientras que los otros archivos de rama en esta carpeta tienen cadenas largas dentro de ellos.

NB no tuve ningún cambio / confirmación

  • Hice una copia de seguridad del <problem-branch>archivo
  • Eliminado el archivo
  • git fetch --all para conseguir la rama de nuevo

Luego, la pestaña de autocompletar comenzó a funcionar nuevamente

Carlton
fuente
6

Si no hay muchos archivos modificados, creo que la forma conveniente de resolver este problema es:

  1. haga una copia de seguridad de los archivos que modificó en el repositorio
  2. eliminar su repositorio existente
  3. volver a clonarlo desde el servidor
  4. pegue los archivos del paso 1 en el repositorio y git commit -a
alsotang
fuente
sí, a nadie se le ocurrió volver a clonar. gran sugerencia
Selman Genç
5

Logré resolver esto eliminando el archivo maestro en el directorio git \ refs \ heads

Manos Gaitanakis
fuente
Esto ayudó, eliminó la rama de mi lista en intellij y la comprobé como una nueva rama. Afortunadamente, había impulsado mis cambios para que estuvieran todos ahí.
OAM
4

Después de una congelación computarizada y accidente, mi git branch fue dañado con el mensaje: git fatal: your current branch appears to be broken. No podría hacer nada.

Después de hacerlo, git fsckmencioné que la rama tenía un error: Invalid HEAD. refs/heads/<branch>tenía un invalid sha1 pointer.

Después de seguir las opciones aquí, abrí .git/refs/heads/<branch>en un editor de notepad ++, y cada uno de los caracteres sha1 era NUL.

Afortunadamente, solo necesitaba restablecer la rama al estado remoto, y eso estaba en un repositorio de bitbucket. Cogí el sha1 de la punta del repositorio remoto y lo copié en el .git/refs/heads/<branch>guardado, luego hice un git reset --hard HEAD, y todo volvió a la normalidad.

j4v1
fuente
2

Fui lo suficientemente idiota como para olvidar presionar y mi computadora se bloqueó mientras realizaba una confirmación. Sin embargo, pude recuperar todo menos el último compromiso abriendo .git / logs / refs / heads /

Este archivo contiene todas las confirmaciones (con sus SHA) a la rama, lo que hice para recuperar fue:

  • Hacer una copia de seguridad de los últimos cambios en una carpeta temporal
  • pasar a una "pizarra limpia"
    • git checkout master
    • git reset --hard
  • revisa la penúltima confirmación en el registro
  • crea una rama de esta cabeza separada
  • EMPUJAR
  • Restaurar los últimos cambios
  • Comprometerse de nuevo

Entonces, incluso cuando comete un error tonto, no se verá atraído inmediatamente por un día completo de trabajo con git :)

Markus Palcer
fuente
1

Sé que es una respuesta demasiado tarde, pero recibí este error porque no tenía un origin/head. Puede averiguarlo ejecutando git branch -r. Si no ve que origin/headapunta a un origen remoto, puede configurarlo ejecutando git remote set-head origin {{your branch name}}.

Ahora ejecute de git branch -rnuevo, y debería ver algo como esto: origin/HEAD -> origin/develop

Espero que esto ayude a cualquier otra persona que se encuentre con este problema.

Aaronwbrown
fuente
1

No pude pagar mi rama maestra debido al error de no se puede bloquear la referencia. Terminé borrando: .git/refs/remotes/origin/HEAD .git/refs/remotes/origin/master

y llamando a este comando git:

git fetch --all
Keon Sadatian
fuente
1

Perdóname si repetiría después de alguien (no he leído todos los comentarios). En mi opinión, la forma más sencilla de resolver el problema es copiar el proyecto sin .git y .idea, limpiarlo, clonar desde git, eliminar todo excepto los directorios anteriores y luego pegar la copia anterior en el repositorio recién creado con .git y .idea . Espero que tenga sentido.

Andrey Sulay
fuente
1

Mi computadora falló dos veces y, como resultado, mi repositorio de git se rompió localmente. No pude extraer mis cambios, me pidió establecer un origen remoto pero no funcionó en gitKraken.

En mi símbolo del sistema, recibía este error ingrese la descripción de la imagen aquí

Sabía que mis referencias estaban rotas y necesitaban ser reparadas. Lo que tenía que hacer era git bash (En SourceTree, haga clic en "terminal"). Luego navega a la carpeta de referencias como esta

cd .git
cd refs
cd remotes
cd origin

habrá un nombre de archivo masterallí, utilícelo lspara ver qué hay en el directorio. Luego simplemente elimínelo usando rm master

bam, el archivo dañado se ha ido. Ahora, si emite el comando git branch -a, generaría esto

$ git branch -a
* master
  remotes/origin/master (this in red color -scary :) )

Luego emita este comando y arreglará sus referencias

$ git remote set-head origin master

Para resumir, si intenta tirar del control remoto, debería mostrar un nombre remoto en blanco que se ha corregido.

ingrese la descripción de la imagen aquí

Hammad Khan
fuente
0

Tuve el mismo problema pero no tuve suerte, no pude resolver el problema. Llevé mi repositorio a un lado, volví a clonar el del servidor y traté de fusionarlos. Por supuesto, mostró muchos archivos no relacionados con mi rama, pero ayudó a aislar los archivos necesarios.

Samuelens
fuente
0

Compruebe si MSWindows creó archivos desktop.ini que comparten el git. lo hace por mi. Una vez que los elimino todos en las subcarpetas del directorio .git, entonces funciona.

Vinnief
fuente
0

Tuve este mismo problema cuando Android Studio terminó repentinamente (debido a la pérdida de energía de la computadora).

Lo resolví copiando el contenido de mi C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\heads\masterarchivo a mi C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\refs\remotes\origin\masterarchivo.

(Anteriormente, también había activado la opción 'Force Push' en Android Studio, pero no creo que este sea un paso necesario).

Nota:

He encontrado esta solución, comparando el contenido de los archivos en mi C:\Users\myusername\AndroidStudioProjects\MyBrokenApp\.git\directorio (inc subdirectorios.) A los archivos correspondientes de los de otra sana proyecto - por ejemplo, C:\Users\myusername\AndroidStudioProjects\MyHealthyApp\.git\.

Es posible que tenga un archivo diferente que esté dañado, pero al compararlo con otro proyecto en buen estado, debería poder detectar rápidamente lo que está mal.

Si no tiene otro proyecto saludable que tenga configurado git, puede valer la pena crear uno simple de la misma manera que creó su proyecto roto para que pueda investigar, comparar y arreglar, etc.

PD - Mi mensaje de error (editado) fue: warning: ignoring broken refs/remotes/origin/master.fatal bad revision 'refs/remotes/origin/master..refs/heads/master' during executing git -c core.quotepath=false log refs/remotes/origin/master..refs/heads/master --pretty=format --encoding=UTF-8 -M --name-status -c --

ban-geoingeniería
fuente