# Tutorial de uso de CVS/Uso de CVS
## Modo de uso

A continuación se propone una sencilla metodología de trabajo con CVS para evitar acciones redundantes. Piense por ejemplo en la eliminación de erratas o errores en documentos o en código fuente.
Antes de cada sesión de trabajo es conveniente hacer cvs update -Pd para asegurarnos de que disponemos de las últimas modificaciones registradas en el repositorio.
Justo al acabar cada sesión de trabajo es conveniente hacer cvs commit (se puede abreviar en cvs ci) para que todas nuestras modificaciones se registren en el repositorio.

## Añadir nuevos módulos al repositorio

Para añadir nuevos modulos al repositorio se usa la orden cvs import, que le indica a CVS que debe crear una copia en el repositorio del conjunto de ficheros del directorio actual.
Por ello, para importar un nuevo módulo al repositorio debemos situarnos primero en el directorio raíz del módulo donde están los ficheros del mismo y ejecutar la orden:
Donde:
* nombre-módulo: es el nombre que le queremos dar al nuevo módulo.
* etiqueta-vendedor: es el nombre que usa CVS para etiquetar la rama que crea con la importación. Puede ser una cadena cualquiera de letras, números y subrayados.
* etiqueta-versión: es el nombre que usa CVS para etiquetar la versión concreta que se crea con esta importación. Puede ser una cadena cualquiera de letras, números y subrayados.

## Descargar un módulo por primera vez

Para crear una copia de trabajo local del módulo CVS deseado debemos usar la orden cvs checkout (abreviable como cvs co):
Esto creará una jerarquía de directorios donde se almacenará la copia local de trabajo el módulo. Este paso sólo hay que hacerlo una vez por cada módulo.
A partir de este momento no es necesario configurar las variables de entorno porque CVS sabe a qué repositorio pertenece el módulo con sólo examinar los subdirectorios CVS. No se debe modificar nunca esos subdirectorios a mano. De lo contrario CVS perderá la pista de a que módulo pertenecen los ficheros, cuáles son las versiones de la copia local, etc.

## Actualizar nuestra copia local desde el repositorio

Cuando queramos actualizar la copia local de trabajo del módulo con los cambios que hayan podido hacer otros usuarios y que están recogidos en el repositorio deberemos emplear la orden update:

## Publicar nuestras modificaciones en el repositorio

Se usa la orden commit (o su equivalente ci):
Tras lo cual el sistema mostrará la pantalla de un editor de textos (el que tengamos configurado como nuestro favorito en la variable de entorno EDITOR) para que introduzcamos el mensaje de log, una o dos líneas describiendo los cambios realizados en el módulo desde el último commit.
Algunas opciones que admite la orden commit son:
* -l : Solamente se aplica a los ficheros del directorio actual, no a sus subdirectorios.
* -R : Se aplica a los subdirectorios de forma recursiva (por defecto).
* -F fichero: Lee el mensaje de log de un fichero, en lugar de invocar al editor.
* -m "mensaje" : Permite indicar el mensaje de log (debe ir entre comillas), en lugar de invocar al editor.
* -f: Obliga a realizar un commit sobre un fichero incluso si no hemos hecho modificaciones al mismo.

## Resolución de conflictos

Habrá ocasiones en las que tengamos que resolver los conflictos que surjan entre diferentes versiones de un módulo o fichero del mismo (recuerde que puede haber múltiples personas trabajando de forma concurrente sobre el mismo módulo) para que CVS continúe trabajando. Estos conflictos son normales cuando dos o más personas modifican a la vez exactamente la mismas partes de un fichero.
El procedimiento es simple:
1. CVS se quejará de un fichero al hacer un update o un commit.
2. Editamos ese fichero y encontraremos marcas del tipo:
3. El texto entre marcas es el que produce el conflicto. Hay que elegir qué modificación nos gusta y borramos todo lo demás.
4. Si no quedan más conflictos volvemos a hacer el commit o update.

## Añadir ficheros al módulo

No olvide que CVS controlará sólo los ficheros que se hayan descargado inicialmente desde el repositorio. Cualquier otro fichero o directorio de la jerarquía del módulo CVS será ignorado.
Si quiere añadir un nuevo fichero o directorio al módulo CVS hay que emplear la orden cvs add:
Si el fichero es binario (por ejemplo, una imagen .jpg) hay que tener la precaución de añadir la opción -kb:
¿Por qué?, se preguntará el lector más intrépido. Resulta que CVS usa varias variables (en realidad son de RCS, que funciona por debajo de CVS). Si el fichero es binario es posible que se dé una combinación de bytes que coincidan con alguna de estas variables. Si así fuera, RCS/CVS modificaría el contenido y lo corrompería. También se debe a que el sistema de cálculo de diferencias que usan estos sistemas no está diseñado para trabajar con información binaria. Si se obra equivocadamente es probable que corrompamos los datos.
También quiero señalar que si bien se pueden gestionar ficheros binarios, no se hará control de versiones de los mismos. Sólo se guardará la última versión (al no disponer CVS de la funcionalidad necesaria para calcular diferencias de ficheros binarios).
Tras la orden cvs add hay que hacer ejecutar de nuevo la orden cvs commit para incluir los nuevos ficheros en el repositorio CVS.
Algunas opciones que admite la orden add son:
* -ka : Trata los ficheros añadidos como texto ASCII (por defecto)
* -kb : Trata los ficheros añadidos como binarios.
* -m "mensaje" : Permite indicar el comentario inicial con que se añeden los ficheros (el mensaje debe ir entre comillas)

## Eliminar ficheros del módulo CVS

Para eliminar un fichero del módulo CVS hay que emplear la orden cvs remove , despues de haber borrado el fichero de la copia local de trabajo (se puede usar cvs rm como abreviatura):
Si queremos borrar físicamente los ficheros a la vez que los eliminamos del módulo deberemos usar:

## Ver diferencias respecto al repositorio

Podemos pedir a CVS que compare todos los ficheros de nuestra copia local del proyecto con los ficheros del repositorio mediante el comando cvs diff:
La orden anterior produce un listado de todos ficheros modificados y sus diferencias, en el mismo formato que emplean las herramientas diff y patch de unix.
En caso de que queramos ver únicamente las diferencias de un fichero, podemos indicarlo como argumento a la orden diff
Algunas opciones que admite la orden diff son:
* -B : Ignora diferencias consistentes en añadir o eliminar únicamente líneas en blanco.
* -b : Ignora diferencias en la cantidad de espacio en blanco. Esta opción trata todos los espacios en blanco como iguales.
* -c : Añade 3 líneas de contexto por encima y debajo de las líneas de diferencia. Util para emplear con el programa patch.
* -C NUM : Como la anterior, pero emplea NUM líneas de contexto.
* -i : Ignora diferencias entre mayúsculas y minúsculas.
* -u : Muestra la salida en formato de diff unificado.
* -w : Ignora todas las diferencias de espacio en blanco. Básicamente, una versión más fuerte de -b.