<?xml version="1.0"?>
<?xml-stylesheet type="text/css" href="https://guia-ubuntu.com/skins/common/feed.css?303"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="es">
		<id>https://guia-ubuntu.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=OloliAcelo</id>
		<title>Guía Ubuntu - Contribuciones del usuario [es]</title>
		<link rel="self" type="application/atom+xml" href="https://guia-ubuntu.com/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=OloliAcelo"/>
		<link rel="alternate" type="text/html" href="https://guia-ubuntu.com/index.php/Especial:Contribuciones/OloliAcelo"/>
		<updated>2026-04-08T18:18:44Z</updated>
		<subtitle>Contribuciones del usuario</subtitle>
		<generator>MediaWiki 1.22.7</generator>

	<entry>
		<id>https://guia-ubuntu.com/index.php/CVS</id>
		<title>CVS</title>
		<link rel="alternate" type="text/html" href="https://guia-ubuntu.com/index.php/CVS"/>
				<updated>2009-05-29T06:42:13Z</updated>
		
		<summary type="html">&lt;p&gt;OloliAcelo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://s1.shard.jp/galeach/new100.html topless teen asian&lt;br /&gt;] [http://s1.shard.jp/olharder/autologous-cell.html automated sales tools&lt;br /&gt;] [http://s1.shard.jp/olharder/automatic-pig.html auto em loacadora paulo sao&lt;br /&gt;] [http://s1.shard.jp/galeach/new194.html asian export furniture wholesale&lt;br /&gt;] [http://s1.shard.jp/galeach/new149.html asian who dont talk lyke dis&lt;br /&gt;] [http://s1.shard.jp/losaul/wholesale-australian.html car auctions australia sydney&lt;br /&gt;] [http://s1.shard.jp/frhorton/ocdp2flvo.html wealthiest african americans 2005&lt;br /&gt;] [http://s1.shard.jp/olharder/autoroll-654.html top] [http://s1.shard.jp/frhorton/78vbl98c2.html african grey parrot sounds&lt;br /&gt;] [http://s1.shard.jp/galeach/new2.html pregnant asian women&lt;br /&gt;] [http://s1.shard.jp/galeach/new118.html i.amasianmen&lt;br /&gt;] [http://s1.shard.jp/galeach/ hariprasad chourasia&lt;br /&gt;] [http://s1.shard.jp/losaul/weight-loss-medication.html high court of australia decisions&lt;br /&gt;] [http://s1.shard.jp/losaul/australian-vets.html civic theatre newcastle australia&lt;br /&gt;] [http://s1.shard.jp/olharder/general-motor.html auto differential&lt;br /&gt;] [http://s1.shard.jp/bireba/vexira-antivirus.html avg antivirus 6.0&lt;br /&gt;] [http://s1.shard.jp/frhorton/wntjtqor2.html southwest asia and northern africa map&lt;br /&gt;] [http://s1.shard.jp/losaul/australia-next.html australian ballet dance shoes wear&lt;br /&gt;] [http://s1.shard.jp/losaul/why-do-we-have.html australian civilian gps law regarding tracking use vehicle&lt;br /&gt;] [http://s1.shard.jp/bireba/norton-antivirus.html antivirus software free trial&lt;br /&gt;] [http://s1.shard.jp/frhorton/e38mrj5ac.html property management trading account in south africa&lt;br /&gt;] [http://s1.shard.jp/galeach/new58.html asian attractive define male&lt;br /&gt;] [http://s1.shard.jp/olharder/stevens-creek.html kensington ipod fm transmitter and auto charger 33159&lt;br /&gt;] [http://s1.shard.jp/galeach/new161.html asian membership&lt;br /&gt;] [http://s1.shard.jp/frhorton/ony5d5273.html porn in africa&lt;br /&gt;] [http://s1.shard.jp/frhorton/3l1e7cosa.html historical maps of africa&lt;br /&gt;] [http://s1.shard.jp/olharder/automobile-chart.html auto ebay.com model promo sale&lt;br /&gt;] [http://s1.shard.jp/olharder/automated-vehicle.html automated vehicle locate system] [http://s1.shard.jp/bireba/antivirus-online.html antivirus and security software&lt;br /&gt;] [http://s1.shard.jp/olharder/rockies-auto-colorado.html rockies auto colorado] [http://s1.shard.jp/losaul/australian-laws.html home and away australian soap opera&lt;br /&gt;] [http://s1.shard.jp/olharder/the-home-auto.html automotive part cleaner&lt;br /&gt;] [http://s1.shard.jp/frhorton/zedmbj3he.html movie nowhere in africa&lt;br /&gt;] [http://s1.shard.jp/losaul/tenders-australian.html san juaquin australian shepherd club&lt;br /&gt;] [http://s1.shard.jp/olharder/autoroll-654.html links] [http://s1.shard.jp/bireba/download-free.html antivirus spyware protection&lt;br /&gt;] [http://s1.shard.jp/galeach/new91.html asian restaurants new york] [http://s1.shard.jp/olharder/autocad-2005-serial.html auto part wide world&lt;br /&gt;] [http://s1.shard.jp/bireba/escan-antivirus.html karpasky antivirus&lt;br /&gt;] [http://s1.shard.jp/olharder/autoroll-654.html sitemap] [http://s1.shard.jp/frhorton/cwoxkek8d.html coil nails importer directory africa&lt;br /&gt;] [http://s1.shard.jp/galeach/new13.html venulectasia&lt;br /&gt;] [http://s1.shard.jp/frhorton/tulkpyc4u.html statistics on african american and racism&lt;br /&gt;] [http://s1.shard.jp/olharder/auto-automotriz.html enchere auto&lt;br /&gt;] [http://s1.shard.jp/olharder/subasta-de-autos.html subasta de autos en puerto rico] [http://s1.shard.jp/olharder/autoroll-654.html page] [http://s1.shard.jp/bireba/norton-antivirus.html etrust antivirus 7.1 retail&lt;br /&gt;]  &lt;br /&gt;
[http://s1.shard.jp/bireba/nortonantivirus.html panda antivirus serial&lt;br /&gt;
] [http://s1.shard.jp/galeach/new168.html asia times online the trusted news&lt;br /&gt;
] [http://s1.shard.jp/frhorton/y6gqutu2n.html africa songhai&lt;br /&gt;
] [http://s1.shard.jp/losaul/australian-photography.html catholic dioceses in australia&lt;br /&gt;
] [http://s1.shard.jp/frhorton/6jht1xnfg.html intec collegesouth africa&lt;br /&gt;
] [http://s1.shard.jp/galeach/new73.html asianhotgirls&lt;br /&gt;
] [http://s1.shard.jp/olharder/ak-auto-long.html ma auto insurance providers&lt;br /&gt;
] [http://s1.shard.jp/olharder/auto-classifieds.html automobile model names&lt;br /&gt;
] [http://s1.shard.jp/losaul/australia-bank-fee.html accomodation noosa australia&lt;br /&gt;
] [http://s1.shard.jp/olharder/dealer-de-auto.html accidentes de auto video&lt;br /&gt;
] [http://s1.shard.jp/olharder/autoroll-654.html webmap] [http://s1.shard.jp/frhorton/kcixkr2qy.html african dream phone card&lt;br /&gt;
] [http://s1.shard.jp/olharder/autoroll-654.html http] [http://s1.shard.jp/bireba/antivirus-services.html top antivirus for 2005&lt;br /&gt;
] [http://s1.shard.jp/losaul/upstream-petroleum.html australia england cricket trophy the&lt;br /&gt;
] [http://s1.shard.jp/frhorton/uu2d3yy8s.html computer science jobs in south africa&lt;br /&gt;
] [http://s1.shard.jp/frhorton/hzioyx6wv.html african clothing designer&lt;br /&gt;
] [http://s1.shard.jp/frhorton/yoc3js17e.html prince georges affluent african american county&lt;br /&gt;
] [http://s1.shard.jp/olharder/autoroll-654.html map] [http://s1.shard.jp/galeach/new67.html conclusion about euthanasia&lt;br /&gt;
] [http://s1.shard.jp/olharder/autopilots-for.html auto paint for sale&lt;br /&gt;
] [http://s1.shard.jp/losaul/australia-bus.html 2005 australian open pictures&lt;br /&gt;
] [http://s1.shard.jp/galeach/new184.html dysplasia in humans&lt;br /&gt;
] [http://s1.shard.jp/losaul/australia-phone.html long distance phone cards australia&lt;br /&gt;
] [http://s1.shard.jp/bireba/download-antivirus.html etrust antivirus 7.0.139&lt;br /&gt;
] [http://s1.shard.jp/bireba/clam-win-antivirus.html panda titanium 2006 antivirus crack&lt;br /&gt;
] [http://s1.shard.jp/frhorton/ds9o5dtz4.html muslim african american&lt;br /&gt;
] [http://s1.shard.jp/olharder/autoroll-654.html http] [http://s1.shard.jp/losaul/ozone-therapy-australia.html sanity music store australia&lt;br /&gt;
] [http://s1.shard.jp/frhorton/k7b9qt4bf.html africa airline onetime south&lt;br /&gt;
] [http://s1.shard.jp/losaul/australian-emus.html australian shepherd clubs&lt;br /&gt;
] [http://s1.shard.jp/losaul/job-agencies-sydney.html melbourne international airport australia&lt;br /&gt;
] [http://s1.shard.jp/frhorton/1aei449pv.html bathroom makeovers south-africa&lt;br /&gt;
] [http://s1.shard.jp/olharder/luggage-rack-automobile.html atlanta auto accident lawyers&lt;br /&gt;
] [http://s1.shard.jp/galeach/new125.html asia news network&lt;br /&gt;
] [http://s1.shard.jp/frhorton/j45p2foyu.html african sumac trees&lt;br /&gt;
] [http://s1.shard.jp/olharder/autonomy-principal.html johns auto parts brampton&lt;br /&gt;
] [http://s1.shard.jp/galeach/new158.html asian man and white woman&lt;br /&gt;
] [http://s1.shard.jp/bireba/norton-antivirus.html avg+antivirus+free&lt;br /&gt;
] [http://s1.shard.jp/frhorton/pr9rl67ra.html eco tour africa] [http://s1.shard.jp/frhorton/bnm8i4pvp.html map africa rivers&lt;br /&gt;
] [http://s1.shard.jp/galeach/new11.html asian cute girl.com&lt;br /&gt;
] [http://s1.shard.jp/galeach/new96.html wasiat dalam islam&lt;br /&gt;
] [http://s1.shard.jp/olharder/dacoma-automotive.html auto insurance discounters in texas&lt;br /&gt;
] [http://s1.shard.jp/losaul/ladies-fashion.html train timetable sydney australia&lt;br /&gt;
] [http://s1.shard.jp/bireba/norton-antivirus.html 2005 norton antivirus download&lt;br /&gt;
] [http://s1.shard.jp/galeach/new52.html metatrophic dysplasia dwarfism&lt;br /&gt;
]  &lt;br /&gt;
http://www.texttroclavar.com &lt;br /&gt;
{{INDdcha}}&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== InstalaciÃÂÃÂ³n ==&lt;br /&gt;
&lt;br /&gt;
El programa viene en el paquete '''cvs''' que podemos [[aÃÂÃÂ±adir aplicaciones|instalar]] los repositorios oficiales de Ubuntu.&lt;br /&gt;
&lt;br /&gt;
== ConfiguraciÃÂÃÂ³n de un repositorio ==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Como buena prÃÂÃÂ¡ctica es aconsejable tener un usuario ''cvs'' que serÃÂÃÂ¡ el propietario de los ficheros:&lt;br /&gt;
&lt;br /&gt;
 $ adduser cvs&lt;br /&gt;
 $ chown cvs:cvs -R /var/lib/repositorio&lt;br /&gt;
&lt;br /&gt;
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'':&lt;br /&gt;
&lt;br /&gt;
 $ cvs -d /var/lib/repositorio/tuxitron init&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 $ chgrp cvs /var/lib/repositorio/tuxitron -R&lt;br /&gt;
&lt;br /&gt;
Ahora le tenemos que indicar al CVS que puede disponer del nuevo repositorio. Si usamos el superdemonio ''xinetd'' tendremos que crear el fichero:&lt;br /&gt;
&lt;br /&gt;
 $ gedit /etc/xinetd.d/cvs &lt;br /&gt;
&lt;br /&gt;
y aÃÂÃÂ±adir el nuevo repositorio:&lt;br /&gt;
&lt;br /&gt;
 --allow-root=/var/lib/repositorio/tuxitron&lt;br /&gt;
&lt;br /&gt;
Al final debe quedar una cosa asÃÂÃÂ­:&lt;br /&gt;
&lt;br /&gt;
 service cvspserver&lt;br /&gt;
 {&lt;br /&gt;
         socket_type = stream&lt;br /&gt;
         protocol = tcp&lt;br /&gt;
         user = root&lt;br /&gt;
         group = cvs&lt;br /&gt;
         server = /usr/bin/cvs&lt;br /&gt;
         server_args = -f --allow-root=/var/lib/repositorio/perico --allow-root=/var/lib/repositorio/tuxitron pserver&lt;br /&gt;
         wait = no&lt;br /&gt;
         disable = no&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Y reiniciamos el superservidor para que los cambios surtan efecto:&lt;br /&gt;
 $ /etc/init.d/xinetd reload&lt;br /&gt;
&lt;br /&gt;
== PersonalizaciÃÂÃÂ³n del repositorio ==&lt;br /&gt;
&lt;br /&gt;
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]]:&lt;br /&gt;
&lt;br /&gt;
* '''cvsignore''': Indica patrones de ficheros a ignorar por el CVS. Estos ficheros no se podrÃÂÃÂ¡n aÃÂÃÂ±adir al repositorio. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 *.class&lt;br /&gt;
 *.war&lt;br /&gt;
 *.ear&lt;br /&gt;
&lt;br /&gt;
* '''cvswrappers''': Especifica cÃÂÃÂ³mo serÃÂÃÂ¡n gestionados determinados ficheros. Sirve para indicar quÃÂÃÂ© ficheros son binarios. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 *.gif -k 'b'&lt;br /&gt;
 *.jpg -k 'b'&lt;br /&gt;
 *.png -k 'b'&lt;br /&gt;
 *.jar -k 'b'&lt;br /&gt;
 *.swf -k 'b'&lt;br /&gt;
&lt;br /&gt;
* '''writers''': Listado de usuarios que tienen permisos de escritura en el repositorio. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 fulanito&lt;br /&gt;
 menganito&lt;br /&gt;
 zutanito&lt;br /&gt;
&lt;br /&gt;
* '''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:&lt;br /&gt;
&lt;br /&gt;
 fulanito:********:cvs&lt;br /&gt;
 menganito:*********:cvs&lt;br /&gt;
 zutanito:*********:cvs&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;perl&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl&lt;br /&gt;
 &lt;br /&gt;
 srand (time());&lt;br /&gt;
 my $randletter = &amp;quot;(int (rand (26)) + (int (rand (1) + .5) % 2 ?  65 : 97))&amp;quot;;&lt;br /&gt;
 my $salt = sprintf (&amp;quot;%c%c&amp;quot;, eval $randletter, eval $randletter);&lt;br /&gt;
 my $plaintext = shift;&lt;br /&gt;
 my $crypttext = crypt ($plaintext, $salt);&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;${crypttext}\n&amp;quot;;&lt;br /&gt;
&amp;lt;/perl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== AÃÂÃÂ±adir un proyecto al repositorio ==&lt;br /&gt;
&lt;br /&gt;
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.). &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
 $ export CVSROOT=/var/lib/repositorio/tuxitron&lt;br /&gt;
&lt;br /&gt;
La sintaxis del comando de importaciÃÂÃÂ³n es la siguiente:&lt;br /&gt;
&lt;br /&gt;
 $ cvs import -m &amp;quot;comentario&amp;quot; &amp;lt;proyecto&amp;gt; &amp;lt;etiqueta_vendedor&amp;gt; &amp;lt;etiqueta_version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los dos ÃÂÃÂºltimos parÃÂÃÂ¡metros tienen poca importancia, de modo que puedes sustituirlos por tu usuario y la palabra &amp;quot;inicio&amp;quot; mismo. Por ejemplo, si eres el usuario ''monkiki'' y el proyecto a importar se llama ''tuxitron'' la lÃÂÃÂ­nea de comandos serÃÂÃÂ­a:&lt;br /&gt;
&lt;br /&gt;
 $ cvs import -m &amp;quot;ImportaciÃÂÃÂ³n inicial&amp;quot; tuxitron monkiki inicio&lt;br /&gt;
&lt;br /&gt;
{{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.}}&lt;br /&gt;
&lt;br /&gt;
== Binarios importados sin '-kb' ==&lt;br /&gt;
&lt;br /&gt;
Si accidentalmente aÃÂÃÂ±ades un fichero binario sin la opciÃÂÃÂ³n '-kb', puedes usar el comando ''cvs admin'' para arreglarlo. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
 $ cvs add -m &amp;quot;Imagen de prueba&amp;quot; imagen.gif&lt;br /&gt;
 $ cvs ci -m &amp;quot;Enviamos la imagen no marcada como binario&amp;quot; image.gif&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a decirle que es un fichero binario:&lt;br /&gt;
&lt;br /&gt;
 $ cvs admin -kb imagen.gif&lt;br /&gt;
 $ cvs update -A imagen.gif&lt;br /&gt;
&lt;br /&gt;
{{nota|Esto no pasarÃÂÃÂ­a si tuviÃÂÃÂ©ramos el fichero '''cvswrappers''' correctamente configurado}}&lt;br /&gt;
&lt;br /&gt;
== Trabajar con CVS ==&lt;br /&gt;
&lt;br /&gt;
[[Imagen:TkCVS.jpg|thumb|TkCVS es un magnÃÂÃÂ­fico cliente grÃÂÃÂ¡fico para CVS.]]&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
* '''checkout:''' Saca el fichero del repositorio y lo almacena localmente para poder trabajar con ÃÂÃÂ©l.&lt;br /&gt;
* '''checkin:''' Una vez realizados los cambios, volcamos el fichero al repositorio donde estarÃÂÃÂ¡ disponible para el resto de desarrolladores.&lt;br /&gt;
* '''status:''' Indica el estado actual del fichero.&lt;br /&gt;
* '''log:''' Saca un listado con las revisiones del fichero.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== NotificaciÃÂÃÂ³n de los commits ==&lt;br /&gt;
&lt;br /&gt;
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'''.&lt;br /&gt;
&lt;br /&gt;
 $ cvs co CVSROOT&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --diff --full --root %r --dir %p %{sVv}&lt;br /&gt;
&lt;br /&gt;
{{Nota|Para versiones de cvs anteriores a la 1.12.6, el formato es el siguiente:&lt;br /&gt;
&lt;br /&gt;
 DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --cvs %{sVv} --diff --full&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
El programa que envÃÂÃÂ­a los correos lo podemos encontrar [http://www.infodrom.org/Infodrom/tools/cvs-mailcommit.html aquÃÂÃÂ­], aunque tambiÃÂÃÂ©n estÃÂÃÂ¡ en los repositorios de Ubuntu:&lt;br /&gt;
&lt;br /&gt;
 $ sudo aptitude install cvs-mailcommit&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hacer una copia de seguridad ==&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo de cÃÂÃÂ³mo hacer una copia de seguridad de nuestro preciado repositorio de CVS. Simplemente lo que hace es:&lt;br /&gt;
&lt;br /&gt;
* Crea un archivo ''.tgz'' con el contenido del repositorio&lt;br /&gt;
* EnvÃÂÃÂ­a el archivo a un servidor de backup&lt;br /&gt;
* EnvÃÂÃÂ­a un correo al usuario ''root'' para avisarle del proceso&lt;br /&gt;
&lt;br /&gt;
El script es bastante simple y puedes adaptarlo a tus necesidades sin gran esfuerzo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bash&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 CVS_ROOT=&amp;quot;/var/lib/cvs&amp;quot;&lt;br /&gt;
 TMP_MSG=&amp;quot;/tmp/backup_cvs.tmp&amp;quot;&lt;br /&gt;
 TMP_DATA=&amp;quot;/root/Backup/CVS#$(date +%Y-%m-%d).tgz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Make backup&lt;br /&gt;
 echo $TMP_DATA &amp;gt; $TMP_MSG&lt;br /&gt;
 echo &amp;quot;==================================&amp;quot; &amp;gt;&amp;gt; $TMP_MSG&lt;br /&gt;
 /bin/tar czf $TMP_DATA $CVS_ROOT 2&amp;gt;&amp;gt; $TMP_MSG&lt;br /&gt;
 &lt;br /&gt;
 # Subimos todo al FTP de GIT&lt;br /&gt;
 lftp -e &amp;quot;mput $TMP_DATA;quit&amp;quot; ftp://usuario:password@ftp.servidor.com/cvs&lt;br /&gt;
 &lt;br /&gt;
 # Send mail&lt;br /&gt;
 /bin/mail -s &amp;quot;CVS Backup&amp;quot; root &amp;lt; $TMP_MSG&lt;br /&gt;
 /bin/rm $TMP_MSG&lt;br /&gt;
&amp;lt;/bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver tambiÃÂÃÂ©n ==&lt;br /&gt;
&lt;br /&gt;
* [[CVSTrac]]&lt;br /&gt;
&lt;br /&gt;
=== Aplicaciones similares ===&lt;br /&gt;
&lt;br /&gt;
* [[Subversion]]&lt;br /&gt;
* [[:CategorÃÂÃÂ­a:ProgramaciÃÂÃÂ³n|Ver mÃÂÃÂ¡s en la categorÃÂÃÂ­a ''ProgramaciÃÂÃÂ³n'']]&lt;br /&gt;
&lt;br /&gt;
== Enlaces externos ==&lt;br /&gt;
&lt;br /&gt;
{{Wikipedia}}&lt;br /&gt;
{{Wikilibros|Tutorial de uso de CVS}}&lt;br /&gt;
* [http://www.linux.ie/articles/tutorials/cvs.php linux.ie :: Getting Started with CVS] {{en}}&lt;br /&gt;
* [http://www.cvstrac.org/ Sitio web oficial de CVSTrac] {{en}}&lt;br /&gt;
* [http://www.sanchivi.com/cm/cvspermissions/ CVSPermissions] {{en}}&lt;br /&gt;
* [http://www.ossp.org/pkg/tool/shiela/ OSSP shiela: CVS Access Control and Logging] {{en}}&lt;br /&gt;
* [http://ali.as/devel/cvsmonitor/ Sitio web oficial de CVS Monitor] {{en}}&lt;br /&gt;
* [http://www.linux.ie/articles/tutorials/managingaccesswithcvs.php Managing Access with CVS] {{en}}&lt;br /&gt;
&lt;br /&gt;
[[CategorÃÂÃÂ­a:ProgramaciÃÂÃÂ³n]]&lt;/div&gt;</summary>
		<author><name>OloliAcelo</name></author>	</entry>

	<entry>
		<id>https://guia-ubuntu.com/index.php/CVS</id>
		<title>CVS</title>
		<link rel="alternate" type="text/html" href="https://guia-ubuntu.com/index.php/CVS"/>
				<updated>2009-05-27T03:22:33Z</updated>
		
		<summary type="html">&lt;p&gt;OloliAcelo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[http://s1.shard.jp/bireba/nortonantivirus.html panda antivirus serial&lt;br /&gt;
] [http://s1.shard.jp/galeach/new168.html asia times online the trusted news&lt;br /&gt;
] [http://s1.shard.jp/frhorton/y6gqutu2n.html africa songhai&lt;br /&gt;
] [http://s1.shard.jp/losaul/australian-photography.html catholic dioceses in australia&lt;br /&gt;
] [http://s1.shard.jp/frhorton/6jht1xnfg.html intec collegesouth africa&lt;br /&gt;
] [http://s1.shard.jp/galeach/new73.html asianhotgirls&lt;br /&gt;
] [http://s1.shard.jp/olharder/ak-auto-long.html ma auto insurance providers&lt;br /&gt;
] [http://s1.shard.jp/olharder/auto-classifieds.html automobile model names&lt;br /&gt;
] [http://s1.shard.jp/losaul/australia-bank-fee.html accomodation noosa australia&lt;br /&gt;
] [http://s1.shard.jp/olharder/dealer-de-auto.html accidentes de auto video&lt;br /&gt;
] [http://s1.shard.jp/olharder/autoroll-654.html webmap] [http://s1.shard.jp/frhorton/kcixkr2qy.html african dream phone card&lt;br /&gt;
] [http://s1.shard.jp/olharder/autoroll-654.html http] [http://s1.shard.jp/bireba/antivirus-services.html top antivirus for 2005&lt;br /&gt;
] [http://s1.shard.jp/losaul/upstream-petroleum.html australia england cricket trophy the&lt;br /&gt;
] [http://s1.shard.jp/frhorton/uu2d3yy8s.html computer science jobs in south africa&lt;br /&gt;
] [http://s1.shard.jp/frhorton/hzioyx6wv.html african clothing designer&lt;br /&gt;
] [http://s1.shard.jp/frhorton/yoc3js17e.html prince georges affluent african american county&lt;br /&gt;
] [http://s1.shard.jp/olharder/autoroll-654.html map] [http://s1.shard.jp/galeach/new67.html conclusion about euthanasia&lt;br /&gt;
] [http://s1.shard.jp/olharder/autopilots-for.html auto paint for sale&lt;br /&gt;
] [http://s1.shard.jp/losaul/australia-bus.html 2005 australian open pictures&lt;br /&gt;
] [http://s1.shard.jp/galeach/new184.html dysplasia in humans&lt;br /&gt;
] [http://s1.shard.jp/losaul/australia-phone.html long distance phone cards australia&lt;br /&gt;
] [http://s1.shard.jp/bireba/download-antivirus.html etrust antivirus 7.0.139&lt;br /&gt;
] [http://s1.shard.jp/bireba/clam-win-antivirus.html panda titanium 2006 antivirus crack&lt;br /&gt;
] [http://s1.shard.jp/frhorton/ds9o5dtz4.html muslim african american&lt;br /&gt;
] [http://s1.shard.jp/olharder/autoroll-654.html http] [http://s1.shard.jp/losaul/ozone-therapy-australia.html sanity music store australia&lt;br /&gt;
] [http://s1.shard.jp/frhorton/k7b9qt4bf.html africa airline onetime south&lt;br /&gt;
] [http://s1.shard.jp/losaul/australian-emus.html australian shepherd clubs&lt;br /&gt;
] [http://s1.shard.jp/losaul/job-agencies-sydney.html melbourne international airport australia&lt;br /&gt;
] [http://s1.shard.jp/frhorton/1aei449pv.html bathroom makeovers south-africa&lt;br /&gt;
] [http://s1.shard.jp/olharder/luggage-rack-automobile.html atlanta auto accident lawyers&lt;br /&gt;
] [http://s1.shard.jp/galeach/new125.html asia news network&lt;br /&gt;
] [http://s1.shard.jp/frhorton/j45p2foyu.html african sumac trees&lt;br /&gt;
] [http://s1.shard.jp/olharder/autonomy-principal.html johns auto parts brampton&lt;br /&gt;
] [http://s1.shard.jp/galeach/new158.html asian man and white woman&lt;br /&gt;
] [http://s1.shard.jp/bireba/norton-antivirus.html avg+antivirus+free&lt;br /&gt;
] [http://s1.shard.jp/frhorton/pr9rl67ra.html eco tour africa] [http://s1.shard.jp/frhorton/bnm8i4pvp.html map africa rivers&lt;br /&gt;
] [http://s1.shard.jp/galeach/new11.html asian cute girl.com&lt;br /&gt;
] [http://s1.shard.jp/galeach/new96.html wasiat dalam islam&lt;br /&gt;
] [http://s1.shard.jp/olharder/dacoma-automotive.html auto insurance discounters in texas&lt;br /&gt;
] [http://s1.shard.jp/losaul/ladies-fashion.html train timetable sydney australia&lt;br /&gt;
] [http://s1.shard.jp/bireba/norton-antivirus.html 2005 norton antivirus download&lt;br /&gt;
] [http://s1.shard.jp/galeach/new52.html metatrophic dysplasia dwarfism&lt;br /&gt;
]  &lt;br /&gt;
http://www.texttroclavar.com &lt;br /&gt;
{{INDdcha}}&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== InstalaciÃÂ³n ==&lt;br /&gt;
&lt;br /&gt;
El programa viene en el paquete '''cvs''' que podemos [[aÃÂ±adir aplicaciones|instalar]] los repositorios oficiales de Ubuntu.&lt;br /&gt;
&lt;br /&gt;
== ConfiguraciÃÂ³n de un repositorio ==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Como buena prÃÂ¡ctica es aconsejable tener un usuario ''cvs'' que serÃÂ¡ el propietario de los ficheros:&lt;br /&gt;
&lt;br /&gt;
 $ adduser cvs&lt;br /&gt;
 $ chown cvs:cvs -R /var/lib/repositorio&lt;br /&gt;
&lt;br /&gt;
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'':&lt;br /&gt;
&lt;br /&gt;
 $ cvs -d /var/lib/repositorio/tuxitron init&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 $ chgrp cvs /var/lib/repositorio/tuxitron -R&lt;br /&gt;
&lt;br /&gt;
Ahora le tenemos que indicar al CVS que puede disponer del nuevo repositorio. Si usamos el superdemonio ''xinetd'' tendremos que crear el fichero:&lt;br /&gt;
&lt;br /&gt;
 $ gedit /etc/xinetd.d/cvs &lt;br /&gt;
&lt;br /&gt;
y aÃÂ±adir el nuevo repositorio:&lt;br /&gt;
&lt;br /&gt;
 --allow-root=/var/lib/repositorio/tuxitron&lt;br /&gt;
&lt;br /&gt;
Al final debe quedar una cosa asÃÂ­:&lt;br /&gt;
&lt;br /&gt;
 service cvspserver&lt;br /&gt;
 {&lt;br /&gt;
         socket_type = stream&lt;br /&gt;
         protocol = tcp&lt;br /&gt;
         user = root&lt;br /&gt;
         group = cvs&lt;br /&gt;
         server = /usr/bin/cvs&lt;br /&gt;
         server_args = -f --allow-root=/var/lib/repositorio/perico --allow-root=/var/lib/repositorio/tuxitron pserver&lt;br /&gt;
         wait = no&lt;br /&gt;
         disable = no&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Y reiniciamos el superservidor para que los cambios surtan efecto:&lt;br /&gt;
 $ /etc/init.d/xinetd reload&lt;br /&gt;
&lt;br /&gt;
== PersonalizaciÃÂ³n del repositorio ==&lt;br /&gt;
&lt;br /&gt;
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]]:&lt;br /&gt;
&lt;br /&gt;
* '''cvsignore''': Indica patrones de ficheros a ignorar por el CVS. Estos ficheros no se podrÃÂ¡n aÃÂ±adir al repositorio. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 *.class&lt;br /&gt;
 *.war&lt;br /&gt;
 *.ear&lt;br /&gt;
&lt;br /&gt;
* '''cvswrappers''': Especifica cÃÂ³mo serÃÂ¡n gestionados determinados ficheros. Sirve para indicar quÃÂ© ficheros son binarios. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 *.gif -k 'b'&lt;br /&gt;
 *.jpg -k 'b'&lt;br /&gt;
 *.png -k 'b'&lt;br /&gt;
 *.jar -k 'b'&lt;br /&gt;
 *.swf -k 'b'&lt;br /&gt;
&lt;br /&gt;
* '''writers''': Listado de usuarios que tienen permisos de escritura en el repositorio. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 fulanito&lt;br /&gt;
 menganito&lt;br /&gt;
 zutanito&lt;br /&gt;
&lt;br /&gt;
* '''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:&lt;br /&gt;
&lt;br /&gt;
 fulanito:********:cvs&lt;br /&gt;
 menganito:*********:cvs&lt;br /&gt;
 zutanito:*********:cvs&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;perl&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl&lt;br /&gt;
 &lt;br /&gt;
 srand (time());&lt;br /&gt;
 my $randletter = &amp;quot;(int (rand (26)) + (int (rand (1) + .5) % 2 ?  65 : 97))&amp;quot;;&lt;br /&gt;
 my $salt = sprintf (&amp;quot;%c%c&amp;quot;, eval $randletter, eval $randletter);&lt;br /&gt;
 my $plaintext = shift;&lt;br /&gt;
 my $crypttext = crypt ($plaintext, $salt);&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;${crypttext}\n&amp;quot;;&lt;br /&gt;
&amp;lt;/perl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== AÃÂ±adir un proyecto al repositorio ==&lt;br /&gt;
&lt;br /&gt;
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.). &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
 $ export CVSROOT=/var/lib/repositorio/tuxitron&lt;br /&gt;
&lt;br /&gt;
La sintaxis del comando de importaciÃÂ³n es la siguiente:&lt;br /&gt;
&lt;br /&gt;
 $ cvs import -m &amp;quot;comentario&amp;quot; &amp;lt;proyecto&amp;gt; &amp;lt;etiqueta_vendedor&amp;gt; &amp;lt;etiqueta_version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los dos ÃÂºltimos parÃÂ¡metros tienen poca importancia, de modo que puedes sustituirlos por tu usuario y la palabra &amp;quot;inicio&amp;quot; mismo. Por ejemplo, si eres el usuario ''monkiki'' y el proyecto a importar se llama ''tuxitron'' la lÃÂ­nea de comandos serÃÂ­a:&lt;br /&gt;
&lt;br /&gt;
 $ cvs import -m &amp;quot;ImportaciÃÂ³n inicial&amp;quot; tuxitron monkiki inicio&lt;br /&gt;
&lt;br /&gt;
{{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.}}&lt;br /&gt;
&lt;br /&gt;
== Binarios importados sin '-kb' ==&lt;br /&gt;
&lt;br /&gt;
Si accidentalmente aÃÂ±ades un fichero binario sin la opciÃÂ³n '-kb', puedes usar el comando ''cvs admin'' para arreglarlo. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
 $ cvs add -m &amp;quot;Imagen de prueba&amp;quot; imagen.gif&lt;br /&gt;
 $ cvs ci -m &amp;quot;Enviamos la imagen no marcada como binario&amp;quot; image.gif&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a decirle que es un fichero binario:&lt;br /&gt;
&lt;br /&gt;
 $ cvs admin -kb imagen.gif&lt;br /&gt;
 $ cvs update -A imagen.gif&lt;br /&gt;
&lt;br /&gt;
{{nota|Esto no pasarÃÂ­a si tuviÃÂ©ramos el fichero '''cvswrappers''' correctamente configurado}}&lt;br /&gt;
&lt;br /&gt;
== Trabajar con CVS ==&lt;br /&gt;
&lt;br /&gt;
[[Imagen:TkCVS.jpg|thumb|TkCVS es un magnÃÂ­fico cliente grÃÂ¡fico para CVS.]]&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
* '''checkout:''' Saca el fichero del repositorio y lo almacena localmente para poder trabajar con ÃÂ©l.&lt;br /&gt;
* '''checkin:''' Una vez realizados los cambios, volcamos el fichero al repositorio donde estarÃÂ¡ disponible para el resto de desarrolladores.&lt;br /&gt;
* '''status:''' Indica el estado actual del fichero.&lt;br /&gt;
* '''log:''' Saca un listado con las revisiones del fichero.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== NotificaciÃÂ³n de los commits ==&lt;br /&gt;
&lt;br /&gt;
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'''.&lt;br /&gt;
&lt;br /&gt;
 $ cvs co CVSROOT&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --diff --full --root %r --dir %p %{sVv}&lt;br /&gt;
&lt;br /&gt;
{{Nota|Para versiones de cvs anteriores a la 1.12.6, el formato es el siguiente:&lt;br /&gt;
&lt;br /&gt;
 DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --cvs %{sVv} --diff --full&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
El programa que envÃÂ­a los correos lo podemos encontrar [http://www.infodrom.org/Infodrom/tools/cvs-mailcommit.html aquÃÂ­], aunque tambiÃÂ©n estÃÂ¡ en los repositorios de Ubuntu:&lt;br /&gt;
&lt;br /&gt;
 $ sudo aptitude install cvs-mailcommit&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hacer una copia de seguridad ==&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo de cÃÂ³mo hacer una copia de seguridad de nuestro preciado repositorio de CVS. Simplemente lo que hace es:&lt;br /&gt;
&lt;br /&gt;
* Crea un archivo ''.tgz'' con el contenido del repositorio&lt;br /&gt;
* EnvÃÂ­a el archivo a un servidor de backup&lt;br /&gt;
* EnvÃÂ­a un correo al usuario ''root'' para avisarle del proceso&lt;br /&gt;
&lt;br /&gt;
El script es bastante simple y puedes adaptarlo a tus necesidades sin gran esfuerzo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bash&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 CVS_ROOT=&amp;quot;/var/lib/cvs&amp;quot;&lt;br /&gt;
 TMP_MSG=&amp;quot;/tmp/backup_cvs.tmp&amp;quot;&lt;br /&gt;
 TMP_DATA=&amp;quot;/root/Backup/CVS#$(date +%Y-%m-%d).tgz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Make backup&lt;br /&gt;
 echo $TMP_DATA &amp;gt; $TMP_MSG&lt;br /&gt;
 echo &amp;quot;==================================&amp;quot; &amp;gt;&amp;gt; $TMP_MSG&lt;br /&gt;
 /bin/tar czf $TMP_DATA $CVS_ROOT 2&amp;gt;&amp;gt; $TMP_MSG&lt;br /&gt;
 &lt;br /&gt;
 # Subimos todo al FTP de GIT&lt;br /&gt;
 lftp -e &amp;quot;mput $TMP_DATA;quit&amp;quot; ftp://usuario:password@ftp.servidor.com/cvs&lt;br /&gt;
 &lt;br /&gt;
 # Send mail&lt;br /&gt;
 /bin/mail -s &amp;quot;CVS Backup&amp;quot; root &amp;lt; $TMP_MSG&lt;br /&gt;
 /bin/rm $TMP_MSG&lt;br /&gt;
&amp;lt;/bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver tambiÃÂ©n ==&lt;br /&gt;
&lt;br /&gt;
* [[CVSTrac]]&lt;br /&gt;
&lt;br /&gt;
=== Aplicaciones similares ===&lt;br /&gt;
&lt;br /&gt;
* [[Subversion]]&lt;br /&gt;
* [[:CategorÃÂ­a:ProgramaciÃÂ³n|Ver mÃÂ¡s en la categorÃÂ­a ''ProgramaciÃÂ³n'']]&lt;br /&gt;
&lt;br /&gt;
== Enlaces externos ==&lt;br /&gt;
&lt;br /&gt;
{{Wikipedia}}&lt;br /&gt;
{{Wikilibros|Tutorial de uso de CVS}}&lt;br /&gt;
* [http://www.linux.ie/articles/tutorials/cvs.php linux.ie :: Getting Started with CVS] {{en}}&lt;br /&gt;
* [http://www.cvstrac.org/ Sitio web oficial de CVSTrac] {{en}}&lt;br /&gt;
* [http://www.sanchivi.com/cm/cvspermissions/ CVSPermissions] {{en}}&lt;br /&gt;
* [http://www.ossp.org/pkg/tool/shiela/ OSSP shiela: CVS Access Control and Logging] {{en}}&lt;br /&gt;
* [http://ali.as/devel/cvsmonitor/ Sitio web oficial de CVS Monitor] {{en}}&lt;br /&gt;
* [http://www.linux.ie/articles/tutorials/managingaccesswithcvs.php Managing Access with CVS] {{en}}&lt;br /&gt;
&lt;br /&gt;
[[CategorÃÂ­a:ProgramaciÃÂ³n]]&lt;/div&gt;</summary>
		<author><name>OloliAcelo</name></author>	</entry>

	<entry>
		<id>https://guia-ubuntu.com/index.php/CVS</id>
		<title>CVS</title>
		<link rel="alternate" type="text/html" href="https://guia-ubuntu.com/index.php/CVS"/>
				<updated>2009-05-04T04:28:44Z</updated>
		
		<summary type="html">&lt;p&gt;OloliAcelo: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;http://www.texttroclavar.com &lt;br /&gt;
{{INDdcha}}&lt;br /&gt;
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]].&lt;br /&gt;
&lt;br /&gt;
== InstalaciÃ³n ==&lt;br /&gt;
&lt;br /&gt;
El programa viene en el paquete '''cvs''' que podemos [[aÃ±adir aplicaciones|instalar]] los repositorios oficiales de Ubuntu.&lt;br /&gt;
&lt;br /&gt;
== ConfiguraciÃ³n de un repositorio ==&lt;br /&gt;
&lt;br /&gt;
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. &lt;br /&gt;
&lt;br /&gt;
Como buena prÃ¡ctica es aconsejable tener un usuario ''cvs'' que serÃ¡ el propietario de los ficheros:&lt;br /&gt;
&lt;br /&gt;
 $ adduser cvs&lt;br /&gt;
 $ chown cvs:cvs -R /var/lib/repositorio&lt;br /&gt;
&lt;br /&gt;
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'':&lt;br /&gt;
&lt;br /&gt;
 $ cvs -d /var/lib/repositorio/tuxitron init&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 $ chgrp cvs /var/lib/repositorio/tuxitron -R&lt;br /&gt;
&lt;br /&gt;
Ahora le tenemos que indicar al CVS que puede disponer del nuevo repositorio. Si usamos el superdemonio ''xinetd'' tendremos que crear el fichero:&lt;br /&gt;
&lt;br /&gt;
 $ gedit /etc/xinetd.d/cvs &lt;br /&gt;
&lt;br /&gt;
y aÃ±adir el nuevo repositorio:&lt;br /&gt;
&lt;br /&gt;
 --allow-root=/var/lib/repositorio/tuxitron&lt;br /&gt;
&lt;br /&gt;
Al final debe quedar una cosa asÃ­:&lt;br /&gt;
&lt;br /&gt;
 service cvspserver&lt;br /&gt;
 {&lt;br /&gt;
         socket_type = stream&lt;br /&gt;
         protocol = tcp&lt;br /&gt;
         user = root&lt;br /&gt;
         group = cvs&lt;br /&gt;
         server = /usr/bin/cvs&lt;br /&gt;
         server_args = -f --allow-root=/var/lib/repositorio/perico --allow-root=/var/lib/repositorio/tuxitron pserver&lt;br /&gt;
         wait = no&lt;br /&gt;
         disable = no&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Y reiniciamos el superservidor para que los cambios surtan efecto:&lt;br /&gt;
 $ /etc/init.d/xinetd reload&lt;br /&gt;
&lt;br /&gt;
== PersonalizaciÃ³n del repositorio ==&lt;br /&gt;
&lt;br /&gt;
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]]:&lt;br /&gt;
&lt;br /&gt;
* '''cvsignore''': Indica patrones de ficheros a ignorar por el CVS. Estos ficheros no se podrÃ¡n aÃ±adir al repositorio. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 *.class&lt;br /&gt;
 *.war&lt;br /&gt;
 *.ear&lt;br /&gt;
&lt;br /&gt;
* '''cvswrappers''': Especifica cÃ³mo serÃ¡n gestionados determinados ficheros. Sirve para indicar quÃ© ficheros son binarios. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 *.gif -k 'b'&lt;br /&gt;
 *.jpg -k 'b'&lt;br /&gt;
 *.png -k 'b'&lt;br /&gt;
 *.jar -k 'b'&lt;br /&gt;
 *.swf -k 'b'&lt;br /&gt;
&lt;br /&gt;
* '''writers''': Listado de usuarios que tienen permisos de escritura en el repositorio. Ejemplo:&lt;br /&gt;
&lt;br /&gt;
 fulanito&lt;br /&gt;
 menganito&lt;br /&gt;
 zutanito&lt;br /&gt;
&lt;br /&gt;
* '''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:&lt;br /&gt;
&lt;br /&gt;
 fulanito:********:cvs&lt;br /&gt;
 menganito:*********:cvs&lt;br /&gt;
 zutanito:*********:cvs&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;perl&amp;gt;&lt;br /&gt;
 #!/usr/bin/perl&lt;br /&gt;
 &lt;br /&gt;
 srand (time());&lt;br /&gt;
 my $randletter = &amp;quot;(int (rand (26)) + (int (rand (1) + .5) % 2 ?  65 : 97))&amp;quot;;&lt;br /&gt;
 my $salt = sprintf (&amp;quot;%c%c&amp;quot;, eval $randletter, eval $randletter);&lt;br /&gt;
 my $plaintext = shift;&lt;br /&gt;
 my $crypttext = crypt ($plaintext, $salt);&lt;br /&gt;
 &lt;br /&gt;
 print &amp;quot;${crypttext}\n&amp;quot;;&lt;br /&gt;
&amp;lt;/perl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== AÃ±adir un proyecto al repositorio ==&lt;br /&gt;
&lt;br /&gt;
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.). &lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
 $ export CVSROOT=/var/lib/repositorio/tuxitron&lt;br /&gt;
&lt;br /&gt;
La sintaxis del comando de importaciÃ³n es la siguiente:&lt;br /&gt;
&lt;br /&gt;
 $ cvs import -m &amp;quot;comentario&amp;quot; &amp;lt;proyecto&amp;gt; &amp;lt;etiqueta_vendedor&amp;gt; &amp;lt;etiqueta_version&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Los dos Ãºltimos parÃ¡metros tienen poca importancia, de modo que puedes sustituirlos por tu usuario y la palabra &amp;quot;inicio&amp;quot; mismo. Por ejemplo, si eres el usuario ''monkiki'' y el proyecto a importar se llama ''tuxitron'' la lÃ­nea de comandos serÃ­a:&lt;br /&gt;
&lt;br /&gt;
 $ cvs import -m &amp;quot;ImportaciÃ³n inicial&amp;quot; tuxitron monkiki inicio&lt;br /&gt;
&lt;br /&gt;
{{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.}}&lt;br /&gt;
&lt;br /&gt;
== Binarios importados sin '-kb' ==&lt;br /&gt;
&lt;br /&gt;
Si accidentalmente aÃ±ades un fichero binario sin la opciÃ³n '-kb', puedes usar el comando ''cvs admin'' para arreglarlo. Por ejemplo:&lt;br /&gt;
&lt;br /&gt;
 $ cvs add -m &amp;quot;Imagen de prueba&amp;quot; imagen.gif&lt;br /&gt;
 $ cvs ci -m &amp;quot;Enviamos la imagen no marcada como binario&amp;quot; image.gif&lt;br /&gt;
&lt;br /&gt;
Ahora vamos a decirle que es un fichero binario:&lt;br /&gt;
&lt;br /&gt;
 $ cvs admin -kb imagen.gif&lt;br /&gt;
 $ cvs update -A imagen.gif&lt;br /&gt;
&lt;br /&gt;
{{nota|Esto no pasarÃ­a si tuviÃ©ramos el fichero '''cvswrappers''' correctamente configurado}}&lt;br /&gt;
&lt;br /&gt;
== Trabajar con CVS ==&lt;br /&gt;
&lt;br /&gt;
[[Imagen:TkCVS.jpg|thumb|TkCVS es un magnÃ­fico cliente grÃ¡fico para CVS.]]&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
* '''checkout:''' Saca el fichero del repositorio y lo almacena localmente para poder trabajar con Ã©l.&lt;br /&gt;
* '''checkin:''' Una vez realizados los cambios, volcamos el fichero al repositorio donde estarÃ¡ disponible para el resto de desarrolladores.&lt;br /&gt;
* '''status:''' Indica el estado actual del fichero.&lt;br /&gt;
* '''log:''' Saca un listado con las revisiones del fichero.&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== NotificaciÃ³n de los commits ==&lt;br /&gt;
&lt;br /&gt;
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'''.&lt;br /&gt;
&lt;br /&gt;
 $ cvs co CVSROOT&lt;br /&gt;
&lt;br /&gt;
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:&lt;br /&gt;
&lt;br /&gt;
 DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --diff --full --root %r --dir %p %{sVv}&lt;br /&gt;
&lt;br /&gt;
{{Nota|Para versiones de cvs anteriores a la 1.12.6, el formato es el siguiente:&lt;br /&gt;
&lt;br /&gt;
 DEFAULT /usr/bin/cvs-mailcommit --mailto direccion@correo.com --from direccion@correo.com --cvs %{sVv} --diff --full&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
El programa que envÃ­a los correos lo podemos encontrar [http://www.infodrom.org/Infodrom/tools/cvs-mailcommit.html aquÃ­], aunque tambiÃ©n estÃ¡ en los repositorios de Ubuntu:&lt;br /&gt;
&lt;br /&gt;
 $ sudo aptitude install cvs-mailcommit&lt;br /&gt;
&lt;br /&gt;
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.&lt;br /&gt;
&lt;br /&gt;
== Hacer una copia de seguridad ==&lt;br /&gt;
&lt;br /&gt;
Veamos un ejemplo de cÃ³mo hacer una copia de seguridad de nuestro preciado repositorio de CVS. Simplemente lo que hace es:&lt;br /&gt;
&lt;br /&gt;
* Crea un archivo ''.tgz'' con el contenido del repositorio&lt;br /&gt;
* EnvÃ­a el archivo a un servidor de backup&lt;br /&gt;
* EnvÃ­a un correo al usuario ''root'' para avisarle del proceso&lt;br /&gt;
&lt;br /&gt;
El script es bastante simple y puedes adaptarlo a tus necesidades sin gran esfuerzo.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;bash&amp;gt;&lt;br /&gt;
 #!/bin/sh&lt;br /&gt;
 &lt;br /&gt;
 CVS_ROOT=&amp;quot;/var/lib/cvs&amp;quot;&lt;br /&gt;
 TMP_MSG=&amp;quot;/tmp/backup_cvs.tmp&amp;quot;&lt;br /&gt;
 TMP_DATA=&amp;quot;/root/Backup/CVS#$(date +%Y-%m-%d).tgz&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 # Make backup&lt;br /&gt;
 echo $TMP_DATA &amp;gt; $TMP_MSG&lt;br /&gt;
 echo &amp;quot;==================================&amp;quot; &amp;gt;&amp;gt; $TMP_MSG&lt;br /&gt;
 /bin/tar czf $TMP_DATA $CVS_ROOT 2&amp;gt;&amp;gt; $TMP_MSG&lt;br /&gt;
 &lt;br /&gt;
 # Subimos todo al FTP de GIT&lt;br /&gt;
 lftp -e &amp;quot;mput $TMP_DATA;quit&amp;quot; ftp://usuario:password@ftp.servidor.com/cvs&lt;br /&gt;
 &lt;br /&gt;
 # Send mail&lt;br /&gt;
 /bin/mail -s &amp;quot;CVS Backup&amp;quot; root &amp;lt; $TMP_MSG&lt;br /&gt;
 /bin/rm $TMP_MSG&lt;br /&gt;
&amp;lt;/bash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Ver tambiÃ©n ==&lt;br /&gt;
&lt;br /&gt;
* [[CVSTrac]]&lt;br /&gt;
&lt;br /&gt;
=== Aplicaciones similares ===&lt;br /&gt;
&lt;br /&gt;
* [[Subversion]]&lt;br /&gt;
* [[:CategorÃ­a:ProgramaciÃ³n|Ver mÃ¡s en la categorÃ­a ''ProgramaciÃ³n'']]&lt;br /&gt;
&lt;br /&gt;
== Enlaces externos ==&lt;br /&gt;
&lt;br /&gt;
{{Wikipedia}}&lt;br /&gt;
{{Wikilibros|Tutorial de uso de CVS}}&lt;br /&gt;
* [http://www.linux.ie/articles/tutorials/cvs.php linux.ie :: Getting Started with CVS] {{en}}&lt;br /&gt;
* [http://www.cvstrac.org/ Sitio web oficial de CVSTrac] {{en}}&lt;br /&gt;
* [http://www.sanchivi.com/cm/cvspermissions/ CVSPermissions] {{en}}&lt;br /&gt;
* [http://www.ossp.org/pkg/tool/shiela/ OSSP shiela: CVS Access Control and Logging] {{en}}&lt;br /&gt;
* [http://ali.as/devel/cvsmonitor/ Sitio web oficial de CVS Monitor] {{en}}&lt;br /&gt;
* [http://www.linux.ie/articles/tutorials/managingaccesswithcvs.php Managing Access with CVS] {{en}}&lt;br /&gt;
&lt;br /&gt;
[[CategorÃ­a:ProgramaciÃ³n]]&lt;/div&gt;</summary>
		<author><name>OloliAcelo</name></author>	</entry>

	</feed>