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

Estamos en el process de mover nuestros repositorys SVN de una máquina a otra, y con ella vendrá un nuevo nombre de dominio para el nuevo repository. El problema es que dentro del repository hay muchas references de svn: externals a otros proyectos dentro del repository. Entonces, por ejemplo, tenemos projectA, que tiene en las properties svn: externals:

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

…y así. Todas las URL hacen reference 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 repository 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?

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 repository 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 file de volcado, para cambiar las URL de svn: externals. Esta es la parte más difícil : suponiendo que el repository también contenga datos binarys, la apertura del file de volcado en un editor de text sin formatting probablemente corromperá el file de volcado. He tenido buenas experiencias usando el llamado "editor hexadecimal", por ejemplo, el Freeware Hex Editor XVI32.

3) Crea un nuevo repository y carga el file de volcado modificado en él:

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

Para get más información, también podría estar interesado en este enlace:
http://svnbook.networking-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

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 formatting 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 server.

Edité mi file de volcado con vi, pero tuve que usar el modificador "-b" para editar en modo binary, de modo que los caracteres que podrían interpretarse como terminaciones de línea no se convirtieran.

por ejemplo, vi -b nombre de file.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 input 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_server / dir1 / dir2

MGL_DEF svn: // nombre_server / 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 networkinguce en 4 caracteres. Entonces, tendrías que restar '7' de cada uno de esos tres numbers de longitud de string.

Tú podrías:

a) revise la revisión anterior y cambie su file 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 time para escribir un script que encuentre las properties en la copy 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 properties nuevas, revise la versión anterior y simplemente fusione esas revisiones (que solo afectan las properties) en su copy de trabajo.

d) o, posiblemente, use svndump para volcar los datos del repository, string-replace the URL in the dump, luego restáurelo … No le daría ninguna garantía de que eso funcione 😉

Tuve que reubicar 12 copys 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 nesteds transversalmente) escribí una instrucción simple de DOS para ejecutar en cada location:

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 repositorys (utilicé el browser Tortoise Repo) para cambiar la location 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

Todos mis externos estaban en directorys llamados flow . Arreglé las URL en mis externos con este one-liner (shell bash):

 para p en $ (encontrar -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 / ...;  hecho