Acabo de experimentar esto: mi máquina se bloqueó al escribir en el repositorio de Git, y se corrompió. Lo arreglé de la siguiente manera.
Comencé mirando cuántas confirmaciones no había enviado al repositorio remoto, por lo tanto:
gitk &
Si no utiliza esta herramienta, es muy útil, por lo que sé, está disponible en todos los sistemas operativos. Esto indicaba que a mi control remoto le faltaban dos confirmaciones. Por lo tanto, hice clic en la etiqueta que indica la última confirmación remota (por lo general, esto será/remotes/origin/master
) para obtener el hash (el hash tiene 40 caracteres de largo, pero por brevedad estoy usando 10 aquí, esto generalmente funciona de todos modos).
Aquí está:
14c0fcc9b3
Luego hago clic en el siguiente commit (es decir, el primero que el control remoto no tiene) y obtengo el hash allí:
04d44c3298
Luego uso ambos para hacer un parche para esta confirmación:
git diff 14c0fcc9b3 04d44c3298 > 1.patch
Luego hice lo mismo con el otro commit faltante, es decir, usé el hash del commit antes y el hash del commit en sí:
git diff 04d44c3298 fc1d4b0df7 > 2.patch
Luego me mudé a un nuevo directorio, cloné el repositorio desde el control remoto:
git clone git@github.com:username/repo.git
Luego moví los archivos de parche a la nueva carpeta, los apliqué y los confirmé con sus mensajes de confirmación exactos (se pueden pegar desde git log
o desde la gitk
ventana):
patch -p1 < 1.patch
git commit
patch -p1 < 2.patch
git commit
Esto restauró las cosas para mí (y tenga en cuenta que probablemente haya una forma más rápida de hacerlo para una gran cantidad de confirmaciones). Sin embargo, estaba ansioso por ver si el árbol en el repositorio corrupto puede repararse, y la respuesta es que sí. Con un repositorio reparado disponible como el anterior, ejecute este comando en la carpeta rota:
git fsck
Obtendrás algo como esto:
error: object file .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d is empty
error: unable to find ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
error: sha1 mismatch ca539ed815fefdbbbfae6e8d0c0b3dbbe093390d
Para hacer la reparación, haría esto en la carpeta rota:
rm .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
cp ../good-repo/.git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d .git/objects/ca/539ed815fefdbbbfae6e8d0c0b3dbbe093390d
es decir, elimine el archivo dañado y reemplácelo por uno bueno. Tu debes hacer esto varias veces. Finalmente habrá un punto donde puedes correrfsck
sin errores. Probablemente tendrá líneas de "compromiso pendiente" y "blob colgante" en el informe, estas son una consecuencia de sus rebases y enmiendas en esta carpeta, y están bien. El recolector de basura los eliminará a su debido tiempo.
Por lo tanto (al menos en mi caso) un árbol dañado no significa que se pierdan las confirmaciones no apresuradas.