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!
Gracias, esto fue perfecto! – Andrew
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
Es cierto, su nuevo repositorio tiene el historial, pero no obtiene una copia en el directorio de trabajo hasta que 'hg update' –