2010-11-01 13 views
24

Cuando hice un svn git rebase se detuvo en un punto que dice: (i. A saber que estas teclas SHA corresponde a un árbol y no una confirmación desde cualquier programa de git de las dos teclas sha anteriores)¿Cómo resuelvo un desajuste del índice git-svn?

Index mismatch: SHA key of a tree != SHA key of another tree.

re-reading <sha index of a commit in svn/trunk> 
... list of files ... 
fatal: bad object <SHA1 index of the bad object> 
rev-list -1 <SHA1 index of the bad object> --not <SHA1 index of the revision it was trying to re-read>: command returned error: 128 

No tengo mucha experiencia en el funcionamiento interno de git, entonces ¿hay una secuencia de pasos a seguir para diseccionar problemas como estos y posiblemente resolverlos?

+3

Lo primero que creo que probaría con un repositorio sospechoso dañado es un ['git fsck'] (http://www.kernel.org/pub/software/scm/git/docs/git-fsck.html). –

+0

@ Greg-Hewgill: Gracias por su sugerencia. Hice un gs fsck y enumeró un grupo de árboles colgantes, commits y blobs. Me refiero a esta sección en el manual del usuario de Git: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html#recovering-from-repository-corruption y tratar de descubrir qué sucedió en el repositorio. Afortunadamente, hace un par de semanas archivé mi carpeta .git para que mi colega se pusiera en marcha con el repositorio. Usé eso y creé un nuevo repositorio y continué con mi trabajo mientras descubría qué sucedía con el corrupto. – yasouser

+0

Lo único que se me ocurre es que alguien más posiblemente se haya actualizado antes que tú, cambiando así la clave SHA del repositorio remoto y dándote el error que ves ahora. Si extrae los cambios realizados en el árbol, arregle los conflictos y, a continuación, rebase desde allí, podría funcionar correctamente. – g19fanatic

Respuesta

30

He tenido este error dos veces y las dos veces lo resolví quitando la carpeta svn dentro de la carpeta .git.

rm -r .git/svn 

luego reconstruir los metadatos svn:

git svn fetch 

Es probable que vea un mensaje en la línea de:

Migrating from a git-svn v1 layout... 
Data from a previous version of git-svn exists, but 
    .git/svn 
    (required for this version (1.7.0.4) of git-svn) does not exist. 
Done migrating from a git-svn v1 layout 

y después de un tiempo (la reconstrucción puede tomar un tiempo, especialmente en repositorios grandes) debería terminar con un espejo operativo del repositorio svn nuevamente.

+0

+1 por simplicidad; es realmente exagerado para grandes repositorios, pero en la mayoría de los casos es un ahorro de tiempo general. –

+0

Aceptando esto como la respuesta porque, uno de mis colegas se encontró con el mismo problema (desajuste del índice git) hoy y pudimos recuperar el repositorio utilizando el método sugerido aquí. Como el repositorio es muy grande, tarda bastante. – yasouser

+0

Tomó varias horas reconstruir los datos del índice svn para mi repositorio de 1,2 GB, pero solucionó el problema. –

0

Acabo de tener este error. Simplemente elimine la referencia, como lo siguiente:

rm .git/refs/remotes/git-svn 

Eso debería aclarar el error.

+0

¡No pude encontrar un git-svn en el directorio .git/refs/remotos!?! ?! – yasouser

+1

Lo siento, mi error. Eso debería ser '.git/refs/remotes/git-svn'. –

+0

No tengo un archivo git-svn en el directorio .git/refs/remotos!?!?! – yasouser

1

El problema no es que usted tiene que hacer esto de forma sistemática en este caso:

  • uso git + SVN
  • crear rama de SVN con la rama
  • git merge-svn al tronco con herramientas SVN
  • quitar la rama sVN
  • hacen un git-svn rebase

Algo falta, todo falla. La única forma que sé recuperar es eliminar todos los svn en .git y reconstruir todo. ¡Es molesto y tómate un tiempo!

29

No elimine la carpeta .git/svn para solucionarlo. Requiere que reconstruyas todo, es molesto, tomará un tiempo (para el tamaño de mi repositorio varias horas) y NO ES NECESARIO.

He encontrado la respuesta correcta here y la he incluido a continuación.

Desde el enlace:

Dentro del directorio .git ejecute los siguientes:

$ find . -exec grep -Hin 5b32d4ac2e03a566830f30a702523c68dbdf715b {} \; 
Binary file ./svn/.caches/lookup_svn_merge.db matches 
Binary file ./svn/.caches/check_cherry_pick.db matches 

Ahora elimine el juego .svn/.caches desde la salida del primer comando

$ rm ./svn/.caches/lookup_svn_merge.db 
$ rm ./svn/.caches/check_cherry_pick.db 

Ahora git svn rebase o git svn fetch para su corazón.

+2

Sí, encontré esta técnica más tarde. Durante mi próximo intento, simplemente borre los 'caches' y fue mucho más rápido que borrar' .git/svn'. Se olvidó de actualizar aquí. Gracias por publicar tu respuesta. – yasouser

12

cliente de actualización de Git y SVN refetch última comete usando:

git svn reset -r 12345 
git svn rebase 

donde se 12345 existentes revisión SVN.

+1

Esto funcionó en un caso en el que violó el directorio '.caches' no. – krlmlr

+1

Este también fue el único método que funcionó para mí. –

4

En mi caso, el problema fue causado por un autor svn nuevo/desconocido que no estaba en mi archivo authors que git-svn estaba configurado para usar. Se informó que en la salida que de que no hice caso de la primera pocas lecturas:

Index mismatch: <leftsha1> != <rightsha1> 
rereading <anothersha1> 
     ... list of files ... 
Author: <name> not defined in /path/to/authors file 

Así que me dio el nombre que me estaba perdiendo, y qué archivo para añadirlo también (me sacó el correo electrónico de mi registro de las organizaciones de usuarios) y fue sin problemas.

0

me dio este mensaje:

Index mismatch: <sha> != <sha> re-reading <sha index of a commit in svn/trunk> ... list of files ... <path> was not found in commit <sha> (r<svn rev>)

Buscando en SVN repo en la historia de la ruta informado, me encontré con la revisión de SVN, donde se había añadido el archivo. Pero al buscar en Git la confirmación creada para esa revisión, ¡descubrí que no contenía ningún archivo!

Creo que esto fue causado por un disco completo anteriormente. Después de hacer un git svn reset -r de vuelta a la revisión del commit Git roto, git svn fetch funcionó bien nuevamente.

Cuestiones relacionadas