svn - eliminar - ¿Cómo arreglo un repositorio con una revisión interrumpida?
svn eliminar archivos del repositorio (1)
Lo solucioné
La solución fue (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 desaparecidos. -
repos/
: repositorio cargado desde una copia de seguridad (archivo de volcado), que cubre la revisión 0..910.
La solución fue simplemente descargar desde master/
, desde la revisión 911 en adelante. Esto fue posible sin ningún error, lo que significa que ninguna de las revisiones en el rango 911..947 dependió 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, simplemente aplique el volcado al repositorio proveniente de la copia de seguridad:
$ cat tail.txt | svnadmin load repos/
[lots of commits]
Y ahora tengo el historial completo restaurado, sin problemas:
$ svnadmin verify repos/
* Verified revision 0.
* Verified revision 1.
* Verified revision 2.
[...]
* Verified revision 945.
* Verified revision 946.
* Verified revision 947.
¡Hurra!
El servidor de mi casa sufrió una falla en el disco duro.
Una vez que me di cuenta de que el disco estaba funcionando, 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/revprops/
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 deseo mantener!) En el master/
repositorio hasta la revisión # 947.
Hoy compré mi copia de seguridad fuera del sitio más reciente (!), Que felizmente incluye esta revisión. Me gustaría "curar" el repositorio roto en el master/
reparando la revisión faltante, 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/
, así que todo es el antiguo formato "lineal" 3.
Intenté lo obvio, copiar el archivo 823
desde los directorios db/revprops/
y db/revprops/
de la copia de seguridad:
$ 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 se ha cargado desde el volcado de respaldo. Ahora entiendo:
$ 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 intentado varios otros comandos svnadmin
, pero ninguno ha hecho feliz al verificador.
Mi siguiente idea fue retrasar la copia y comenzar con una copia "nueva" del repositorio roto, luego volcar las revisiones después de 823 y fusionar con la copia de seguridad. Pero eso no parece 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 que el volcado sea "incremental", con la esperanza de que pretenda que el mundo comenzó con la revisión 824 y simplemente vaya desde allí:
$ svnadmin dump --incremental -r 824:947 master/ > dump.txt
svnadmin: No such revision 823
Esto escribe salida en dump.txt
, pero no estoy seguro si se puede confiar en ella. Tenga en cuenta que no registra que descargó con éxito cualquier revisión.
Actualización : Tuve otra idea: copiar los archivos de revisión más nuevos de la copia de bloqueo-disco 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.