El Sistema de Versiones Concurrentes ( CVS , o Concurrent Versioning System ) es un sistema de control de versiones desarrollado originalmente por Dick Grune en julio de 1986. [4]
CVS funciona como interfaz para el Sistema de Control de Revisiones (RCS), un sistema de control de versiones más antiguo que administra archivos individuales pero no proyectos completos. Amplía el RCS al agregar soporte para el seguimiento de cambios a nivel de repositorio y un modelo cliente-servidor. [5] Los archivos se rastrean utilizando el mismo formato de historial que en RCS, con un directorio oculto que contiene un archivo de historial correspondiente para cada archivo en el repositorio.
CVS utiliza la compresión delta para almacenar de manera eficiente las distintas versiones del mismo archivo. Esto funciona bien con archivos de texto grandes con pocos cambios de una versión a la siguiente. Este suele ser el caso de los archivos de código fuente. Por otro lado, cuando se le indica a CVS que almacene un archivo como binario, mantendrá cada versión individual en el servidor. Esto se utiliza normalmente para archivos que no son de texto, como imágenes ejecutables, donde es difícil crear deltas compactos entre versiones.
CVS excluye los enlaces simbólicos porque, cuando se almacenan en un sistema de control de versiones, pueden suponer un riesgo de seguridad. Por ejemplo, se puede almacenar un enlace simbólico a un archivo confidencial en el repositorio, lo que hace que el archivo confidencial sea accesible incluso cuando no está registrado. En lugar de enlaces simbólicos, se pueden registrar en CVS los scripts que requieren ciertos privilegios e intervención consciente para ejecutarse. [ cita requerida ]
CVS etiqueta un único proyecto (conjunto de archivos relacionados) que administra como módulo . Un servidor CVS almacena los módulos que administra en su repositorio . Los programadores adquieren copias de los módulos mediante el método de extracción . Los archivos extraídos sirven como copia de trabajo , sandbox o espacio de trabajo . Los cambios en la copia de trabajo se reflejan en el repositorio mediante su confirmación . Actualizar es adquirir o fusionar los cambios en el repositorio con la copia de trabajo.
CVS utiliza una arquitectura cliente-servidor : un servidor almacena la(s) versión(es) actual(es) de un proyecto y su historial, y los clientes se conectan al servidor para "extraer" una copia completa del proyecto, trabajar en esta copia y luego "registrar" sus cambios. Los servidores CVS pueden permitir "acceso de lectura anónimo", [6] en el que los clientes pueden extraer y comparar versiones con una contraseña en blanco o publicada (por ejemplo, "anoncvs"); solo el registro de cambios requiere una cuenta y contraseña personal en estos escenarios. Varios desarrolladores pueden trabajar en el mismo proyecto simultáneamente, cada uno editando archivos dentro de su propia "copia de trabajo" del proyecto y enviando (o registrando ) sus modificaciones al servidor. Para evitar conflictos, el servidor solo acepta cambios realizados a la versión más reciente de un archivo. Por lo tanto, se espera que los desarrolladores mantengan su copia de trabajo actualizada incorporando los cambios de otras personas de manera regular. Esta tarea la gestiona en su mayor parte de forma automática el cliente CVS, que sólo requiere intervención manual cuando surge un conflicto de edición entre una modificación registrada y la versión local aún no registrada de un archivo. Los clientes también pueden utilizar el comando "update" para actualizar sus copias locales con la versión más reciente del servidor. Los clientes también pueden comparar versiones, solicitar un historial completo de cambios o consultar una instantánea histórica del proyecto (por ejemplo, en función de una fecha determinada). Si la operación de registro tiene éxito, los números de versión de todos los archivos implicados se incrementan automáticamente y el servidor escribe una línea de descripción proporcionada por el usuario, la fecha y el nombre del autor en sus archivos de registro . CVS también puede ejecutar scripts de procesamiento de registros externos especificados por el usuario después de cada confirmación. Estos scripts se instalan mediante una entrada en loginfo
el archivo de CVS, que puede activar una notificación por correo electrónico o convertir los datos de registro a un formato basado en la Web.
CVS también puede mantener diferentes "ramas" de un proyecto. Por ejemplo, una versión publicada del proyecto de software puede formar una rama, utilizada para corregir errores, mientras que una versión en desarrollo actual, con cambios importantes y nuevas características, puede formar una rama separada. CVS asume que la mayoría del trabajo se lleva a cabo en el tronco y que las ramas generalmente deben ser de corta duración o históricas. Cuando se utilizan como están diseñadas, las ramas se administran fácilmente y las operaciones de las ramas son eficientes y rápidas. [7] [8]
El software del servidor normalmente se ejecuta en Unix (aunque al menos el servidor CVSNT también admite varias versiones de Microsoft Windows ), mientras que los clientes CVS pueden ejecutarse en cualquier plataforma de sistema operativo principal .
Grune recordó: [9]
Creé CVS para poder colaborar con mis estudiantes, Erik Baalbergen y Maarten Waage, en el compilador de C ACK ( Amsterdam Compiler Kit ). Los tres teníamos horarios muy diferentes (un estudiante trabajaba de 9 a 5, el otro era irregular y yo sólo podía trabajar en el proyecto por las tardes). Su proyecto duró desde julio de 1984 hasta agosto de 1985. CVS se llamó inicialmente cmt, por la obvia razón de que nos permitía enviar versiones de forma independiente.
Grune publicó el código públicamente el 23 de junio de 1986. [10]
El código que finalmente evolucionó hasta convertirse en la versión actual de CVS fue creado por Brian Berliner en abril de 1989, con aportes posteriores de Jeff Polk y muchos otros colaboradores. Brian Berliner escribió un artículo en el que presentaba sus mejoras al programa CVS, en el que se describe cómo Prisma, un desarrollador externo que trabajaba en el núcleo de SunOS, amplió y utilizó la herramienta internamente, y se publicó para beneficio de la comunidad bajo la licencia GPL. [11] El 19 de noviembre de 1990, la versión 1.0 de CVS fue enviada a la Free Software Foundation para su desarrollo y distribución. [12]
La última versión se publicó el 8 de mayo de 2008. [13]
En el mundo del software de código abierto, el Sistema de Versiones Concurrentes (CVS, por sus siglas en inglés) ha sido durante mucho tiempo la herramienta preferida para el control de versiones. Y con razón. El CVS en sí es software libre, y su modus operandi no restrictivo y su compatibilidad con el funcionamiento en red (que permite que docenas de programadores dispersos geográficamente compartan su trabajo) se adaptan muy bien a la naturaleza colaborativa del mundo del código abierto. El CVS y su modelo de desarrollo semi-caótico se han convertido en piedras angulares del código abierto. [14]
Con el tiempo, los desarrolladores han creado nuevos sistemas de control de versiones basados en CVS para agregar funciones, alterar el modelo operativo y mejorar la productividad de los desarrolladores. Los proyectos de reemplazo de CVS incluyen CVSNT y Subversion . [15] [16]