¿Cómo importar y mantener actualizado un repository de CVS en Git?

Hay un repository central en CVS, y me gustaría usarlo con Git localmente, y luego enviar mis cambios a CVS.

¿Qué puedo lograr eso diariamente?

Las tareas que me gustaría lograr son:

  • twigs de import,
  • obteniendo la historia en formatting GIT, y
  • exportando mis cambios / confirmaciones al server centralizado

Por cierto, también he analizado las mejores prácticas para usar git con CVS . Pero no funcionó y no pude averiguar qué me perdí o qué hice mal.

Lo que he hecho en el pasado es:

Importar el repository de CVS

Utilizando:

 $ git cvsimport -C target-cvs -r cvs -k -vA authors-file.txt -d $CVSROOT module 

Dónde:

  • target-cvs es el directory para save mi copy local del repository.
  • cvs es el nombre que se debe usar para hacer reference al repository remoto. Por lo tanto, tendré cvs/master , cvs/HEAD , etc. apuntados localmente por el master .
  • authors-file.txt es el file que contiene las coincidencias entre la count CVS y Name + email, cada línea contiene userid=User Name <useremail@hostname>
  • $CVSROOT es el server de repository de CVS. Si uso una clonación anónima desde algún repository de sourceforge, entonces usaría :pserver:anonymous@project_name.cvs.sourceforge.net:/cvsroot/project_name
  • module es el module dentro del repository que quiero clonar. Si el repository tiene solo un module, es probable que sea el mismo que project_name .

Actualiza el repository

Es posible repetir el command que escribí previamente. En ese ejemplo particular, debe ejecutarse en el directory principal de target-cvs . Para hacerlo más fácil en el futuro, es posible que desee configurar algunas variables (puede leer más detalles en la respuesta de " Cómo exportar el historial de revisión de mercurial o git a cvs? " )

 $ git cvsimport 

Eso sería suficiente para mantener el repository local en git sincronizado con el remoto en CVS.

Trabajo diario

A partir de ahora, cada cambio debería ir en una sucursal local de git. Una característica, una twig. Para esto, uso un flujo de trabajo descrito en " Un model de ramificación de Git exitoso ". La única diferencia es que el maestro apunta a CVS, pero conceptualmente los mismos flujos de trabajo se pueden aplicar aquí. Es solo una convención.

Una vez que su compromiso se inserta en CVS, volverá a ser maestro en la próxima actualización ( git cvsimport ). Luego, puede eliminar la sucursal local que implementó esa function.

Para el trabajo en progreso (en sucursales locales), debe rebase a rebase una base contra el maestro. Debido a que tiene las funciones separadas, debería ser más fácil resolver conflictos. La parte difícil es cuando algunas twigs dependen de otras, pero aún son manejables. Micro commits ayuda mucho (como en cualquier flujo de trabajo git).

Si cada twig local se actualiza y el maestro nunca se toca (excepto las actualizaciones), entonces git cvsexportcommit debería funcionar. Recuerde, funciona para un compromiso. Es un poco tedioso, pero es mejor que nada. Dado el ejemplo anterior, el command debería ser algo así como:

 $ git cvsexportcommit -vc commit-id 

Si solo tiene acceso de solo lectura al CVS remoto, puede enviar los parches por correo electrónico o hacer que su repository git sea público, para que los commiters puedan tomar sus parches para aplicarlos. Nada diferente de un flujo de trabajo normal de CVS en este caso. Nuevamente, en la próxima actualización verá los cambios en el maestro .

Con la versión más reciente, git cvsimport está roto, debido a la incompatibilidad de la herramienta cvsps .

Entonces debes instalar cvsps-2.1 .

En OSX puedes (tener brew ):

 brew tap homebrew/versions brew install cvsps2 brew unlink cvsps brew link --overwrite cvsps2 

E importar en el repository vacío de git como de costumbre, por ejemplo:

 git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:anonymous@reponame.cvs.sourceforge.net:/cvsroot/path ModuleName 

También puede usar la herramienta cvs2git , que puede convertir un repository de CVS a git. Sin embargo, debe tener acceso a un directory CVSROOT.

Verifique la documentation de cvs2git para conocer los pasos de installation.

Ejemplo de uso:

 cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git /path/to/cvs/repo 

Esto crearía dos files de salida en formatting de import rápida de git. Los nombres de estos files están especificados por su file de opciones o arguments de command-line. En el ejemplo, estos files se llaman cvs2git-tmp/git-blob.dat y cvs2git-tmp/git-dump.dat .

Estos files se pueden importar al repository de git vacío de la siguiente manera:

 cat git-blob.dat git-dump.dat | git fast-import 

A continuación, elimine la twig TAG.FIXUP y ejecute gitk --all para ver los resultados de la conversión.

Busque más, ejecutando: cvs2git --help .

Creo que no hay una receta list para usar en su caso. Pero puedes intentar lo siguiente:

  • Sincronización manual de datos de CVS con Git, o escribir scripts para eso. Recibirán información de CVS y la enviarán a Git. Esto te dará un poco de historia en Git. No completamente limpio, no completamente utilizable, pero aún así.
  • Migre su repository de CVS a Git usando herramientas como git cvsimport . Y pídale a Git que pretenda ser CVS para otros desarrolladores, usando git cvsserver .