¿Cómo migrar todas las URL en las propiedades svn: externals a través de un repositorio?

StackOverflow https://stackoverflow.com/questions/204616

Pregunta

Estamos en el proceso de mover nuestros repositorios SVN de una máquina a otra, y con esto vendrá un nuevo nombre de dominio para el nuevo repositorio. El problema es que dentro del repositorio, hay muchas referencias svn: externals a otros proyectos dentro del repositorio. Así, por ejemplo, tenemos projectA, que tiene en las propiedades svn: externals:

external/libraryA svn://oldserver.net/repo/libraryA
external/libraryB svn://oldserver.net/repo/libraryB

... y así sucesivamente. Todas las URL hacen referencia a este nombre de dominio particular, por lo que se puede analizar fácilmente. Una vez que aprendí mi lección, migraré estas URL para que sean " svn: // localhost / " ;, pero necesito encontrar una manera de revisar el historial del repositorio y volver a escribir todas las URL antiguas, para que podamos seguir Echa un vistazo a las revisiones anteriores de estos proyectos sin tener enlaces rotos.

¿Cómo voy a hacer esto?

¿Fue útil?

Solución

Como usted indicó que aún desea poder revisar revisiones anteriores, la única solución es realmente " reescribir " toda la historia (solución D mencionada anteriormente).

Para hacer esto, debes:

1) Vuelque el contenido del completo usando svnadmin dump :

$ svnadmin dump /path/to/repos > original-dumpfile
* Dumped revision 0.
* Dumped revision 1.
* Dumped revision 2.
* Dumped revision 3.

2) Edite el archivo de volcado, para cambiar las URL svn: externals. Esta es la parte más difícil : asumiendo que el repositorio también contiene datos binarios, la apertura del archivo de volcado en un editor de texto simple probablemente dañará el archivo de volcado. He tenido buenas experiencias con el llamado "editor hexadecimal", por ejemplo, Freeware Hex Editor XVI32

3) Cree un nuevo repositorio y cargue el archivo de volcado modificado en él:

$ svnadmin create newrepos
$ svnadmin load newrepos < modified-dumpfile

Para obtener más información, también puede estar interesado en este enlace:
http://svnbook.red-bean.com/en/1.1/ch05s03.html

NOTA: Subversion 1.5 en realidad agregó soporte para URL relativas en la propiedad svn: externals, lo que puede prevenir este tipo de problemas en el futuro:
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals

Otros consejos

Yo usaría SvnDumpTool para esto. Tiene exactamente lo que estás buscando:

svndumptool transform-prop svn:externals "(\S*) (|-r ?\d* ?)http://oldserver.net(/\S*)" "\2\3 \1" source.dumpfile source-fixed-externals.dumpfile

Esto corrige cada uno externo al subversion 1.5 format , y usa URLs relativas.

Por lo tanto, svn: externos como:

external/libraryA svn://oldserver.net/repo/libraryA

conviértete en:

 /repo/libraryA external/libraryA

utilizando URLs relativas a la raíz del servidor.

Tuve que reubicar 12 copias de trabajo en 9 usuarios y 4 implementaciones. Fue un simple cambio, reemplazando un dominio con una IP, es decir, thing.domain.net - > 192.168.0.1

Esperando que svn relocate se comporte como se describe (atraviesa los aspectos externos anidados) Escribí una simple instrucción de DOS para ejecutar en cada ubicación:

para / D% G en (*) do ( cd ./%G &erio; svn relocate http://thing.domain.net http://192.168.0.1 &erio; cd ..)

Esto no funcionó como se esperaba, solo reubicando el WC principal.

Mi solución fue editar los repositorios ellos mismos (utilicé Tortoise Repo Browser) para cambiar la ubicación de los externos. Después de este cambio, una actualización del padre reubicado fue todo lo que se requirió para poner todo en línea.

Probablemente sería una buena idea que todos los usuarios de Tortoise borren su historial de URL para que no realicen operaciones sin darse cuenta usando la URL antigua (todavía existe en la búsqueda de DNS):

Configuración- > Datos guardados- > URL history- > Borrar

Edité mi archivo de volcado con vi, pero tuve que usar el " -b " cambie para editar en modo binario, de modo que los caracteres que podrían interpretarse como finales de línea no se hayan convertido.

por ejemplo vi -b filename.dump

También, encontré que, si cambia la longitud de su URL, hay longitudes de cadena que también tuvieron que ser modificadas. Por ejemplo, considere una entrada que se parece a esto:

Ruta del nodo: trunk / src / include

Tipo de nodo: dir

Acción del nodo: cambiar

Prop-content-length: 192

Longitud del contenido: 192

K13

svn: externos

V 156

MGL_ABC svn: // nombre_servidor / dir1 / dir2

MGL_DEF svn: // nombre_servidor / dir1 / dir3

Cuando modifica esas URL, si la longitud de la cadena cambia, también necesita cambiar el " 192 " ;, " 192 " y " 156 " para que coincida con la nueva longitud. Me resultó difícil calcular la longitud absoluta, pero es fácil encontrar el diferencial.
Por ejemplo, digamos que la URL 1 se reduce en 3 caracteres y la URL 2 se reduce en 4 caracteres. Entonces, deberías repartir el '7' de cada uno de esos tres números de longitud de cadena.

Podrías:

a) verifique la revisión anterior, y cambie su archivo de hosts para señalar el nombre antiguo a la nueva dirección, luego svn update. En caso de que la ruta de la URL también haya cambiado ... bueno, entonces usted también podría:

b) tómese el tiempo para escribir un script que encuentre las propiedades en la copia de trabajo actual (revisión antigua) y cambie las URL allí, sin confirmarlas. O:

c) tome nota de la revisión (-s) donde verificó los nuevos valores de propiedad, verifique la versión anterior y simplemente haga una combinación de esas revisiones (-que solo afectan las propiedades) en su copia de trabajo.

d) o, posiblemente, use svndump para volcar los datos del repositorio, reemplazar la URL en el volcado, restaurarla ... No le daría ninguna garantía de que eso funcione ;-)

Todos mis externos estaban en directorios llamados flow . He arreglado las URL en mis externos con esta sola línea (shell bash):

for p in $(find -maxdepth 4 -name flow); do svn ps svn:externals "$(svn pg svn:externals $p/.. | perl -pe 's/^(\w+) svn\+ssh.*thing\.domain\.net(.*)/$2 $1/')" $p/..; done
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top