{\rtf1\ansi\deff0 {\fonttbl{\f1\fnil\fcharset0 Courier New;} {\f0\fnil\fcharset0 Times New Roman;} } {\colortbl;}{\stylesheet{\s1 Heading 1;}{\s2 Heading 2;}{\s3 Heading 3;}{\s4 Heading 4;}{\s5 Heading 5;}{\s6 Heading 6;}{\s7 Heading 7;}{\s8 Heading 8;}{\s9 Heading 9;}} \deflang1024\notabind\facingp\hyphauto1\widowctrl \sectd\plain\pgwsxn11905\pghsxn16837\marglsxn1440\margrsxn1440\margtsxn1440\margbsxn1920\headery0\footery0\pgndec\titlepg{\headerf\pard\sl-240\sb770\sa430\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {}\par}{\footerf\pard\sl-240\sb770\sa910\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {\i\fs20 \chpgn }\par}{\headerl\pard\sl-240\sb770\sa430\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {\i\fs20 Uso pr\'e1ctico de CVS}\par}{\footerl\pard\sl-240\sb770\sa910\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {\i\fs20 \chpgn }\par}{\headerr\pard\sl-240\sb770\sa430\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {\i\fs20 Uso pr\'e1ctico de CVS}\par}{\footerr\pard\sl-240\sb770\sa910\plain\tqc\tx4512\tqr\tx9025 {}\tab {}\tab {\i\fs20 \chpgn }\par}\pard\sb373\sl647\qc \b\fs49 Uso pr\'e1ctico de CVS\keepn\hyphpar0\par\pard\sb216\sl449\qc \fs34 Carlos Hernando\keepn\hyphpar0\par\pard\sl260\qc \fs24 Cap\'edtulo de Estudiantes ACM\hyphpar0\par\pard\sb200\sl260\qc chernando@acm.asoc.fi.upm.es\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb400\li376\ri376\sl260 \b0\fs20\lang1034 Actualmente vivimos en la filosof\'eda \i OpenSource\i0 y hacer que nuestro c\'f3digo sea libre y abierto nos permite enviarlo a lugares en los que nunca antes podr\'edamos haber imaginado. Sin embargo a la hora de mantener software de esta forma surgen problemas para poder poner en contacto y coordinar a los desarrolladores que colaboran en el proyecto. Por suerte contamos con una herramienta que har\'e1 las cosas m\'e1s f\'e1ciles, CVS. \hyphpar0\par\pard\sb259\s2\sl449 \b\fs34\lang1024 1. Sobre este documento\keepn\hyphpar0\par\pard\sb216\s3\sl374 \fs28 1.1. Licencia\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Se otorga permiso para copiar, distribuir y/o modificar este documento bajo los t\'e9rminos de la Licencia de Documentaci\'f3n Libre GNU, Versi\'f3n 1.1 o cualquier otra versi\'f3n posterior publicada por la Free Software Foundation. Se considerar\'e1 como Secciones Invariantes todo el documento, no habiendo Textos de Portada ni Textos de Contra Portada. Puede consultar una copia de la licencia en: http://www.gnu.org/copyleft/fdl.html. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 1.2. Descargar el documento\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Las \'faltimas versiones de este documento se publican en diferentes formatos en: HTML (http://acm.asoc.fi.upm.es/~chernando/doc/cvs/), DVI (http://acm.asoc.fi.upm.es/~chernando/doc/cvs/usocvs.dvi), PDF (http://acm.asoc.fi.upm.es/~chernando/doc/cvs/usocvs.pdf), PS (http://acm.asoc.fi.upm.es/~chernando/doc/cvs/usocvs.ps) y RTF (http://acm.asoc.fi.upm.es/~chernando/doc/cvs/usocvs.rtf). \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 1.3. Estado del documento\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 En desarrollo. Se agradece cualquier sugerencia / correci\'f3n / aporte a mi e-mail (mailto:chernando@acm.asoc.fi.upm.es) \hyphpar0\par\pard\sb259\s2\sl449 \b\fs34\lang1024 2. Introducci\'f3n a CVS\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 CVS, Concurrent Versions System, es una aplicaci\'f3n cliente/servidor que se encarga de mantener un \i repositorio\i0 de software centralizado que es actualizado y distribuido desde y hacia las copias locales de los desarrolladores. Es una utilidad muy sencilla de usar ;-) \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 2.1. \'bfC\'f3mo funciona?\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 El funcionamiento es muy simple: el desarrollador se conecta con el servidor CVS y le pide la \'faltima versi\'f3n disponible del proyecto, en este paso el desarrollador puede ver que cambios se han realizado respecto a su versi\'f3n local y los conflictos que pudiera ocasionar el c\'f3digo que el desarrollador ha realizado en su copia local con el c\'f3digo que ya est\'e1 disponible en el servidor. En caso de que el c\'f3digo no sea problem\'e1tico se modifican los ficheros locales respentando los cambios del desarrollador. \hyphpar0\par\pard\sb400\sl260 El servidor CVS se encarga de manejar el hist\'f3rico de lo que ocurre, mantener un registro de los cambios realizados a cada fichero y de servirlos seg\'fan las necesidades del desarrollador. Adem\'e1s gestiona diversas utilidades para controlar en que ficheros se esta trabajando, notificar a los autores de los ficheros de los cambios... y muchas m\'e1s cosas pues es posible a\'f1adir scripts al funcionamiento a su configuraci\'f3n. \hyphpar0\par\pard\sb400\sl260 El cliente CVS del desarrollador se encarga de obtener las \'faltimas versiones disponibles (o las que necesite), de confrontarlas con las copias locales y de crear una copia local de los ficheros del proyecto que sean editables por el desarrollador. Y por supuesto de a\'f1adir el c\'f3digo del desarrollador al proyecto. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 2.2. \'bfQu\'e9 estructura tiene el servidor?\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 El servidor de CVS se encarga de mantener los ficheros que conforman nuestro proyecto de tal forma que se mantienen los cambios realizados hasta el momento, esto nos permite consultar versiones anteriores de un mismo fichero de una forma r\'e1pida y sencilla. \hyphpar0\par\pard\sb400\sl260 En la ra\'edz del servidor se encuentran los \i m\'f3dulos\i0 que est\'e1n disponibles, normalmente cada m\'f3dulo corresponde a un directorio en el ra\'edz. Los directorios que cuelgan de un directorio del ra\'edz se consideran \i subm\'f3dulos\i0 , es decir, la estructura es as\'ed: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 /Ra\'edz_CVS\sa0\par\fi0\sb0 |\sa0\par\fi0\sb0 |---/M\'f3dulo_1\sa0\par\fi0\sb0 | |\sa0\par\fi0\sb0 | |---/Subm\'f3dulo_1 del M\'f3dulo_1\sa0\par\fi0\sb0 | |---/Subm\'f3dulo_2 del M\'f3dulo_1\sa0\par\fi0\sb0 |\sa0\par\fi0\sb0 |---/M\'f3dulo_2\sa0\par\fi0\sb0 |---/CVSROOT\up7\fs10 1\up0\fs18 \sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 Los ficheros que el servidor almacena son del tipo \fs18\f1 fichero.ext,v\fs20\f0 . En estos ficheros se encuentra nuestro fichero original, los cambios realizados en las versiones anteriores y m\'e1s informaci\'f3n. Al manejarse en un formato especial debemos tener cuidado al enviar ficheros especiales como binarios y formatos de texto estricto ya que es posible que alguna combinaci\'f3n pueda ser interpretada por el servidor, veremos m\'e1s adelante la manera de marcar estos ficheros especiales. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 2.3. \'bfQu\'e9 estructura tiene el cliente?\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 La copia local que realiza el cliente de CVS solamente incluye el fichero, que es lo que el desarrollador necesita pues es el c\'f3digo con el que trabaja. Una peculiaridad de la copia local es que todos los directorios tienen un subdirectorio \fs18\f1 CVS\fs20\f0 , en \'e9l se guardan tres archivos: \fs18\f1 Entries, Repository, Root\fs20\f0 . En estos tres archivos se guarda informaci\'f3n relacionada al repositorio de d\'f3nde se obtuvo el proyecto. Es decir, cada directorio se puede manejar de forma completamente independiente y sin necesidad de especificar el repositorio de origen. \hyphpar0\par\pard\sb200\sl234 \fs18\f1 /Directorio_Local\sa0\par\fi0\sb0 |\sa0\par\fi0\sb0 |---/M\'f3dulo_1\sa0\par\fi0\sb0 |\sa0\par\fi0\sb0 |---/Subm\'f3dulo_1 del M\'f3dulo_1\sa0\par\fi0\sb0 | |---/CVS\sa0\par\fi0\sb0 |\sa0\par\fi0\sb0 |---/Subm\'f3dulo_2 del M\'f3dulo_1\sa0\par\fi0\sb0 | |---/CVS\sa0\par\fi0\sb0 |\sa0\par\fi0\sb0 |---/CVS\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 2.4. \'bfPara qu\'e9 se usa CVS?\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 CVS se puede utilizar en casi todo proyecto que implique una colaboraci\'f3n entre desarrolladores (aunque solamente haya \i uno\i0 ) simplemente darle un vistazo a SourceForge (http://sourceforge.net/) para descubrir la gran cantidad de proyectos que lo est\'e1n usando. \hyphpar0\par\pard\sb400\sl260 Sin embargo no se utiliza solamente para desarrollo de software y manejo de c\'f3digo fuente. CVS est\'e1 siendo utilizado para mantener sitios web, como GNOME Hispano (http://www.es.gnome.org/), o para mantener documentaci\'f3n, como Debian Documentation Proyect (http://www.debian.org/doc/ddp) y para grandes proyectos como los ports que forman parte de FreeBSD (http://www.freebsd.org/). Incluso se puede utilizar para mantener copias de trabajo en la m\'e1quina de casa, en la del trabajo, en el notebook, \'e9ct... \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 2.5. Instalaci\'f3n de CVS\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Solamente es necesario instalar el paquete cvs: \b apt-get install cvs\b0 , Debian rulez! ;-). En otras distribuciones existen los correspondientes paquetes RPM o los tgz cuya instalaci\'f3n es muy sencilla. El cliente y el servidor vienen en el mismo paquete por lo que nos preguntar\'e1 en que directorio se situar\'e1 el ra\'edz del servidor CVS, recomendado en /var/cvs, /var/lib/cvs o en /home/cvs. \hyphpar0\par\pard\sb400\sl260 Para iniciar un repositorio en nuestra maquina ser\'e1 necesario ejecutar: \b cvs -d $CVSROOT init\b0 , siendo \fs18\f1 $CVSROOT\fs20\f0 la variable que contiene el directorio de nuestro respositorio. Despu\'e9s de ejecutarlo se crear\'e1 el directorio CVSROOT en la ra\'edz del CVS, \i no confundir el directorio ra\'edz del CVS, $CVSROOT, con el directorio CVSROOT que hay en la ra\'edz\i0 (Esto \'faltimo puede hacerse autom\'e1ticamente en la instalaci\'f3n del paquete cvs). \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 2.6. El comando cvs\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Antes de entrar en materia un par de notas sobre el uso del commando \b cvs\b0 : \hyphpar0\par\pard\sb400\sl260 \b cvs [opcion_globales] operaci\'f3n [opcion_operaci\'f3n | fichero | m\'f3dulo]\b0 \hyphpar0\par\pard\sb400\sl260 En opciones globales normalmente utilizaremos \b -q\b0 para limitar la salida, \b -Q\b0 para que la salida se reduza a lo m\'ednimo, \b -d $CVSROOT\b0 para indicar la localizaci\'f3n del repositorio y por \'faltimo \b -z N\b0 siendo N el nivel de compresion al que queremos someter a los datos que se van a intercambiar, normalmente de 3 a 5. \hyphpar0\par\pard\sb400\sl260 Las operaciones y sus opciones las veremos a lo largo de este documento. Las m\'e1s comunes son: \b update, checkout, commit\b0 . \hyphpar0\par\pard\sb400\sl260 A lo largo de esta documentaci\'f3n en algunos ejemplos despu\'e9s de la operaci\'f3n viene la ruta hasta un fichero o no hay nada. Si al comando \b cvs\b0 se indica una ruta \i solamente\i0 actuar\'e1 en ese directorio o fichero, por el contrario si se le ejecuta sin especificar ninguna ruta actuar\'e1 sobre el directorio de trabajo actual y de forma recursiva en sus subdirectorios. \hyphpar0\par\pard\sb259\s2\sl449 \b\fs34\lang1024 3. Curioseando un repositorio de CVS\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 La mejor forma de empezar a colaborar en un proyecto es tener su c\'f3digo. En este apartado vamos a conectarnos a un servidor CVS, descargaremos uno de sus m\'f3dulos y lo mantendremos actualizado seg\'fan pase el tiempo. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 3.1. Formas de identificarse en un servidor CVS\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Normalmente el servidor de CVS est\'e1 escuchando en el puerto 2401 \fs18\f1 pserver\fs20\f0 y es la configuraci\'f3n por defecto de los clientes, por ejemplo: \b cvs -d :pserver:anoncvs@servidor.dom:/home/cvs update\b0 . \hyphpar0\par\pard\sb400\sl260 Esta identificaci\'f3n se realiza por texto plano, nos pedir\'e1 una contrase\'f1a asociada al usuario anoncvs. Este tipo de identificacion recuerda la contrase\'f1a del usuario por lo que solo ser\'e1 necesario logearse una sola vez (en el fichero $HOME/.cvspass). Este m\'e9todo es inseguro para los desarrolladores del proyecto si bien para permitir el acceso al c\'f3digo a todo el mundo es una buena soluci\'f3n. \hyphpar0\par\pard\sb200\s4\sl312 \b\fs24\lang1024 3.1.1. Usando SSH para conectarnos con el servidor\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Por motivos de seguridad se recomienda a los desarrolladores (y a todo aquel que tenga cuenta en el servidor) el uso de SSH para establecer comunicaciones con el servidor CVS, este tipo de identificaci\'f3n obliga a introducir la contrase\'f1a siempre que se realice una operaci\'f3n con el servidor de CVS. \hyphpar0\par\pard\sb400\sl260 Para poder realizar la conexi\'f3n con SSH ser\'e1 necesario fijar el valor de la variable \fs18\f1 CVS_RSH\fs20\f0 a \fs18\f1 SSH\fs20\f0 y cambiar la m\'e9todo de conexi\'f3n \fs18\f1 pserver\fs20\f0 a \fs18\f1 ext\fs20\f0 . Es interesante fijar las siguientes variables en el profile para economizar las pulsaciones (y la vida \'fatil del teclado ;-) ) \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ CVS_RSH=ssh\sa0\par\fi0\sb0 charlie$ CVSROOT=:ext:$USER@servidor.dom:/home/cvs\sa0\par\fi0\sb0 charlie$ export CVS_RSH CVSROOT\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 A partir de este momento el cliente de cvs tomar\'e1 por defecto conectar utilizando ssh y al repositorio disponible en servidor.dom identific\'e1ndome como $USER. \hyphpar0\par\pard\sb200\s4\sl312 \b\fs24\lang1024 3.1.2. Desde un repositorio de nuestra propia m\'e1quina\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Si el repositorio al que queremos acceder reside en el mismo sistema en el que trabajamos no ser\'e1 necesario especificar el m\'e9todo de conexi\'f3n ni al sistema al que se accede, solamente es necesario especificar la ruta hasta el repositorio. \hyphpar0\par\pard\sb400\sl260 Para acceder al repositorio dentro de mi sistema utilizo \b export CVSROOT=/var/lib/cvs\b0 o la opci\'f3n \b -d /var/lib/cvs\b0 y la operaci\'f3n que quiera realizar. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 3.2. Descargar un proyecto del repositorio\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Para descargar un proyecto del repositorio utilizaremos el comando \b checkout\b0 o su abreviatura \b co\b0 y el nombre del m\'f3dulo a descargar. \hyphpar0\par\pard\sb400\sl260 Supongamos que queremos colaborar en el proyecto VIM-ES (http://helvete.escomposlinux.org/vimes/), que se encarga de traducir la documentaci\'f3n existente del editor VI, para ello vamos a descargar su proyecto \fs18\f1 vimes\fs20\f0 . \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ pwd\sa0\par\fi0\sb0 /home/charlie/cvs\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs -z3 -d \\\sa0\par\fi0\sb0 :pserver:anoncvs:anoncvs@helvete.escomposlinux.org:/var/cvs/vim \\\sa0\par\fi0\sb0 checkout vimes\sa0\par\fi0\sb0 cvs server: Updating vimes\sa0\par\fi0\sb0 U vimes/DIRECTORIOS\sa0\par\fi0\sb0 U vimes/PROGRESO\sa0\par\fi0\sb0 cvs server: Updating vimes/beer\sa0\par\fi0\sb0 cvs server: Updating vimes/doc\sa0\par\fi0\sb0 U vimes/doc/autocmd.txt\sa0\par\fi0\sb0 U vimes/doc/change.txt\sa0\par\fi0\sb0 U vimes/doc/cmdline.txt\sa0\par\fi0\sb0 U vimes/doc/debugger.txt\sa0\par\fi0\sb0 # ...\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ ls\sa0\par\fi0\sb0 vimes\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 El programa nos informa de los pasos que est\'e1 siguiendo, las \fs18\f1 U\fs20\f0 significa que la copia local ha sido creada. El resultado es la creaci\'f3n de un directorio llamado como el m\'f3dulo que hemos descargado y que contiene todos los archivos y subdirectorios que cuelgan del mismo. Prestar atenci\'f3n a la creaci\'f3n del directorio \fs18\f1 CVS\fs20\f0 en cada directorio del m\'f3dulo. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 3.3. Actualizando nuestra copia local\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Para actualizar nuestra copia local respecto a los cambios del repositorio central se utiliza el comando \b update\b0 . El resultado de este comando nos informar\'e1 de que archivos hayamos modificado localmente con una \fs18\f1 M\fs20\f0 , de los ficheros que se actualizan con \fs18\f1 U\up8\fs12\f0 2\up0\fs20 , los ficheros que tienen conflictos con \fs18\f1 C\fs20\f0 y un \fs18\f1 ?\fs20\f0 en caso de que tengamos ficheros localmente que no existen en el repositorio. \hyphpar0\par\pard\sb400\sl260 Despu\'e9s de unas semanas curioseando el proyecto vimes queremos comprobrar que tenemos una copia local actualizada para ello haremos lo siguiente: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ pwd\sa0\par\fi0\sb0 /home/charlie/cvs/vimes\sa0\par\fi0\sb0 # Como ya estoy en el directorio vimes no ser\'e1 necesario espeficar\sa0\par\fi0\sb0 # ni el repositorio ni el m\'f3dulo pues est\'e1n en el directorio CVS\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs -z3 update\sa0\par\fi0\sb0 cvs server: Updating .\sa0\par\fi0\sb0 U ./PROGRESO\sa0\par\fi0\sb0 cvs server: Updating beer\sa0\par\fi0\sb0 cvs server: Updating doc\sa0\par\fi0\sb0 cvs server: Updating doc-6.0\sa0\par\fi0\sb0 # ...\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 El resultado, hemos actualizado el fichero \fs18\f1 PROGRESO\fs20\f0 (y algunos archivos m\'e1s) y hemos revisado el estado de todo. \hyphpar0\par\pard\sb400\sl260 Puede ocurrir que en alg\'fan momento cvs nos informe de la existencia de un fichero que no volver\'e1 a ser pertinente en el proyecto, es decir, ha sido eliminado. El cliente nos mostrar\'e1 el mensaje y lo borrar\'e1. \hyphpar0\par\pard\sb400\sl260 Con los directorios no ocurre lo mismo. Si un directorio se crea en un proyecto depu\'e9s de nuestro primer checkout no se nos notificar\'e1 su existencia (tendremos que estar informados de antemano), por lo que tendremos que volver a ejecutar un \b cvs checkout m\'f3dulo\b0 si queremos trabajar con el nuevo directorio creado en el proyecto. Si un directorio despu\'e9s de una actualizaci\'f3n se queda vacio no se borra autom\'e1ticamente. Para borrar los directorios vacios a\'f1adiremos la opci\'f3n \b -P\b0 , quedando as\'ed: \b cvs update -P\b0 . \hyphpar0\par\pard\sb259\s2\sl449 \b\fs34\lang1024 4. Trabajando con CVS\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Es momento de colaborar activamente en el proyecto, para ello necesitaremos tener cuenta de desarrollador en el servidor CVS ya que la cuenta \fs18\f1 anoncvs\fs20\f0 no suele tener privilegios para mandar c\'f3digo al repositorio. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 4.1. Subiendo nuestras modificaciones\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Una vez que hemos realizado las modificaciones adecuadas a nuestros ficheros locales procederemos a actualizar el repositorio y a\'f1adiremos un peque\'f1o comentario sobre el motivo del cambio. Para eso utilizaremos el comando \b commit\b0 con el modificador \b -m "Comentario sobre el cambio realizado"\b0 . \hyphpar0\par\pard\sb400\sl260 Como no tengo cuenta en el proyecto vimes voy a cambiar a otro proyecto local ;-) . En este caso he modificado unas cosas en el fichero \fs18\f1 shell.sgml\fs20\f0 y voy a actualizar el repositorio. Para ello primero actualizo mi copia con \b update\b0 (lo que me permite saber si alguien m\'e1s ha modificado el mismo archivo y puede surgir conflicto) y despu\'e9s lo subo al repositorio. \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ pwd\sa0\par\fi0\sb0 /home/charlie/cvs\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs update doc-general\sa0\par\fi0\sb0 # ...\sa0\par\fi0\sb0 M doc-general/shell.sgml\sa0\par\fi0\sb0 # Me notifica que poseo una versi\'f3n local modificada respecto al\sa0\par\fi0\sb0 # repositorio\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 # Voy a subir mis modificaciones\sa0\par\fi0\sb0 charlie$ cvs commit -m "Actualizada seccion 2" doc-general/shell.sgml\sa0\par\fi0\sb0 Checking in shell.sgml;\sa0\par\fi0\sb0 /home/cvs/doc-general/shell.sgml,v <-- shell.sgml\sa0\par\fi0\sb0 new revision: 1.4; previous revision: 1.3\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 # La actualizaci\'f3n ha sido correcta\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb200\s4\sl312 \b\fs24\lang1024 4.1.1. Problemas al actualizar archivos\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Cuando dos desarrolladores est\'e1n trabajando sobre el mismo archivo es posible que que en alg\'fan momento las modificaciones que realiza cada uno de ellos coincida. Por lo que cuando el segundo actualice el archivo CVS le devuelva una linea de error mostrando lo que tiene la versi\'f3n local y lo que tiene la versi\'f3n del CVS. \hyphpar0\par\pard\sb400\sl260 Despu\'e9s de trabajar en unos cambios en el fichero \fs18\f1 menu.php\fs20\f0 quiero subir mi versi\'f3n al servidor, lo que no s\'e9 es que otro desarrollador ya ha realizado cambios en la misma secci\'f3n del fichero. Al intentar actualizar el fichero cvs nos devolver\'e1 un error dici\'e9ndonos que es no es capaz de fusionar la versi\'f3n local con la que hay en el repositorio. Este es el caso: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ cvs update\sa0\par\fi0\sb0 cvs update: Updating .\sa0\par\fi0\sb0 RCS file: /var/cvs/web/menu.php,v\sa0\par\fi0\sb0 retrieving revision 1.5\sa0\par\fi0\sb0 retrieving revision 1.6\sa0\par\fi0\sb0 Merging differences between 1.5 and 1.6 into menu.php\sa0\par\fi0\sb0 rcsmerge: warning: conflicts during merge\sa0\par\fi0\sb0 cvs update: conflicts found in menu.php\sa0\par\fi0\sb0 C menu.php\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 Si ahora edito el fichero \fs18\f1 menu.php\fs20\f0 veo que cvs ha realizado unos cambios en el fichero que son los que est\'e1n dando problemas: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 <<<<<<< menu.php\sa0\par\fi0\sb0 Foro\sa0\par\fi0\sb0 =======\sa0\par\fi0\sb0 Libro de visitas\sa0\par\fi0\sb0 >>>>>>> 1.6\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 Al realizar la actualizaci\'f3n se ha remarcado que problema hay en el fichero, en este caso la versi\'f3n disponible en servidor es la 1.6 pero la copia sobre la que realice los cambios era la 1.5. Se puede ver que el otro desarrollador y yo hemos modificado la misma l\'ednea del fichero (el otro desarrollador fue m\'e1s r\'e1pido y actualiz\'f3 antes) y CVS no sabe elegir entre las dos. \hyphpar0\par\pard\sb400\sl260 Simplemente se editan las l\'edneas que dan problemas y se eliminan las marcas. Una vez el fichero sea correcto lo subimos al repositorio. \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ cvs commit -m "Enlace al libro de visitas arreglado" menu.php\sa0\par\fi0\sb0 Checking in menu.php;\sa0\par\fi0\sb0 /var/cvs/web/menu.php,v <-- menu.php\sa0\par\fi0\sb0 new revision: 1.7; previous revision: 1.6\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb200\s4\sl312 \b\fs24\lang1024 4.1.2. Recuperando una versi\'f3n anterior\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 En alg\'fan momento un desarrollador subir\'e1 al repositorio unas modificaciones que no sean muy acertadas o que podr\'edan causar problemas con los otros archivos y tal vez nos interesase volver a una versi\'f3n anterior del proyecto y hacer como si nunca se hubiese modificado. \hyphpar0\par\pard\sb400\sl260 Desarrollando \fs18\f1 menu.php\fs20\f0 otro desarrollador ha introducido una nueva funci\'f3n, sin embargo esa funci\'f3n ni es necesaria ni es segura por lo que es conveniente recuperar la versi\'f3n anterior y olvidar esos cambios: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ cvs update -j 1.8 -j 1.7 menu.php\sa0\par\fi0\sb0 RCS file: /var/cvs/web/menu.php,v\sa0\par\fi0\sb0 retrieving revision 1.8\sa0\par\fi0\sb0 retrieving revision 1.7\sa0\par\fi0\sb0 Merging differences between 1.8 and 1.7 into menu.php\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs update\sa0\par\fi0\sb0 cvs update: Updating .\sa0\par\fi0\sb0 M menu.php\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs commit -m "Regreso a la version 1.7" menu.php\sa0\par\fi0\sb0 Checking in menu.php;\sa0\par\fi0\sb0 /var/cvs/web/menu.php,v <-- menu.php\sa0\par\fi0\sb0 new revision: 1.9; previous revision: 1.8\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 4.2. A\'f1adir archivos al repositorio\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Durante el desarrollo de un proyecto es casi seguro que necesitaremos incluir m\'e1s ficheros de los que estaban previstos al comienzo del mismo. Para incluir un fichero nuevo solamente ser\'e1 necesario utilizar el comando \b add\b0 y el fichero a a\'f1adir al repositorio. Para a\'f1adir un nuevo directorio se sigue el mismo m\'e9todo. \hyphpar0\par\pard\sb400\sl260 En este caso voy a\'f1adir un nuevo directorio y el archivo que cuelga de \'e9l. La \'fanica diferencia es que el directorio se a\'f1ade autom\'e1ticamente y para el fichero es necesario realizar \b cvs commit -m "Comentario"\b0 . \hyphpar0\par\pard\sb200\sl234 \fs18\f1 # A\'f1adir un nuevo directorio: kde-gnome\sa0\par\fi0\sb0 charlie$ cvs add kde-gnome/\sa0\par\fi0\sb0 Directory /home/cvs/lpractico/kde-gnome added to the repository\sa0\par\fi0\sb0 # El directorio ya forma parte del repositorio.\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 # A\'f1ado el fichero kde.tex en el directorio kde-gnome\sa0\par\fi0\sb0 charlie$ cd kde-gnome\sa0\par\fi0\sb0 charlie$ cvs add kde.tex\sa0\par\fi0\sb0 cvs add: scheduling 'kde.tex' for addtion\sa0\par\fi0\sb0 cvs add: use 'cvs commit' to add this file permanently\sa0\par\fi0\sb0 # El fichero kde.tex ha sido programado para ser a\'f1adido al repositorio\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 # Confirmo la adici\'f3n del fichero kde.tex\sa0\par\fi0\sb0 charlie$ cvs ci -m "Adicion: Texto de la comparativa de KDE-GNOME"\sa0\par\fi0\sb0 cvs commit: Examining .\sa0\par\fi0\sb0 RCS file: /home/cvs/lpractico/kde-gnome/kde.tex,v\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 Checking in kde.tex;\sa0\par\fi0\sb0 /home/cvs/lpractico/kde-gnome/kde.tex,v <-- kde.tex\sa0\par\fi0\sb0 initial revision: 1.1\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 # La adicci\'f3n del nuevo fichero ha sido correcta.\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb200\s4\sl312 \b\fs24\lang1024 4.2.1. Ficheros especiales\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 En la introducci\'f3n se mencionaba que CVS maneja los ficheros en un formato especial y que en alg\'fan caso era posible que nuestro fichero pudiera ser malinterpretado por el servidor al guardarlo (con lo que seguramente perder\'edamos el fichero). Este caso es muy com\'fan cuando se maneja binarios y algunos ficheros de texto (aunque esto es menos normal). \hyphpar0\par\pard\sb400\sl260 Trabajando en la documentaci\'f3n he decidido a\'f1adir una im\'e1gen de una captura del escritorio en formato eps. Para evitar problemas voy a a\'f1adirla marcando como binario el fichero: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ cvs add -k 'b' captura.eps\sa0\par\fi0\sb0 cvs add: scheduling file `captura.eps' for addition\sa0\par\fi0\sb0 cvs add: use 'cvs commit' to add this file permanently\sa0\par\fi0\sb0 charlie$ cvs commit -m "Nueva captura de escritorio" captura.eps \sa0\par\fi0\sb0 RCS file: /home/cvs/lpractico/consola/captura.eps,v\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 Checking in captura.eps;\sa0\par\fi0\sb0 /home/cvs/lpractico/consola/captura.eps,v <-- captura.eps\sa0\par\fi0\sb0 initial revision: 1.1\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 La opci\'f3n \b -k 'b'\b0 marca el fichero como binario, es decir el servidor CVS lo guardar\'e1 exactamente igual sin a\'f1adirle nada. Sin embargo no se nos informa de que el fichero ha sido marcado como binario. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 4.3. Eliminar ficheros del repositorio\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Los pasos a seguir para eliminar ficheros del repositorio son id\'e9nticos al caso de a\'f1adir ficheros con una sola peculiaridad, primero deberemos borrar localmentel fichero que queremos eliminar: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ rm variance.sgml\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs remove variance.sgml\sa0\par\fi0\sb0 cvs remove: scheduling `variance.sgml' for removal\sa0\par\fi0\sb0 cvs remove: use 'cvs commit' to remove this file permanently\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs commit -m "Fichero obsoleto" variance.sgml\sa0\par\fi0\sb0 cvs commit: Examining .\sa0\par\fi0\sb0 Removing variance.sgml;\sa0\par\fi0\sb0 /home/cvs/doc-general/variance.sgml,v <-- variance.sgml\sa0\par\fi0\sb0 new revision: delete; previous revision: 1.1.1.1\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 En el caso de los directorios tendremos que ser m\'e1s cuidadosos, primero deberemos comprobar que no haya ficheros en \'e9l: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ cvs remove parte2/\sa0\par\fi0\sb0 cvs remove: Removing parte2/\sa0\par\fi0\sb0 cvs remove: file `parte2//index.html' still in working directory\sa0\par\fi0\sb0 cvs remove: 1 file exists; remove it first\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ rm parte2/index.html\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs remove parte2/\sa0\par\fi0\sb0 cvs remove: Removing parte2/\sa0\par\fi0\sb0 cvs remove: scheduling `parte2//index.html' for removal\sa0\par\fi0\sb0 cvs remove: use 'cvs commit' to remove this file permanently\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs commit -m "Parte asimilada ;)" parte2\sa0\par\fi0\sb0 cvs commit: Examining parte2\sa0\par\fi0\sb0 Removing parte2/index.html;\sa0\par\fi0\sb0 /home/cvs/lpractico/consola/parte2/index.html,v <-- index.html\sa0\par\fi0\sb0 new revision: delete; previous revision: 1.1\sa0\par\fi0\sb0 done\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 Primero nos dice que todav\'eda hay archivos en el directorio que queremos eliminar. Una vez borrados los ficheros que hay el directorio procedemos a su eliminaci\'f3n: el directorio \fs18\f1 parte2\fs20\f0 es eliminado inmediatamente mientras que el fichero \fs18\f1 index.html\fs20\f0 queda pendiente de confirmaci\'f3n con la operaci\'f3n \b commit\b0 . \hyphpar0\par\pard\sb200\s4\sl312 \b\fs24\lang1024 4.3.1. CVS y los ficheros eliminados\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 CVS se encarga de mantener un hist\'f3rico y todas las versiones de los arhivos que hay en los proyectos. Si esto es cierto no se pueden borrar los ficheros pues aunque no sean necesarios en las versiones actuales del proyecto si que lo fueron en etapas anteriores. \hyphpar0\par\pard\sb400\sl260 En realidad CVS no borra ning\'fan fichero de repositorio simplemente lo mueve a un directorio llamado \fs18\f1 Attic\fs20\f0 y lo marca como \'93muerto\'94 estando disponible en caso de tener que \'93revivirlo\'94. \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ pwd\sa0\par\fi0\sb0 /home/cvs/doc-general/Attic\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ ls\sa0\par\fi0\sb0 variance.sgml,v\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb259\s2\sl449 \b\fs34\lang1024 5. M\'e1s posibilidades con CVS\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 CVS tiene muchas posibilidades para seguir el recorrido que ha seguido un proyecto ya que mantiene un fichero de registro con todo lo acontecido. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 5.1. Marcar con etiquetas\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Uno de los inconvenientes de trabajar con CVS es que siempre se manejan los ficheros con sus versiones y mantener una lista de versiones relaciona con todos los archivos puede resultar muy molesto en proyectos no muy grandes. Para evitar esto existe el comando \b tag etiqueta\b0 que nos permite enlazar diferentes versiones con un nombre simb\'f3lico. \hyphpar0\par\pard\sb400\sl260 Una semana despu\'e9s de empezar un proyecto y de desarrollo marco todo el contenido actual como \fs18\f1 version_2001-12-31\fs20\f0 : \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ cvs tag version_2001-12-31\sa0\par\fi0\sb0 cvs tag: Tagging .\sa0\par\fi0\sb0 T index.sgml\sa0\par\fi0\sb0 T Makefile\sa0\par\fi0\sb0 T bibliografia.sgml\sa0\par\fi0\sb0 cvs tag: Tagging capitulo01\sa0\par\fi0\sb0 T capitulo01/shell.sgml\sa0\par\fi0\sb0 [...]\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 A partir de ahora puedo hacer referencia a este estado de versiones como \fs18\f1 version_2001-12-31\fs20\f0 , lo que me permitir\'e1 en un futuro recuperar todos los archivos tal y c\'f3mo estaban en el momento en el que los he etiquetado. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 5.2. La historia de un fichero\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Seg\'fan se va desarrollando un proyecto es interesante saber que trayectoria ha seguido un fichero y aqu\'ed es donde entra la calidad de los \i comentarios\i0 introducidos por los desarrolladores. Para ello se utiliza el commando \b log\b0 . \hyphpar0\par\pard\sb400\sl260 En este ejemplo voy a consultar la historia del fichero \fs18\f1 menu.php\fs20\f0 : \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ cvs log menu.php \sa0\par\fi0\sb0 \sa0\par\fi0\sb0 RCS file: /var/cvs/web/menu.php,v\sa0\par\fi0\sb0 Working file: menu.php\sa0\par\fi0\sb0 head: 1.12\sa0\par\fi0\sb0 branch:\sa0\par\fi0\sb0 locks: strict\sa0\par\fi0\sb0 access list:\sa0\par\fi0\sb0 symbolic names:\sa0\par\fi0\sb0 Diciembre_2001: 1.1.1.1\sa0\par\fi0\sb0 chernando: 1.1.1\sa0\par\fi0\sb0 keyword substitution: kv\sa0\par\fi0\sb0 total revisions: 13; selected revisions: 13\sa0\par\fi0\sb0 description:\sa0\par\fi0\sb0 ----------------------------\sa0\par\fi0\sb0 revision 1.12\sa0\par\fi0\sb0 date: 2001/12/30 15:54:18; author: chernando; state: Exp; lines: +1 -1\sa0\par\fi0\sb0 De siglinux a quienes y por tanto nuevo siggulfi con enlace\sa0\par\fi0\sb0 ----------------------------\sa0\par\fi0\sb0 revision 1.11\sa0\par\fi0\sb0 date: 2001/12/30 12:01:56; author: chernando; state: Exp; lines: +7 -7\sa0\par\fi0\sb0 Limando detalles 2\sa0\par\fi0\sb0 ----------------------------\sa0\par\fi0\sb0 revision 1.10\sa0\par\fi0\sb0 date: 2001/12/30 11:57:15; author: chernando; state: Exp; lines: +7 -5\sa0\par\fi0\sb0 Limando detalles 1\sa0\par\fi0\sb0 ----------------------------\sa0\par\fi0\sb0 revision 1.9\sa0\par\fi0\sb0 date: 2001/12/30 11:40:43; author: chernando; state: Exp; lines: +8 -9\sa0\par\fi0\sb0 Arreglado un enlace erroneo\sa0\par\fi0\sb0 [...]\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 5.3. Incluyendo la versi\'f3n dentro del propio fichero\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 CVS maneja internamente los ficheros que se suben al repositorio, por ello es necesario controlar a los fichero binarios y algunos formatos de texto ya que es posible que CVS los interprete. En este caso vamos a ver cuales son algunas de las expresiones que se expanden autom\'e1ticamente. \hyphpar0\par\pard\sb400\sl260 Un ejemplo muy sencillo es a\'f1adir \fs18\f1 $Id$\fs20\f0 , que ser\'e1 autom\'e1ticamente por informaci\'f3n relacionada a la \'faltima modificaci\'f3n, el autor de la misma y la versi\'f3n. Este ejemplo es del XML de SIGLinux - GULFI (http://acm.asoc.fi.upm.es/siglinux/): \hyphpar0\par\pard\sb200\sl234 \fs18\f1 chernando@acm:~/cvs/gulfi-web/servicios$ head cvs.xml \sa0\par\fi0\sb0 \sa0\par\fi0\sb0 ] >\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 \sa0\par\fi0\sb0 \sa0\par\fi0\sb0 CVS\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 CVS\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 # ...\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 En este caso, cada vez que sea actualiza el fichero la l\'ednea \fs18\f1 \fs20\f0 tambi\'e9n se actualiza. \hyphpar0\par\pard\sb400\sl260 Existen otros patrones de sustituci\'f3n como son: \fs18\f1 $Author$, $Date$, $Header$, $Name$, $Log$,...\fs20\f0 . Para m\'e1s informaci\'f3n consultar el manual de CVS. \hyphpar0\par\pard\sb400\sl260 Hay que tener en cuenta la precauci\'f3n de dejar \fs18\f1 $Id\fs20\f0 dentro de un comentario dentro del lenguaje que estemos utilzando. \hyphpar0\par\pard\sb259\s2\sl449 \b\fs34\lang1024 6. Administrando un servidor CVS\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Una vez instalado el servidor CVS es momento de jugar con \'e9l y comenzar un proyecto completamente nuevo en nuestro propio servidor. \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 6.1. Creando un nuevo m\'f3dulo\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Para comenzar un proyecto es necesario, o al menos recomendable, partir de algo que tenga contenido. Una vez que tengamos un poco la estructura de nuestro m\'f3dulo es el momento de llevarlo al servidor CVS con el comando \b import -m "Comentario" nombre_m\'f3dulo etiqueta_origen etiqueta_versi\'f3n\b0 y empezar a trabajar tirando del CVS. \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ pwd\sa0\par\fi0\sb0 /home/charlie/documentacion-cvs\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs -d /home/cvs import -m "Documentacion sobre CVS" \\\sa0\par\fi0\sb0 cvs-doc chernando diciembre-2001\sa0\par\fi0\sb0 N cvs-doc/cvs.sgml\sa0\par\fi0\sb0 N cvs-doc/Makefile\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 No conflicts created by this import\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb400\sl260 En este caso he creado el m\'f3dulo \fs18\f1 cvs-doc\fs20\f0 y he creado dos ficheros: \fs18\f1 cvs.sgml y Makefile\fs20\f0 (las etiquetas de origen y versi\'f3n no son importantes, su uso solamente interesa cuando estamos desarrollando para terceros). A partir de ahora se puede acceder al m\'f3dulo normalmente. \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ pwd\sa0\par\fi0\sb0 /home/charlie/cvs\sa0\par\fi0\sb0 \sa0\par\fi0\sb0 charlie$ cvs -d /home/cvs checkout cvs-doc\sa0\par\fi0\sb0 cvs checkout: Updating cvs-doc\sa0\par\fi0\sb0 U cvs-doc/Makefile\sa0\par\fi0\sb0 U cvs-doc/cvs.sgml\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 6.2. Liberando una versi\'f3n\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 A lo largo del desarrollo surgen versiones que son estables y pueden ser distribuidas, para evitar a los posibles usuarios el uso de CVS se realiza mediante el comando \b export -t etiqueta -d ruta_destino m\'f3dulo\b0 una copia exacta de la versi\'f3n etiquetada sin los directorios \fs18\f1 CVS\fs20\f0 que es distribuible si la empaquetamos con \b tar\b0 y \b gzip\b0 o \b bzip2\b0 . \hyphpar0\par\pard\sb400\sl260 Mi documentaci\'f3n sobre CVS es suficientemente madura como para poder distribuirla para ello realizo lo siguiente: \hyphpar0\par\pard\sb200\sl234 \fs18\f1 charlie$ cvs -d /home/cvs/ export -t v0.5 -d /home/charlie/cvsdoc-0.5 cvs-doc\sa0\par\fi0\sb0 cvs export: Updating /home/charlie/cvsdoc-0.5\sa0\par\fi0\sb0 U /home/charlie/cvsdoc-0.5/Makefile\sa0\par\fi0\sb0 U /home/charlie/cvsdoc-0.5/cvs.sgml\sa0\par\fi0\sb0 \hyphpar0\par\pard\sb200\sl260 \fs20\f0 \hyphpar0\par\pard\sb216\s3\sl374 \b\fs28\lang1024 6.3. Manejando ramas\keepn\hyphpar0\par\pard\sb400\sl260 \b0\fs20\lang1034 Contenido para las pr\'f3ximas vacaciones ;) \hyphpar0\par\pard\sb259\sl449 \b\fs34\lang1024 Notas\keepn\hyphpar0\par\pard\sb100\li320\sl260\fi-320 \tx320 \b0\fs20 1. \tab El directorio CVSROOT contiene la configuraci\'f3n y ficheros de informaci\'f3n del servidor CVS.\hyphpar0\par\pard\sb100\li320\sl260\fi-320 \tx320 2. \tab La actualizaci\'f3n implica descargar los cambios a la versi\'f3n local, pero no actualizar los archivos locales al repositorio central\hyphpar0\par}