repositorio - git push origin master
¿Cómo importar y mantener actualizado un repositorio de CVS en Git? (3)
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 repositorio vacío de git como de costumbre, por ejemplo:
git cvsimport -C RepoName -r cvs -o master -k -v -d:pserver:[email protected]:/cvsroot/path ModuleName
También puede usar la herramienta cvs2git
, que puede convertir un repositorio de CVS a git. Sin embargo, debe tener acceso a un directorio CVSROOT.
Verifique la cvs2git para conocer los pasos de instalación.
Ejemplo de uso:
cvs2git --blobfile=git-blob.dat --dumpfile=git-dump.dat --username=cvs2git /path/to/cvs/repo
Esto crearía dos archivos de salida en formato de importación rápida de git. Los nombres de estos archivos están especificados por su archivo de opciones o argumentos de línea de comandos. En el ejemplo, estos archivos se llaman cvs2git-tmp/git-blob.dat
y cvs2git-tmp/git-dump.dat
.
Estos archivos se pueden importar al repositorio de git vacío de la siguiente manera:
cat git-blob.dat git-dump.dat | git fast-import
A continuación, elimine la rama TAG.FIXUP
y ejecute gitk --all
para ver los resultados de la conversión.
Busque más, ejecutando: cvs2git --help
.
Hay un repositorio 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:
- ramas de importación,
- obteniendo la historia en formato GIT, y
- exportando mis cambios / confirmaciones al servidor 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.
Creo que no hay una receta lista para usar en su caso. Pero puedes intentar lo siguiente:
- Sincronización manual de datos de CVS con Git, o escribir scripts para eso. Obtendrá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 repositorio de CVS a Git usando cvs2git como
git cvsimport
. Y pídale a Git que pretenda ser CVS para otros desarrolladores, usandogit cvsserver
.
Lo que he hecho en el pasado es:
Importar el repositorio de CVS
Utilizando:
$ git cvsimport -C target-cvs -r cvs -k -vA authors-file.txt -d $CVSROOT module
Dónde:
-
target-cvs
es el directorio para guardar mi copia local del repositorio. -
cvs
es el nombre que se debe usar para hacer referencia al repositorio remoto. Por lo tanto, tendrécvs/master
,cvs/HEAD
, etc. apuntados localmente por elmaster
. -
authors-file.txt
es el archivo que contiene las coincidencias entre la cuenta CVS y Name + email, cada línea contieneuserid=User Name <useremail@hostname>
-
$CVSROOT
es el servidor de repositorio de CVS. Si uso una clonación anónima desde algún repositorio de sourceforge, entonces usaría:pserver:anonymous@project_name.cvs.sourceforge.net:/cvsroot/project_name
-
module
es el módulo dentro del repositorio que quiero clonar. Si el repositorio tiene solo un módulo, es probable que sea el mismo queproject_name
.
Actualiza el repositorio
Es posible repetir el comando que escribí previamente. En ese ejemplo particular, debe ejecutarse en el directorio 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 repositorio 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 rama. Para esto, uso un flujo de trabajo descrito en " Un modelo 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 función.
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 ramas dependen de otras, pero aún son manejables. Micro commits ayuda mucho (como en cualquier flujo de trabajo git).
Si cada rama 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 comando 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 repositorio 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 .