¿Cómo cambiar la copia de trabajo de subversión UUID?

13

Recientemente he actualizado los repositorios de Subversion de una versión anterior 1.2.3 a 1.6.0 a través de svnadmin dump / load . Todos los repositorios antiguos usaban el mismo UUID (los repositorios se crearon copiando un repositorio de plantillas). He cambiado el UUID en un par de los nuevos repositorios a través de svnadmin setuuid para que sea único. No puedo simplemente reubicar mis copias de trabajo existentes de esos repositorios porque los UUID son diferentes. Sé cómo exportar la copia de trabajo y retirarla del nuevo repositorio, pero me preguntaba si había una manera de cambiar el UUID de la copia de trabajo en el lugar, como lo que hace svnadmin setuuid para los repositorios.

Ioan
fuente

Respuestas:

3

Debe editar todos los archivos de 'entradas' en su repositorio extraído. Si el repositorio tiene muchos directorios, buscar + un script sed hará que la tarea sea corta.

John
fuente
17

Nueva respuesta desde el formato de copia de trabajo Subversion 1.7 . Necesita la sqlite3utilidad de línea de comandos.

En el directorio raíz de su copia de trabajo, ahora hay una sola .svn/carpeta con una base de datos SQLite. Puede consultar el repositorio actual UUIDconocido para su copia de trabajo con:

$ sqlite3 .svn/wc.db 'select uuid from REPOSITORY where id=1'
b6dc3e6c-5320-4549-b231-c153d86d7525

Como resultado, el cambio UUIDse puede hacer con:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032" where id=1'

Por supuesto, mantenga una copia de seguridad del .svn/wc.dbarchivo antes de invocar la consulta de actualización. Casi no hay posibilidad de que su entidad de repositorio tenga una identificación diferente o que haya varias líneas en esa tabla, pero puede verificar si obtiene resultados inesperados.

Yves Martin
fuente
+1 funcionó perfectamente con un repositorio reubicado que también cambió UUID
Amro
8

Aquí hay un comando que hace el truco para SVN 1.6 y siguientes:

find . -type f -name entries -exec sed -i 's/old-uuid/new-uuid/g' {} \;

Reemplazar old-uuidy new-uuidcon los identificadores reales.

Emil M
fuente
1
+ 1 Gracias por la solución. Esto no funciona para directorios que tienen espacios. "find. -type f -name entradas -exec sed -i 's / old-uuid / new-uuid / g' {} \;" sin comillas dobles parece funcionar.
Tommy
sry por necroing este hilo este método me ahorró un montón de tiempo ... para otros que prueben esto, solo quiero agregar una nota. Sed en MACOX parece necesitar un uso ligeramente diferente, hay que decirlo sed -i "" 's/old-uuid/new-uuid/' y funciona (solo las comillas dobles extra vacías) ( ref )
Karthik T
2

La respuesta de Yves Martin funcionó muy bien para nosotros en varias copias de trabajo con SVN 1.8, pero terminamos encontrando casos en los que no funcionó.

Ejecutar el comando de Yves sin "where id = 1" funcionó en todos los casos para nosotros:

$ sqlite3 .svn/wc.db 'update REPOSITORY set uuid="1c0d1ec1-2326-0410-bef5-eb29cddfc032"'

Al investigar por qué sucedió esto, descubrí que se almacenan múltiples UUID al reubicar el repositorio, en contra de la intuición de Yves de que esto nunca debería suceder.

Se agrega una nueva entrada en la tabla REPOSITORY después de una reubicación en lugar de actualizar la existente, almacenando una identificación incrementada con la nueva raíz del repositorio y su UUID. Entonces, los casos que no funcionaron correctamente fueron las copias de trabajo que ya se habían reubicado en el pasado: el comando parece funcionar, pero solo se cambió el UUID inicial, no el que se está utilizando actualmente.

Uno puede verificar la lista de raíces almacenadas y UUID en una copia de trabajo con este comando:

$ sqlite3 .svn/wc.db 'select id,uuid,root from REPOSITORY'

Finalmente notaré que tuve que usar un conjunto diferente de comillas para la línea de comandos de Windows / archivos por lotes, de la siguiente manera:

> sqlite3.exe .svn\wc.db "update REPOSITORY set uuid='1c0d1ec1-2326-0410-bef5-eb29cddfc032'"
Julien Barnoin
fuente
Gracias por los detalles cuando se reubicó una copia de trabajo, no estaba al tanto de este comportamiento
Yves Martin
1

La sección " Gestión de UUID de repositorio " en svn red-bean book puede tener la respuesta que está buscando.

yasouser
fuente
Esa sección habla sobre los UUID del repositorio, no los UUID de copia que no funcionan.
Ioan
@Ioan: Citando de esa sección: para las personas que usan versiones de Subversion anteriores a la 1.5, estas tareas son un poco más complicadas. Puede establecer explícitamente el UUID de un repositorio canalizando un trozo de archivo de volcado del repositorio que lleve la nueva especificación UUID a través de svnadmin load --force-uuid REPOS-PATH - ¿No es esto lo que necesitaba?
Yasouser
1
De nuevo, no, no estoy hablando de UUID de repositorio , sino de UUID de copia de trabajo ; copias de trabajo son lo mismo que un pago y envío.
Ioan
No puede cambiar el UUID de la copia de trabajo a la del repositorio del servidor sin actualizar o cambiar la copia de trabajo a la ubicación [nueva / existente] del repositorio.
Yasouser