2008-10-15 11 views
12

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 propiedades svn: externals:¿Cómo migrar todas las URL en propiedades svn: externals a través de un repositorio?

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 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?

+2

Qué lección en particular es lo que estás refiriendo a la "svn: // localhost /" -cosa? – conny

+0

Quiero decir, que uno debe usar un nombre de host genérico en lugar de un nombre de dominio específico cuando sea posible, porque cuando cambia el nombre de dominio, termino con un desastre como este. =/ –

+4

No veo la necesidad de usar el prefijo svn: // localhost. ¿Sabes que puedes usar URLS relativos? Consulte http://subversion.tigris.org/svn_1.5_releasenotes.html#externals –

Respuesta

7

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, usted debe:

1) Tire el contenido del repositorio toda usando svnadmin dump:

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

2) editar el archivo de volcado, para cambiar la propiedad svn: externals URL . 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 utilizando el llamado "editor hexadecimal", por ejemplo, el Freeware Hex Editor XVI32

3) Crear un nuevo repositorio y cargar 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 interesarle este enlace:
http://svnbook.red-bean.com/en/1.1/ch05s03.html

NOTA: Subversion 1.5 ayuda efectivamente añadido para URL relativos en la propiedad svn: externals, que pueden prevenir precisamente este tipo de problemas en el futuro:
http://subversion.tigris.org/svn_1.5_releasenotes.html#externals

+0

Esta es la solución, pero realmente no desea abrir un archivo de volcado svn de tamaño moderado en un editor ... ' sed 'al rescate! – jeroenh

+1

Nunca debe editar un volcado SVN con un editor de texto a menos que esté dispuesto a tratar con los valores hash MD5 y SHA1 para el archivo y los datos del soporte. El recálculo manual de estos valores hash hace que la edición manual de archivos de volcado SVN de más de unas pocas docenas de revoluciones sea un trabajo desalentador. Es mucho mejor usar una de las herramientas creadas para el trabajo, como svndumptool. – Ausmith1

0

Usted podría:

a) echa un vistazo a la revisión antigua, y cambiar sus anfitriones-archivo para señalar el nombre antiguo a la nueva dirección, entonces svn update. En caso de que la ruta URL también haya cambiado ... bueno, entonces podría:

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 comprometerlos. O bien:

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, utilizar svndump para volcar los datos del repositorio, cadena de sustituir el URL en el vertedero, a continuación, restaurarla .. yo no le daría ninguna garantía de que que incluso funciona ;-)

19

que haría uso de este SvnDumpTool. Tiene exactamente lo que está buscando:

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

Esto arregla cada uno externo a la subversion 1.5 format, y utiliza URLs relativas.

Así svn: externos como:

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

se convierten en:

/repo/libraryA external/libraryA 

usando raíz del servidor URL relativos.

+0

No entiendo la segunda parte (después de la expresión regular). ¿Puede detallar más? Gracias . – moujib

+1

Agregué un enlace relevante y agregué más aclaraciones a la respuesta. Espero que esto ayude. – ldav1s

+0

Ver este post también: http://stackoverflow.com/questions/21292688/regex-for-svndumptool?lq=1 – Ausmith1

1

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

Esperando svn relocate a comportarse como se describe (traverse externos anidados) escribí un simple instrucción DOS para ejecutar en cada lugar:

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 principal.

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 sería una buena idea para obtener todos los usuarios de la tortuga para borrar su historial de URL para que no inadvertidamente realizan operaciones utilizando la dirección de edad (que todavía existe en la búsqueda de DNS):

Settings->Saved Data->URL history->Clear

1

I editado mi archivo de volcado con vi, pero tuve que usar el interruptor "B" para editar en modo binario de tal manera que los caracteres que podrían ser interpretadas como los finales de línea no se convierten.

p. Ej. vi -b filename.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 parece a esto:

Nodo-ruta: trunk/src/include

Nodo-tipo: dir

Nodo-acción: el cambio

Prop-contenido -Duración: 192

contenido de longitud: 192

K13

svn: externos

V 156

MGL_ABC svn: // server/dir1/directorio2

SVN MGL_DEF: // server/dir1/dir3

Al modificar las direcciones 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 acorta en 4 caracteres. Entonces, tendrías que restar '7' de cada uno de esos tres números de longitud de cuerda.

0

Todos mis externos estaban en directorios llamados flow. Me fijo en las direcciones URL mis cosas externas con este de una 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 
Cuestiones relacionadas