2010-06-17 16 views
29

Tenemos una gran base de código que contiene varios proyectos compartidos, archivos de solución, etc. en un directorio en SVN. Estamos migrando a Mercurial. Me gustaría aprovechar esta oportunidad para reorganizar nuestro código en varios repositorios para hacer que la clonación para la bifurcación tenga menos sobrecarga. Ya he convertido con éxito nuestro repositorio de SVN a Mercurial conservando el historial. Mi pregunta: ¿cómo puedo dividir todos los proyectos en repositorios separados mientras conserva su historial?Divide el repositorio grande en múltiples subrepos y preserva el historial (Mercurial)

Aquí es un ejemplo de lo que nuestro único repositorio (OurPlatform) actualmente parece:

/OurPlatform 
---- Core 
---- Core.Tests 
---- Database 
---- Database.Tests 
---- CMS 
---- CMS.Tests 
---- Product1.Domain 
---- Product1.Stresstester 
---- Product1.Web 
---- Product1.Web.Tests 
---- Product2.Domain 
---- Product2.Stresstester 
---- Product2.Web 
---- Product2.Web.Tests 
==== Product1.sln 
==== Product2.sln 

Todas esas son las carpetas que contienen proyectos VS a excepción de los archivos de solución. Product1.sln y Product2.sln hacen referencia a todos los otros proyectos. Idealmente, me gustaría tomar cada una de esas carpetas, y convertirlas en repositorios Hg separados, y también agregar repositorios nuevos para cada proyecto (actuarían como repositorios principales). Entonces, si alguien fuera a trabajar en Product1, clonarían el repositorio Product1, que contenía las referencias de Product1.sln y subrepo a ReferenceAssemblies, Core, Core.Tests, Database, Database.Tests, CMS y CMS.Test.

Por lo tanto, es fácil hacer esto simplemente iniciando hg en los directorios del proyecto. Pero, ¿se puede hacer conservando la historia? ¿O hay una mejor manera de organizar esto?

EDITAR ::::

Gracias a la respuesta de Ry4an, yo era capaz de lograr mi objetivo. Quería compartir cómo lo hice aquí para otros.

Como teníamos muchos proyectos por separado, escribí un pequeño script bash para automatizar la creación de los mapas de archivos y para crear el script bat final para hacer la conversión. Lo que no fue del todo evidente por la respuesta, es que el comando de conversión debe ejecutarse una vez para cada archivo de archivo, para producir un repositorio separado para cada proyecto. Esta secuencia de comandos se colocará en el directorio sobre una copia de trabajo svn que ha convertido previamente. Utilicé la copia de trabajo ya que la estructura de archivos coincide mejor con lo que quería que fueran los repos hg finales.

#!/bin/bash 

# this requires you to be in: /path/to/svn/working/copy/, and issue: ../filemaplister.sh ./ 

for filename in * 
do 
    extension=${filename##*.} #$filename|awk -F . '{print $NF}' 
    if [ "$extension" == "sln" -o "$extension" == "suo" -o "$extension" == "vsmdi" ]; then 
    base=${filename%.*} 
    echo "#$base.filemap" >> "$base.filemap" 
    echo "include $filename" >> "$base.filemap" 
    echo "C:\Applications\TortoiseHgPortable\hg.exe convert --filemap $base.filemap ../hg-datesort-converted ../hg-separated/$base > $base.convert.output.txt" >> "MASTERGO.convert.bat" 
    else 
    echo "#$filename.filemap" >> "$filename.filemap" 
    echo "include $filename" >> "$filename.filemap" 
    echo "rename $filename ." >> "$filename.filemap" 
    echo "C:\Applications\TortoiseHgPortable\hg.exe convert --filemap $filename.filemap ../hg-datesort-converted ../hg-separated/$filename > $filename.convert.output.txt" >> "MASTERGO.convert.bat" 
    fi 
done; 

mv *.filemap ../hg-conversion-filemaps/ 
mv *.convert.bat ../hg-conversion-filemaps/ 

Este script se ve en cada archivo en una copia de trabajo SVN, y dependiendo del tipo o bien crea un nuevo archivo FileMap o añade a una ya existente. El si solo es para capturar varios archivos visuales de estudio y colocarlos en un repositorio separado. Esto se debe ejecutar en bash (cygwin en mi caso), pero ejecutar el comando de conversión real se logra a través de la versión de hg enviada con TortoiseHg debido a problemas de bifurcación/proceso en Windows (gah, lo sé ...).

Ejecuta el archivo MASTERGO.convert.bat, que examina el repositorio de hg convertido, y crea repositorios separados utilizando el mapa de archivos suministrado. Una vez que se completa, hay una carpeta llamada hg-separated que contiene una carpeta/repositorio para cada proyecto, así como una carpeta/repositorio para cada solución. Luego debe clonar manualmente todos los proyectos en un repositorio de soluciones y agregar los clones al archivo .hgsub. Después de confirmar, se crea un archivo .hgsubstate y está listo para continuar.

Con el ejemplo anterior, mi archivo .hgsub tiene este aspecto de "producto1":

Product1.Domain = /absolute/path/to/Product1.Domain 
Product1.Stresstester = /absolute/path/to/Product1.Stresstester 
Product1.Web = /absolute/path/to/Product1.Web 
Product1.Web.Tests = /absolute/path/to/Product1.Web.Tests 

Una vez puedo transferir estos repos a un servidor central, que va a cambiar manualmente las rutas a ser URL .

Además, no hay ningún análogo al repositorio svn inicial de OurPlatform, ya que todo está separado ahora.

¡Gracias nuevamente!

Respuesta

28

Esto se puede hacer absolutamente. Querrá usar el comando hg convert. Este es el proceso que haría uso:

  1. Convertir todo a un único repositorio hg utilizando hg convert con un tipo de fuente de SVN y un tipo dest de Hg (suena como que ya has hecho este paso)
  2. crear una colección de filemap archivos para su uso con --filemap opción hg convert 's
  3. hg convert plazo con tipo de fuente y dest hghg tipo y la fuente de ser el repositorio mercurial creado en el paso uno - y hacerlo para cada uno de los filemaps que ha creado en el paso dos.

La sintaxis FileMap se muestra en la salida hg help convert, pero aquí está el quid:

The filemap is a file that allows filtering and remapping of files and 
directories. Comment lines start with '#'. Each line can contain one of 
the following directives: 

    include path/to/file 

    exclude path/to/file 

    rename from/file to/file 

Así que en su ejemplo sus filemaps se vería así:

# this is Core.filemap 
include Core 
rename Core . 

Tenga en cuenta que si tener un incluir que la exclusión de todo lo demás está implícito. También esa línea de cambio de nombre termina en un punto y mueve todo en un nivel.

# this is Core.Tests 
include Core.Tests 
rename Core.Tests . 

y así sucesivamente.

Una vez que haya creado los repositorios divididos para cada uno de los repositorios nuevos, puede eliminar el repositorio inicial de has-everything creado en el paso uno y comenzar a configurar su configuración de subrepo en los archivos .hgsub.

+0

Gracias, esto fue perfecto! – Andrew

+5

Si esto no funciona, recuerde que debe llamar a 'hg update' en el repositorio nuevo para que se muestren los archivos. Me perdí esta parte ... – bsk

+0

Es cierto, su nuevo repositorio tiene el historial, pero no obtiene una copia en el directorio de trabajo hasta que 'hg update' –

Cuestiones relacionadas