visual-studio - visual - vs code autoclose html
Divida el repo grande en múltiples subrepos y conserve la historia(Mercurial) (1)
Tenemos una gran base de código que contiene varios proyectos compartidos, archivos de soluciones, 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 que la clonación para la bifurcación tenga menos sobrecarga. Ya he convertido con éxito nuestro repositorio de SVN a Mercurial a la vez que conservo la historia. Mi pregunta: ¿cómo puedo dividir los diferentes proyectos en repositorios separados y al mismo tiempo preservar su historia?
Este es un ejemplo de cómo se ve actualmente nuestro repositorio único (OurPlatform):
/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 estas son carpetas que contienen Proyectos VS, excepto los archivos de la 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). Luego, si alguien iba a trabajar en Producto1, clonaría el repositorio Producto1, que contenía las referencias de Product1.sln y subrepo a los Conjuntos de referencia, Core, Core.Tests, Database, Database.Tests, CMS y CMS.Tests.
Por lo tanto, es fácil hacer esto simplemente iniciando en los directorios del proyecto. ¿Pero se puede hacer preservando la historia? ¿O hay una mejor manera de arreglar esto?
EDITAR::::
Gracias a la respuesta de Ry4an, pude lograr mi objetivo. Quería compartir cómo lo hice aquí para otros.
Como teníamos muchos proyectos separados, escribí un pequeño script de bash para automatizar la creación de los mapas de archivo y para crear el script de bat final para hacer la conversión. Lo que no fue completamente evidente a partir de la respuesta, es que el comando de conversión debe ejecutarse una vez para cada mapa de archivos, para producir un repositorio separado para cada proyecto. Este script se colocará en el directorio sobre una copia de trabajo svn que usted haya convertido previamente. Utilicé la copia de trabajo ya que la estructura de archivos coincidía con lo que yo quería que fueran los nuevos repositorios 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/
Esta secuencia de comandos examina cada archivo en una copia de trabajo svn y, según el tipo, crea un nuevo archivo de mapa de archivos o se agrega a uno existente. El if es realmente solo para capturar varios archivos de estudio visual, y colocarlos en un repositorio separado. Está pensado para ejecutarse en bash (cygwin en mi caso), pero ejecutar el comando de conversión real se realiza a través de la versión de hg que se incluye con TortoiseHg debido a problemas de bifurcación / proceso en Windows (gah, lo sé ...).
Así que ejecuta el archivo MASTERGO.convert.bat, que analiza su repositorio hg convertido y crea repositorios separados utilizando el mapa de archivos provisto. Una vez que se completa, hay una carpeta llamada hg-separados que contiene una carpeta / repo para cada proyecto, así como una carpeta / repo para cada solución. Luego, tiene que 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 ya está listo para comenzar.
Con el ejemplo dado arriba, mi archivo .hgsub se ve así para "Product1":
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 que transfiera estos repositorios a un servidor central, cambiaré manualmente las rutas para que sean las URL.
Además, no hay un análogo al repositorio inicial de OurPlatform svn, ya que todo está separado ahora.
¡Gracias de nuevo!
Esto se puede hacer absolutamente. Querrás usar el comando hg convert
. Aquí está el proceso que usaría:
- convierta todo a un solo repositorio de hg usando
hg convert
con un tipo de fuente de svn y un tipo de hg de destino (parece que ya ha hecho este paso) - cree una colección de archivos de
filemap
archivos para usar con la opción--filemap
hg convert
'' - ejecute
hg convert
con el tipo de fuentehg
y el tipo de destinohg
y la fuente es el repositorio de mercurial creado en el paso uno, y hágalo para cada uno de los mapas de archivos que creó en el paso dos.
La sintaxis del mapa de archivos se muestra en la salida de hg help convert
, pero aquí está la esencia:
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
Entonces, en tu ejemplo, tus mapas se verían así:
# this is Core.filemap
include Core
rename Core .
Tenga en cuenta que si tiene una inclusión, la exclusión de todo lo demás está implícita. Además, la línea de cambio de nombre termina en un punto y mueve todo un nivel hacia arriba.
# this is Core.Tests
include Core.Tests
rename Core.Tests .
y así.
Una vez que haya creado los repositorios desglosados para cada uno de los nuevos repositorios, puede eliminar el repositorio inicial de has-everything creado en el paso uno y comenzar a configurar su configuración de .hgsub
en archivos .hgsub
.