2012-05-20 19 views
13

Si git fetch se interrumpe, por ejemplo, por Ctrl-C o causado por problemas de conectividad, después de eso git fetch y también git pull no funcionan.¿Cómo arreglar el repositorio git roto por fetch git interrumpido?

[email protected]:~/code/openttd-git$ git fetch 
^C 
[email protected]:~/code/openttd-git$ git fetch 
error: Unable to find 22d90742fc79a9011fb86ee03d8aeea66bc12657 under http://git.openttd.org/openttd/trunk.git 
Cannot obtain needed object 22d90742fc79a9011fb86ee03d8aeea66bc12657 
error: Fetch failed. 

Creo que esto no está relacionado con el repositorio. Usar git clone para crear una copia de este repositorio local roto en un nuevo repositorio local no soluciona esto. La única solución que conozco hasta ahora es git clone el repositorio remoto completo (origin/master) en un nuevo repositorio local. Pero, ¿hay alguna solución mejor (más rápida)?

Hay Debian bug report que tiene el último mensaje de febrero de 2011. ¿Es este el mismo error que tengo o ya existe una solución, o una solución o una solución a esto? Mi versión de git es 1.7.10.

Respuesta

6

encuentra un *.pack.temp en .git/objects/pack en tu repositorio local. A continuación, busque un archivo .idx con el mismo nombre de base y retírelos (o elimínelos, pero es mejor estar seguro que lamentar). Vuelva a ejecutar git fetch y debería funcionar (bueno, lo hizo por mí).

Por ejemplo:

% git fetch 
error: Unable to find a4fb0b54b2609df8a1ee4b97c268d205fc5bf9f1 under https://www.example.com/~someuser/something.git 
Cannot obtain needed object a4fb0b54b2609df8a1ee4b97c268d205fc5bf9f1 
error: fetch failed. 

% ls -l .git/objects/pack 
total 65872 
-rw-r--r-- 1 someuser someuser 64072 Feb 12 2014 pack-2e31e66e67d8596f1193bbbc06c87293900c6e45.idx 
-rw-r--r-- 1 someuser someuser 16920 Jul 21 2013 pack-3d76e0bf6c67d71913efc0711d56f04c7f79b95d.idx 
-rw-r--r-- 1 someuser someuser 62224 Feb 11 2014 pack-74107fa80989df6619479874d94b5f8ed010fd2f.idx 
-rw-r--r-- 1 someuser someuser 96552 Oct 30 22:55 pack-bb75633331ea0e74d4d3cb29f7660e1ba00fb899.idx 
-rw-r--r-- 1 someuser someuser 73228 Mar 6 2014 pack-de0c1bcf3550cd7a2fd0c5a981bc17d15f1144c0.idx 
-r--r--r-- 1 someuser someuser 129144 Feb 2 18:57 pack-ffb25d036dea040923468e2de07023f9b497aeb7.idx 
-r--r--r-- 1 someuser someuser 46413554 Feb 2 18:57 pack-ffb25d036dea040923468e2de07023f9b497aeb7.pack 
-r--r--r-- 1 someuser someuser 129312 Feb 2 19:10 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx 
-rw-r--r-- 1 someuser someuser 20450545 Feb 2 19:09 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack 
-rw-r--r-- 1 someuser someuser 129312 Feb 2 18:36 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx 
-rw-r--r-- 1 someuser someuser 9863168 Feb 2 18:37 pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack.temp 

% mv .git/objects/pack/pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.idx /tmp/ 
% mv .git/objects/pack/pack-ffbdfa2c676aaf392ea722cb68eaa87e45af092c.pack.temp /tmp/ 
% git fetch 
From https://www.example.com/~someuser/something 
    3288ab9..a4fb0b5 master  -> origin/master 
+1

Gracias, esto funciona. Cabe señalar que puede haber varios '' pack.temp' y los correspondientes archivos '* .idx' (tuve 3 de ambos). Los moví a todos a un directorio separado, y después de eso 'git fetch' y' git merge origin/master' funcionaron correctamente. – nrz

-1

¿Es capaz de ejecutar:

git reset --hard <some prior commit> 

En teoría, si acaba de ejecutar git fetch, usted debe ser capaz de:

git reset --hard HEAD 

Esto se debe descartar los cambios causados ​​por la interrupción operación de búsqueda, devolviendo su repositorio a un estado anterior. En este punto, debería poder volver a ejecutar su operación fetch.

+0

soy capaz de ejecutar 'git reset CABEZA --hard ~ 20' (por ejemplo) y se ejecuta sin problemas, pero el problema con' 'fetch' git y git pull' se mantiene igual. Creo que el "objeto necesario" debería arreglarse de alguna manera, pero no sé cómo. – nrz

-1

¿Has probado a limpiar el repositorio?

git gc 

Tenga cuidado, ya que el comando anterior también limpia el reflog.

+0

'git gc' muestra lo siguiente:' usuario @ computadora: ~/code/openttd-broken-git $ git gc Contando objetos: 150683, hecho. Compresión delta con hasta 8 hilos. Comprimir objetos: 100% (24232/24232), hecho. Objetos de escritura: 100% (150683/150683), hecho. total 150.683 (126.184 delta), reutilizados 150.626 (delta 126127) archivo malo SHA1: .git/objetos/22/d90742fc79a9011fb86ee03d8aeea66bc12657.temp' Después de lo cual 'git salidas fetch': 'error: No se pudo encontrar ce35909568caea9116c69b0a9d0cf6810d6507a5 bajo http://git.openttd.org/openttd/trunk.git No se puede obtener el blob necesario ce35909568caea9116c69b0a9d0cf6810d6507a5' ... – nrz

8

Pruebe estos comandos:

git fsck 
git gc 
+1

Indica lo que hacen los comandos y será más útil para los demás. Gran respuesta sin embargo. –

+0

Acabo de golpear el mismo problema y estos comandos no lo resuelven (como se menciona en uno de los comentarios a continuación). –

+1

Esto no resuelve el problema. '$ git fsck' outputs:' Comprobando directorios de objetos: 100% (256/256), hecho. 'Comprobando objetos: 100% (161159/161159), hecho. Luego, salidas' $ git gc': 'Contando objetos: 157646, hecho '' Compresión delta utilizando hasta 8 hilos'' Compresión de objetos: 100% (24579/24579), hecho '' Escribir objetos: 100% (157646/157646), hecho. 'Total 157646 (delta) 133211), reutilizado 157173 (delta 132738) '. Y luego sale '$ git fetch' igual que el anterior, por lo que esto no resuelve el problema. – nrz

1
man git-fsck 

dice utilizar rsync:

Any corrupt objects you will have to find in backups or other archives (i.e., you can just remove them and do an rsync with some other site in the hopes that somebody else has the object you have corrupted).

rsync -av [email protected]:repo/.git ./.git 

trabajó para mí

-1

Es probable que el repositorio es corrup t. Ejecutando git fsck y git gc en el servidor podría resolverlo. La clonación en un directorio separado y extracción desde ese directorio también le dará los commits. Después, funcionará un git fetch, ya que solo actualiza las referencias y no tiene que buscar ningún objeto.

Cuestiones relacionadas