Migrar de CS-RCS a Mercurial

He estado utilizando CS-RCS Basic de ComponentSoftware durante muchos años para administrar mis diversos proyectos de desarrollador único. Me ha funcionado muy bien, pero ahora quiero migrar a un moderno sistema de control de revisiones y, después de estudiar mis opciones, me decidí por Mercurial.

El problema es que siempre he usado un repository central para CS-RCS, y ahora me gustaría usar repositorys Mercurial individuales para proyectos individuales, manteniendo el historial de mi repository RCS.

Después de search en Google en profundidad, concluí que la única forma de hacerlo es convertir mi repository RCS a repositorys CVS individuales, y luego convertirlos a Mercurial. Estos dos sitios fueron probablemente los más útiles:

  • Convirtiendo un directory de RCS a Mercurial
  • Convertir Extensión para Mercurial

De acuerdo con la idea de Jeff Atwood de preguntar y responder a mi propia pregunta, voy a responder esto para cualquier otra persona atrapada en esta situación, y en caso de que tenga que volver a encontrarla más tarde. Como verá, aunque encontré una solución, es torpe y tiene al less un problema importante. Si alguien más tiene un método mejor, ciertamente me gustaría saberlo.

Este es el método que se me ocurrió, las verrugas y todo. Es un poco 'culty carga', ya que básicamente no sé nada sobre CVS y no mucho (todavía) sobre Mercurial:

Tengo una máquina virtual de Windows XP de la que puedo tomar instantáneas, así que lo hice y luego instalé CVSNT y la versión de command-line de Windows de Mercurial (utilizo TortoiseHg en mi máquina principal). Hice esto en una máquina virtual para poder deshacerme fácilmente de CVSNT, Mercurial y cualquier otra cosa que tuviera que crear mientras hacía esta única migration. Sí, probablemente no tuve que hacer esto, pero la máquina virtual ya estaba disponible y ya tengo bastantes bits extraños de aplicaciones de ciclos de installation / desinstallation a lo largo de los años. 🙂

Por lo que pude ver, CVSNT era el único progtwig disponible que podía configurar fácilmente un server CVS en una máquina con Windows. Parece que esto fue gratis al mismo time, pero el sitio actual del propietario ahora pide dinero. Eso no es algo malo, pero realmente no podía justificar gastar dinero solo para hacer una conversión de una sola vez. Eventualmente rastreé una versión anterior de CVSNT con una búsqueda en Google e instalé eso sin problemas.

Aquí están las notas que tomé mientras aprendía cómo hacer que esta conversión funcione:

La versión larga

Copie la carpeta de código fuente que necesita desde la unidad principal de la computadora a la unidad de la VM. Copie los diversos files ", v" de la estructura de carpetas C: \ RCS a esta misma carpeta de código fuente en la máquina virtual. Solo copie los files v de la carpeta correspondiente en C: \ RCS. Abra un cuadro de símbolo del sistema en la máquina virtual y escriba lo siguiente:

path %PATH%;C:\Program Files\cvsnt mkdir \cvs-repo [or clean the folder out if it already exists] cvs -d \cvs-repo init [A DIR of \cvs-repo should show a CVSROOT folder in there.] 

Haga una copy de su carpeta de código fuente en \cvs-repo . \cvs-repo ahora debería tener solo dos carpetas: CVSROOT y su nueva carpeta. Copie también los files ", v" apropiados.

 mkdir \cvs-checkout [or clean that folder out if it already exists] cd \cvs-checkout cvs -d \cvs-repo co name_of_your_source_code_folder 

Un DIR de "\ cvs-checkout \ name_of_your_source_code_folder" debería mostrar todos sus files de código fuente, que ahora están desprotegidos de CVS.

Si aún no lo ha hecho, descargue Mercurial de https://www.mercurial-scm.org/ e instálelo. Abra una copy del Bloc de notas y arrastre el file "C: \ Archivos de progtwig \ Mercurial \ hgrc.d \ Mercurial.rc" en él. Debajo de "[extensiones]", elimine el punto y coma al comienzo de la línea " ;convert = ". Guarde el file en "C: \ Documents and Settings \ user_name \ Mercurial.ini"

De vuelta en la línea de command de VM:

 path %PATH%;C:\Program Files\Mercurial mkdir \my-repo.hg [or clean that folder out if it already exists] hg convert --datesort \cvs-checkout\source_code_folder_name \my-repo.hg cd \my-repo.hg [A DIR of \my-repo.hg should show a new ".hg" folder.] hg update [A DIR should now show the ".hg" folder and all the checked-out files.] 

Copie la carpeta ".hg" de \ my-repo a la carpeta del código fuente en el disco duro de su computadora principal. La carpeta de destino ahora aparecerá en TortoiseHg con todo el historial de cambios apropiado, pero todos los files marcados como Modificados (icono superpuesto de un signo de exclamación en un círculo rojo). Esto se debe a que el nuevo repository de Mercurial cree que los files se registraron con terminaciones de línea Unix (0x0A) en lugar de Windows (0x0D, 0x0A). Esto parece suceder en el process de "conversión de hg", y no he encontrado ninguna forma de evitarlo.

La versión corta

Una vez que todo está configurado en la máquina virtual, esto es lo que debe hacer:

  • Elimine todo en \ cvs-repo, \ cvs-checkout y \ my-repo.hg.
  • En la línea de command, cvs -d \cvs-repo init .
  • De vuelta en su máquina principal, copie la carpeta de código fuente en la carpeta compartida de su Máquina Virtual (así es como lo hace en VirtualBox, otro software de VM podría permitirle drag and drop la carpeta en la VM).
  • Copie los files ", v" apropiados en la carpeta del código fuente en la carpeta compartida de la máquina virtual.
  • De vuelta en la máquina virtual, mueva la carpeta de código fuente a \ cvs-repo.
  • cd \cvs-checkout
  • cvs -d \cvs-repo co name_of_your_source_code_folder
  • hg convert --datesort \cvs-checkout\name_of_your_source_code_folder \my-repo.hg
  • cd \my-repo.hg
  • hg update
  • Copie la carpeta .hg de \ my-repo a la unidad L: en la máquina virtual (L es la letra de unidad asignada de la carpeta compartida de mi máquina virtual).
  • Mueva esa carpeta de la carpeta de transferencia de la Máquina Virtual a la carpeta final de código fuente en la computadora host.

Archivo por lotes útil

Una vez que lo hice funcionar, configuré este file por lotes en la VM para automatizar el process tanto como sea posible:

 @echo off rem Converts source code under RCS control to a Mercurial repository. rem This batch takes one argument: the name of the source-code folder (in quotes if necessary). rem rem This is for a VirtualBox VM that already has CVSNT and Mercurial installed, and has a Shanetworking Folder mapped to drive L. @echo On the host, copy the source-code folder into the Virtual Machine Transfer folder. Copy the appropriate ",v" files into the source-code folder in the Virtual Machine Transfer folder. pause @echo on cd \ rmdir /S/Q \cvs-repo mkdir \cvs-repo rmdir /S/Q \cvs-checkout mkdir \cvs-checkout rmdir /S/Q \my-repo.hg mkdir \my-repo.hg cvs -d \cvs-repo init xcopy L:\%1 \cvs-repo\%1 /E/I cd \cvs-checkout cvs -d \cvs-repo co %1 hg convert --datesort %1 \my-repo.hg cd \my-repo.hg hg update xcopy \my-repo.hg\.hg L:\.hg /E/I 

Conclusión

Entonces, todo funcionó, pero me dejaron files que tenían terminaciones de línea incorrectas. Al ver esta pregunta , veo que no soy el único con este problema. Puedo vivir con esto, pero aún me gustaría arreglarlo si alguien sabe de una solución.

Si Mercurial tiene soporte de import rápida / export rápida, y si sus repositorys de files múltiples no usan sucursales, probablemente pueda intentar usar mi herramienta rcs-fast-export (disponible en http://git.oblomov.eu/rcs -fast-export ). Aunque solo lo he usado para exportar de RCS a git hasta ahora, no conozco ningún command de export rápida específico de git que se use para que funcione.