tortoise - svn tutorial español
¿Cómo migrar todas las URL en propiedades svn: externals a través de un repositorio? (6)
Tú podrías:
a) revise la revisión anterior y cambie su archivo de hosts para señalar el nombre anterior a la nueva dirección y luego svn update. En caso de que la ruta URL también haya cambiado ... bueno, entonces también podrías:
b) tómese el tiempo para escribir un script que encuentre las propiedades en la copia de trabajo actual (revisión anterior) y cambie las URL allí, sin comprometerlas. O:
c) anote la revisión (-s) donde registró los valores de las propiedades nuevas, revise la versión anterior y simplemente fusione esas revisiones (que solo afectan las propiedades) en su copia de trabajo.
d) o, posiblemente, use svndump para volcar los datos del repositorio, string-replace the URL in the dump, luego restáurelo ... No le daría ninguna garantía de que eso funcione ;-)
Estamos en el proceso de mover nuestros repositorios SVN de una máquina a otra, y con ella vendrá un nuevo nombre de dominio para el nuevo repositorio. El problema es que dentro del repositorio hay muchas referencias de svn: externals a otros proyectos dentro del repositorio. Entonces, 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í. Todas las URL hacen referencia a este nombre de dominio en particular, por lo que se puede analizar fácilmente. Después de haber aprendido 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 prestando atención. revisiones anteriores de estos proyectos sin tener enlaces rotos.
¿Cómo voy a hacer esto?
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 formato externo al de subversión 1.5 y usa URL relativas.
Entonces svn: externos como:
external/libraryA svn://oldserver.net/repo/libraryA
volverse:
/repo/libraryA external/libraryA
usando URLs relativas a la raíz del servidor.
Tuve que reubicar 12 copias de trabajo en 9 usuarios y 4 implementaciones. Fue un cambio simple, reemplazando un dominio con una IP, es decir, thing.domain.net -> 192.168.0.1
Esperando que svn relocate
comporte como se describe (externals anidados transversalmente) escribí una instrucción simple de DOS para ejecutar en cada ubicación:
for /D %G in (*) do ( cd ./%G & svn relocate http://thing.domain.net http://192.168.0.1 & cd ..)
Esto no funcionó como se esperaba, solo reubicando el WC padre.
Mi solución fue editar los repositorios (utilicé el navegador Tortoise Repo) para cambiar la ubicación de los externos. Después de este cambio, una actualización del padre reubicado era todo lo que se requería para alinear todo.
Probablemente sea una buena idea hacer que todos los usuarios de Tortoise borren su historial de URL para que no realicen inadvertidamente operaciones usando la antigua URL (aún existe en la búsqueda DNS):
Settings->Saved Data->URL history->Clear
Edité mi archivo de volcado con vi, pero tuve que usar el modificador "-b" para editar en modo binario de manera que los caracteres que podrían interpretarse como terminaciones de línea no se convirtieran.
por ejemplo, vi -b nombre de archivo.dump
Además, descubrí que, si la longitud de su URL cambia, también hay longitudes de cadena que también deben modificarse. Por ejemplo, considere una entrada que se ve así:
Node-path: trunk / src / include
Node-kind: dir
Acción de nodos: cambio
Prop-contenido-longitud: 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 "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, supongamos que la URL 1 se acorta en 3 caracteres y la URL 2 se reduce en 4 caracteres. Entonces, tendrías que restar ''7'' de cada uno de esos tres números de longitud de cuerda.
Todos mis externos estaban en directorios llamados flow
. Arreglé las URL en mis externos con este one-liner (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
Como indicó que aún desea poder ver revisiones anteriores, la única solución es "reescribir" todo el historial (la solución D mencionada anteriormente).
Para hacer esto, debes:
1) Volcar el contenido de todo el repositorio 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 de svn: externals. Esta es la parte más difícil : suponiendo que el repositorio también contenga datos binarios, la apertura del archivo de volcado en un editor de texto sin formato probablemente corromperá el archivo de volcado. He tenido buenas experiencias usando el llamado "editor hexadecimal", por ejemplo, el Freeware Hex Editor XVI32.
3) Crea un nuevo repositorio y carga el archivo de volcado modificado en él:
$ svnadmin create newrepos
$ svnadmin load newrepos < modified-dumpfile
Para obtener más información, también podría estar interesado en este enlace:
http://svnbook.red-bean.com/en/1.1/ch05s03.html
NOTA: Subversion 1.5 de hecho agregó soporte para URL relativas en la propiedad svn: externals, que puede prevenir precisamente este tipo de problemas en el futuro:
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals