Diferencia entre revisiones de «CVS»
(estilo) |
m (litadel) |
||
Línea 1: | Línea 1: | ||
+ | cbascodron | ||
{{INDdcha}} | {{INDdcha}} | ||
El '''Sistema de Control de Versiones''' (''CVS'') permite que varios programadores trabajen de forma colaborativa en un mismo proyecto llevando un control de las versiones de los ficheros. De esta forma se permiten cambios concurrentes en un mismo fichero sin perder lo cambios realizados. Si usas o quieres usar esta herramienta se recomienda que pruebes [[CVSTrac]]. | El '''Sistema de Control de Versiones''' (''CVS'') permite que varios programadores trabajen de forma colaborativa en un mismo proyecto llevando un control de las versiones de los ficheros. De esta forma se permiten cambios concurrentes en un mismo fichero sin perder lo cambios realizados. Si usas o quieres usar esta herramienta se recomienda que pruebes [[CVSTrac]]. | ||
− | == | + | == Instalación == |
− | El programa viene en el paquete '''cvs''' que podemos [[ | + | El programa viene en el paquete '''cvs''' que podemos [[añadir aplicaciones|instalar]] los repositorios oficiales de Ubuntu. |
− | == | + | == Configuración de un repositorio == |
− | Vamos a tener cada proyecto en un repositorio separado, que es lo suyo para tener un control | + | Vamos a tener cada proyecto en un repositorio separado, que es lo suyo para tener un control más fino sobre cada uno de los distintos repositorios. Es mejor asà por el tema de usuarios, permisos y configuraciones varias. Todos estos repositorios los vamos a crear dentro del directorio '''/var/lib/repositorio/''', por ejemplo, para tenerlos juntos y facilitar el tema de la copia de seguridad. |
− | Como buena | + | Como buena práctica es aconsejable tener un usuario ''cvs'' que será el propietario de los ficheros: |
$ adduser cvs | $ adduser cvs | ||
$ chown cvs:cvs -R /var/lib/repositorio | $ chown cvs:cvs -R /var/lib/repositorio | ||
− | Una vez declaradas estas premisas procedemos a la | + | Una vez declaradas estas premisas procedemos a la inicialización del repositorio que albergará un hipotético llamado ''tuxitron''. Estas tareas de instalación las haremos como ''root'': |
$ cvs -d /var/lib/repositorio/tuxitron init | $ cvs -d /var/lib/repositorio/tuxitron init | ||
− | Para que todos los usuarios del grupo '''cvs''' tengan permisos para trabajar con el repositorio, hacemos que todos los ficheros del | + | Para que todos los usuarios del grupo '''cvs''' tengan permisos para trabajar con el repositorio, hacemos que todos los ficheros del recién creado repositorio pertenezcan a ese grupo: |
$ chgrp cvs /var/lib/repositorio/tuxitron -R | $ chgrp cvs /var/lib/repositorio/tuxitron -R | ||
Línea 27: | Línea 28: | ||
$ gedit /etc/xinetd.d/cvs | $ gedit /etc/xinetd.d/cvs | ||
− | y | + | y añadir el nuevo repositorio: |
--allow-root=/var/lib/repositorio/tuxitron | --allow-root=/var/lib/repositorio/tuxitron | ||
− | Al final debe quedar una cosa | + | Al final debe quedar una cosa asÃ: |
service cvspserver | service cvspserver | ||
Línea 48: | Línea 49: | ||
$ /etc/init.d/xinetd reload | $ /etc/init.d/xinetd reload | ||
− | == | + | == Personalización del repositorio == |
− | Antes de empezar a poner | + | Antes de empezar a poner código en el repositorio hay algunas cosas por hacer que nos facilitarán luego el proceso de desarrollo. En el repositorio que acabamos de crear existe un directorio '''CVSROOT''' que contiene ficheros de carácter administrativo, esto es, que nos permiten personalizar el comportamiento del CVS. Veamos algunos de ellos para el caso de programar en [[Java]]: |
− | * '''cvsignore''': Indica patrones de ficheros a ignorar por el CVS. Estos ficheros no se | + | * '''cvsignore''': Indica patrones de ficheros a ignorar por el CVS. Estos ficheros no se podrán añadir al repositorio. Ejemplo: |
*.class | *.class | ||
Línea 58: | Línea 59: | ||
*.ear | *.ear | ||
− | * '''cvswrappers''': Especifica | + | * '''cvswrappers''': Especifica cómo serán gestionados determinados ficheros. Sirve para indicar qué ficheros son binarios. Ejemplo: |
*.gif -k 'b' | *.gif -k 'b' | ||
Línea 72: | Línea 73: | ||
zutanito | zutanito | ||
− | * '''passwd''': Nombre de los usuarios junto con sus correspondientes passwords. Cada | + | * '''passwd''': Nombre de los usuarios junto con sus correspondientes passwords. Cada lÃnea está compuesta de nombre del usuario, password codificado y correspondencia con usuario local. Ejemplo: |
fulanito:********:cvs | fulanito:********:cvs | ||
Línea 78: | Línea 79: | ||
zutanito:*********:cvs | zutanito:*********:cvs | ||
− | Para encriptar los passwords puedes usar este programa en Perl, al que le pasas el password en plano como | + | Para encriptar los passwords puedes usar este programa en Perl, al que le pasas el password en plano como parámetro y lo devuelve convenientemente codificado: |
<perl> | <perl> | ||
Línea 92: | Línea 93: | ||
</perl> | </perl> | ||
− | Estos ficheros no se editan directamente en el repositorio, a | + | Estos ficheros no se editan directamente en el repositorio, a excepción del ''passwd'' por motivos de seguridad, sino que deberemos hacer un ''checkout'' del directorio ''CVSROOT'' del repositorio para modificarlos y luego el ''commit'' correspondiente. Los ficheros ''cvsignore'' y ''writers'' tendrás que crearlos y añadirlos al repositorio. |
− | == | + | == Añadir un proyecto al repositorio == |
− | Una vez tengamos creado el repositorio tenemos que crear un proyecto. En los proyectos simples | + | Una vez tengamos creado el repositorio tenemos que crear un proyecto. En los proyectos simples habrá un sólo proyecto por repositorio, pero en los más complejos puede haber varios proyectos relacionados en un mismo repositorio. En GNOME, por ejemplo, hay un repositorio y cada uno de los componentes de GNOME es un proyecto (Evolution, Nautilus, Evince, etc.). |
− | Lo que haremos en importar lo que tenemos creando un proyecto en el repositorio, de esta forma pondremos disponible el | + | Lo que haremos en importar lo que tenemos creando un proyecto en el repositorio, de esta forma pondremos disponible el código para que otra gente se pueda incluir en el proceso de desarrollo. Se usa el comando '''import''' del CVS. Es importante ejecutar este comando desde el directorio donde tengamos las fuentes para importar. También es fundamental establecer la variable de entorno '''CVSROOT''' que le indicará al cliente CVS donde está el repositorio. |
$ export CVSROOT=/var/lib/repositorio/tuxitron | $ export CVSROOT=/var/lib/repositorio/tuxitron | ||
− | La sintaxis del comando de | + | La sintaxis del comando de importación es la siguiente: |
$ cvs import -m "comentario" <proyecto> <etiqueta_vendedor> <etiqueta_version> | $ cvs import -m "comentario" <proyecto> <etiqueta_vendedor> <etiqueta_version> | ||
− | Los dos | + | Los dos últimos parámetros tienen poca importancia, de modo que puedes sustituirlos por tu usuario y la palabra "inicio" mismo. Por ejemplo, si eres el usuario ''monkiki'' y el proyecto a importar se llama ''tuxitron'' la lÃnea de comandos serÃa: |
− | $ cvs import -m " | + | $ cvs import -m "Importación inicial" tuxitron monkiki inicio |
− | {{Nota|Si vas a usar [[CVSTrac]] en lugar de importar todo el proyecto, importa un directorio | + | {{Nota|Si vas a usar [[CVSTrac]] en lugar de importar todo el proyecto, importa un directorio vacÃo o uno que contenga un fichero de texto sin importancia (del estilo de leeme.txt) y haz un commit del resto de los ficheros. Los ficheros importados no aparecen en el navegador web de CVS.}} |
== Binarios importados sin '-kb' == | == Binarios importados sin '-kb' == | ||
− | Si accidentalmente | + | Si accidentalmente añades un fichero binario sin la opción '-kb', puedes usar el comando ''cvs admin'' para arreglarlo. Por ejemplo: |
$ cvs add -m "Imagen de prueba" imagen.gif | $ cvs add -m "Imagen de prueba" imagen.gif | ||
Línea 124: | Línea 125: | ||
$ cvs update -A imagen.gif | $ cvs update -A imagen.gif | ||
− | {{nota|Esto no | + | {{nota|Esto no pasarÃa si tuviéramos el fichero '''cvswrappers''' correctamente configurado}} |
== Trabajar con CVS == | == Trabajar con CVS == | ||
− | [[Imagen:TkCVS.jpg|thumb|TkCVS es un | + | [[Imagen:TkCVS.jpg|thumb|TkCVS es un magnÃfico cliente gráfico para CVS.]] |
− | La | + | La lÃnea de comandos admite gran cantidad de comandos y opciones. En la nomenclatura de CVS, los comandos son parámetros funcionales de CVS. En lugar de tener varios ejecutables, uno para hacer ''checkout'', otro para ''checkin'', otro para ''status''... tiene uno sólo llamado '''cvs''' que admite todos estos modos de funcionamiento. Veamos los principales: |
− | * '''checkout:''' Saca el fichero del repositorio y lo almacena localmente para poder trabajar con | + | * '''checkout:''' Saca el fichero del repositorio y lo almacena localmente para poder trabajar con él. |
− | * '''checkin:''' Una vez realizados los cambios, volcamos el fichero al repositorio donde | + | * '''checkin:''' Una vez realizados los cambios, volcamos el fichero al repositorio donde estará disponible para el resto de desarrolladores. |
* '''status:''' Indica el estado actual del fichero. | * '''status:''' Indica el estado actual del fichero. | ||
* '''log:''' Saca un listado con las revisiones del fichero. | * '''log:''' Saca un listado con las revisiones del fichero. | ||
− | Pero lo | + | Pero lo más normal es que uses alguno de los clientes gráficos que existen. Uno de los mejores, aunque no tenga buena apariencia, es '''TkCVS''', el cual podemos [[Añadir aplicaciones|instalar]] con el paquete '''tkcvs''' de los repositorios oficiales de Ubuntu. |
− | == | + | == Notificación de los commits == |
− | La | + | La configuración de un repositorio también está sujeta al versionado. Asà que para añadir la opción de notificación de correo de los ''commits'' tenemos que hacer un ''checkout'' del directorio especial '''CVSROOT'''. |
$ cvs co CVSROOT | $ cvs co CVSROOT | ||
− | Dentro de ese directorio hay unos cuantos ficheros. El que nos interesa ahora es '''loginfo''', al que tenemos que | + | Dentro de ese directorio hay unos cuantos ficheros. El que nos interesa ahora es '''loginfo''', al que tenemos que añadir la siguiente lÃnea: |
DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --cvs %{sVv} --diff --full | DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --cvs %{sVv} --diff --full | ||
− | El programa que | + | El programa que envÃa los correos lo podemos encontrar [http://www.infodrom.org/Infodrom/tools/cvs-mailcommit.html aquÃ]. El parámetro ''mailto'' indica a quién va destinado el correo. Podemos especificar varios ''mailto''. Lo que yo hago es crear un alias en el servidor de correo y enviar el correo a ese alias. Asà puedo poner o quitar los usuarios de destino sin tocar este fichero de configuración. |
== Hacer una copia de seguridad == | == Hacer una copia de seguridad == | ||
− | Veamos un ejemplo de | + | Veamos un ejemplo de cómo hacer una copia de seguridad de nuestro preciado repositorio de CVS. Simplemente lo que hace es: |
* Crea un archivo ''.tgz'' con el contenido del repositorio | * Crea un archivo ''.tgz'' con el contenido del repositorio | ||
− | * | + | * EnvÃa el archivo a un servidor de backup |
− | * | + | * EnvÃa un correo al usuario ''root'' para avisarle del proceso |
El script es bastante simple y puedes adaptarlo a tus necesidades sin gran esfuerzo. | El script es bastante simple y puedes adaptarlo a tus necesidades sin gran esfuerzo. | ||
Línea 180: | Línea 181: | ||
</bash> | </bash> | ||
− | == Ver | + | == Ver también == |
* [[CVSTrac]] | * [[CVSTrac]] | ||
Línea 187: | Línea 188: | ||
* [[Subversion]] | * [[Subversion]] | ||
− | * [[: | + | * [[:CategorÃa:Programación|Ver más en la categorÃa ''Programación'']] |
== Enlaces externos == | == Enlaces externos == | ||
Línea 200: | Línea 201: | ||
* [http://www.linux.ie/articles/tutorials/managingaccesswithcvs.php Managing Access with CVS] {{en}} | * [http://www.linux.ie/articles/tutorials/managingaccesswithcvs.php Managing Access with CVS] {{en}} | ||
− | [[ | + | [[CategorÃa:Programación]] |
Revisión de 19:04 8 ene 2008
cbascodron
Contenido |
El Sistema de Control de Versiones (CVS) permite que varios programadores trabajen de forma colaborativa en un mismo proyecto llevando un control de las versiones de los ficheros. De esta forma se permiten cambios concurrentes en un mismo fichero sin perder lo cambios realizados. Si usas o quieres usar esta herramienta se recomienda que pruebes CVSTrac.
Instalación
El programa viene en el paquete cvs que podemos instalar los repositorios oficiales de Ubuntu.
Configuración de un repositorio
Vamos a tener cada proyecto en un repositorio separado, que es lo suyo para tener un control más fino sobre cada uno de los distintos repositorios. Es mejor asà por el tema de usuarios, permisos y configuraciones varias. Todos estos repositorios los vamos a crear dentro del directorio /var/lib/repositorio/, por ejemplo, para tenerlos juntos y facilitar el tema de la copia de seguridad.
Como buena práctica es aconsejable tener un usuario cvs que será el propietario de los ficheros:
$ adduser cvs $ chown cvs:cvs -R /var/lib/repositorio
Una vez declaradas estas premisas procedemos a la inicialización del repositorio que albergará un hipotético llamado tuxitron. Estas tareas de instalación las haremos como root:
$ cvs -d /var/lib/repositorio/tuxitron init
Para que todos los usuarios del grupo cvs tengan permisos para trabajar con el repositorio, hacemos que todos los ficheros del recién creado repositorio pertenezcan a ese grupo:
$ chgrp cvs /var/lib/repositorio/tuxitron -R
Ahora le tenemos que indicar al CVS que puede disponer del nuevo repositorio. Si usamos el superdemonio xinetd tendremos que crear el fichero:
$ gedit /etc/xinetd.d/cvs
y añadir el nuevo repositorio:
--allow-root=/var/lib/repositorio/tuxitron
Al final debe quedar una cosa asÃ:
service cvspserver { socket_type = stream protocol = tcp user = root group = cvs server = /usr/bin/cvs server_args = -f --allow-root=/var/lib/repositorio/perico --allow-root=/var/lib/repositorio/tuxitron pserver wait = no disable = no }
Y reiniciamos el superservidor para que los cambios surtan efecto:
$ /etc/init.d/xinetd reload
Personalización del repositorio
Antes de empezar a poner código en el repositorio hay algunas cosas por hacer que nos facilitarán luego el proceso de desarrollo. En el repositorio que acabamos de crear existe un directorio CVSROOT que contiene ficheros de carácter administrativo, esto es, que nos permiten personalizar el comportamiento del CVS. Veamos algunos de ellos para el caso de programar en Java:
- cvsignore: Indica patrones de ficheros a ignorar por el CVS. Estos ficheros no se podrán añadir al repositorio. Ejemplo:
*.class *.war *.ear
- cvswrappers: Especifica cómo serán gestionados determinados ficheros. Sirve para indicar qué ficheros son binarios. Ejemplo:
*.gif -k 'b' *.jpg -k 'b' *.png -k 'b' *.jar -k 'b' *.swf -k 'b'
- writers: Listado de usuarios que tienen permisos de escritura en el repositorio. Ejemplo:
fulanito menganito zutanito
- passwd: Nombre de los usuarios junto con sus correspondientes passwords. Cada lÃnea está compuesta de nombre del usuario, password codificado y correspondencia con usuario local. Ejemplo:
fulanito:********:cvs menganito:*********:cvs zutanito:*********:cvs
Para encriptar los passwords puedes usar este programa en Perl, al que le pasas el password en plano como parámetro y lo devuelve convenientemente codificado:
<perl>
#!/usr/bin/perl srand (time()); my $randletter = "(int (rand (26)) + (int (rand (1) + .5) % 2 ? 65 : 97))"; my $salt = sprintf ("%c%c", eval $randletter, eval $randletter); my $plaintext = shift; my $crypttext = crypt ($plaintext, $salt); print "${crypttext}\n";
</perl>
Estos ficheros no se editan directamente en el repositorio, a excepción del passwd por motivos de seguridad, sino que deberemos hacer un checkout del directorio CVSROOT del repositorio para modificarlos y luego el commit correspondiente. Los ficheros cvsignore y writers tendrás que crearlos y añadirlos al repositorio.
Añadir un proyecto al repositorio
Una vez tengamos creado el repositorio tenemos que crear un proyecto. En los proyectos simples habrá un sólo proyecto por repositorio, pero en los más complejos puede haber varios proyectos relacionados en un mismo repositorio. En GNOME, por ejemplo, hay un repositorio y cada uno de los componentes de GNOME es un proyecto (Evolution, Nautilus, Evince, etc.).
Lo que haremos en importar lo que tenemos creando un proyecto en el repositorio, de esta forma pondremos disponible el código para que otra gente se pueda incluir en el proceso de desarrollo. Se usa el comando import del CVS. Es importante ejecutar este comando desde el directorio donde tengamos las fuentes para importar. También es fundamental establecer la variable de entorno CVSROOT que le indicará al cliente CVS donde está el repositorio.
$ export CVSROOT=/var/lib/repositorio/tuxitron
La sintaxis del comando de importación es la siguiente:
$ cvs import -m "comentario" <proyecto> <etiqueta_vendedor> <etiqueta_version>
Los dos últimos parámetros tienen poca importancia, de modo que puedes sustituirlos por tu usuario y la palabra "inicio" mismo. Por ejemplo, si eres el usuario monkiki y el proyecto a importar se llama tuxitron la lÃnea de comandos serÃa:
$ cvs import -m "Importación inicial" tuxitron monkiki inicio
Si vas a usar CVSTrac en lugar de importar todo el proyecto, importa un directorio vacÃo o uno que contenga un fichero de texto sin importancia (del estilo de leeme.txt) y haz un commit del resto de los ficheros. Los ficheros importados no aparecen en el navegador web de CVS. |
Binarios importados sin '-kb'
Si accidentalmente añades un fichero binario sin la opción '-kb', puedes usar el comando cvs admin para arreglarlo. Por ejemplo:
$ cvs add -m "Imagen de prueba" imagen.gif $ cvs ci -m "Enviamos la imagen no marcada como binario" image.gif
Ahora vamos a decirle que es un fichero binario:
$ cvs admin -kb imagen.gif $ cvs update -A imagen.gif
Esto no pasarÃa si tuviéramos el fichero cvswrappers correctamente configurado |
Trabajar con CVS
La lÃnea de comandos admite gran cantidad de comandos y opciones. En la nomenclatura de CVS, los comandos son parámetros funcionales de CVS. En lugar de tener varios ejecutables, uno para hacer checkout, otro para checkin, otro para status... tiene uno sólo llamado cvs que admite todos estos modos de funcionamiento. Veamos los principales:
- checkout: Saca el fichero del repositorio y lo almacena localmente para poder trabajar con él.
- checkin: Una vez realizados los cambios, volcamos el fichero al repositorio donde estará disponible para el resto de desarrolladores.
- status: Indica el estado actual del fichero.
- log: Saca un listado con las revisiones del fichero.
Pero lo más normal es que uses alguno de los clientes gráficos que existen. Uno de los mejores, aunque no tenga buena apariencia, es TkCVS, el cual podemos instalar con el paquete tkcvs de los repositorios oficiales de Ubuntu.
Notificación de los commits
La configuración de un repositorio también está sujeta al versionado. Asà que para añadir la opción de notificación de correo de los commits tenemos que hacer un checkout del directorio especial CVSROOT.
$ cvs co CVSROOT
Dentro de ese directorio hay unos cuantos ficheros. El que nos interesa ahora es loginfo, al que tenemos que añadir la siguiente lÃnea:
DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --cvs %{sVv} --diff --full
El programa que envÃa los correos lo podemos encontrar aquÃ. El parámetro mailto indica a quién va destinado el correo. Podemos especificar varios mailto. Lo que yo hago es crear un alias en el servidor de correo y enviar el correo a ese alias. Asà puedo poner o quitar los usuarios de destino sin tocar este fichero de configuración.
Hacer una copia de seguridad
Veamos un ejemplo de cómo hacer una copia de seguridad de nuestro preciado repositorio de CVS. Simplemente lo que hace es:
- Crea un archivo .tgz con el contenido del repositorio
- EnvÃa el archivo a un servidor de backup
- EnvÃa un correo al usuario root para avisarle del proceso
El script es bastante simple y puedes adaptarlo a tus necesidades sin gran esfuerzo.
<bash>
#!/bin/sh CVS_ROOT="/var/lib/cvs" TMP_MSG="/tmp/backup_cvs.tmp" TMP_DATA="/root/Backup/CVS#$(date +%Y-%m-%d).tgz" # Make backup echo $TMP_DATA > $TMP_MSG echo "==================================" >> $TMP_MSG /bin/tar czf $TMP_DATA $CVS_ROOT 2>> $TMP_MSG # Subimos todo al FTP de GIT lftp -e "mput $TMP_DATA;quit" ftp://usuario:password@ftp.servidor.com/cvs # Send mail /bin/mail -s "CVS Backup" root < $TMP_MSG /bin/rm $TMP_MSG
</bash>
Ver también
Aplicaciones similares
Enlaces externos
- linux.ie :: Getting Started with CVS (en inglés)
- Sitio web oficial de CVSTrac (en inglés)
- CVSPermissions (en inglés)
- OSSP shiela: CVS Access Control and Logging (en inglés)
- Sitio web oficial de CVS Monitor (en inglés)
- Managing Access with CVS (en inglés)