¿Cómo puedo arreglar un repositorio con una revisión rota?


Mi servidor doméstico tuvo un fallo en el disco duro.

Una vez que me di cuenta de que el disco estaba en marcha, inicié sesión e hice una copia directa de mi repositorio, que contiene múltiples proyectos.

Sin embargo, dado que el disco estaba fallando, una de las revisiones se rompe:

$ svnadmin verify master/
[...]
* Verified revision 820.
* Verified revision 821.
* Verified revision 822.
svnadmin: No such revision 823

Los directorios master/db/revs/ y master/db/revprops/, de hecho, no contienen ningún archivo llamado 823, por lo que esta revisión falta (está rota). Hay revisiones posteriores (que realmente quiero mantener!) en el repositorio master/ subiendo a la revisión # 947.

Hoy busqué mi copia de seguridad externa más reciente (!), que felizmente incluye esta revisión. Me gustaría "curar" el repositorio roto en master/ arreglando la revisión que falta, ya que es más reciente que la copia de seguridad.

Me aseguré de cargar el archivo de volcado en un repositorio recién creado con la misma versión que el copiado en master/, por lo que es todo el antiguo formato "lineal" 3.

Intenté lo obvio, simplemente copiar el archivo 823 de la los directorios db/revs/ y db/revprops/ de backup:

$ cp repos/db/revs/0/823 master/db/revs/
$ cp repos/db/revprops/0/823 master/db/revprops/

El directorio repos/ contiene un repositorio que ha sido cargado desde el volcado de backup. Ahora consigo:

$ svnadmin verify master/
[...]
* Verified revision 821.
* Verified revision 822.
svnadmin: /build/buildd/subversion-1.6.12dfsg/subversion/libsvn_delta/compose_delta.c:165: search_offset_index: Assertion `offset < ndx->offs[ndx->length]' failed.
Aborted

Lo cual no es muy alentador. He probado varios otros comandos svnadmin, pero ninguno ha hecho feliz al verificador.

Mi siguiente idea fue retroceder en la copia y comenzar con una copia "fresca" del repositorio roto, luego volcar las revisiones después de 823, y fusionarlas con la copia de seguridad. Pero eso no parece es posible, no puedo volcar revisiones después de la que falta:

$ svnadmin dump -r 824 master/ >r824.dmp
svnadmin: No such revision 823

Tenga en cuenta que no ayuda a hacer el volcado "incremental", con la esperanza de que debería pretender que el mundo comenzó con la revisión 824 y simplemente ir desde allí:

$ svnadmin dump --incremental -r 824:947 master/ > dump.txt
svnadmin: No such revision 823

Esto escribe la salida a dump.txt, pero no estoy seguro de si se puede confiar en ella. Tenga en cuenta que no registra que volcó correctamente ninguna revisión.

Update : Tuve otra idea: copiar los archivos de revisión más recientes de el crash-disk-copy en master/ en la copia de seguridad, para proporcionar la"cola faltante":

$ for a in $(seq 910 947) ; do cp  master/db/revs/$a repos/db/revs ; cp master/db/revprops/$a repos/db/revprops/ ; echo $a ; done

Sin embargo, esto parece no hacer más que corromper el repositorio de destino:

$ svnadmin verify repos/
[...]
* Verified revision 907.
* Verified revision 908.
* Verified revision 909.
svnadmin: Corrupt representation '907 21815 45 30922 158d3e72732f45bf6f02919b22fc899a'
svnadmin: Malformed representation header

Ahora, me he quedado sin ideas.

Author: unwind, 2011-04-04

1 answers

Lo resolví.

La solución era (por supuesto) obvia, una vez que me di cuenta.

Tenía esto:

  • master/: Una copia de un repositorio roto, con la revisión 0..947, con los archivos de la revisión 823 físicamente perdidos.
  • repos/: Un repositorio cargado desde una copia de seguridad (archivo de volcado), cubriendo la revisión 0..910.

La solución era simplemente volcar desde master/, desde la revisión 911 en adelante. Esto fue posible sin ningún tipo de errores, lo que supongo que significa que ninguno de las revisiones de la gama 911..947 dependía directamente del estado en la revisión 823, o algo así:

$ svnadmin dump --incremental -r 911:947 master/ > tail.txt
* Dumped revision 911.
* Dumped revision 912.
* Dumped revision 913.
[...]
* Dumped revision 947.

De todos modos, entonces simplemente aplique el volcado al repositorio que proviene de la copia de seguridad:

$ cat tail.txt | svnadmin load repos/
[lots of commits]

Y ahora tengo la historia completa restaurada, sin problemas:

$ svnadmin verify repos/
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
[...]
* Verified revision 945.
* Verified revision 946.
* Verified revision 947.

Yay!

 37
Author: unwind,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-08 20:12:30