{"id":148,"date":"2004-07-03T16:28:10","date_gmt":"2004-07-03T14:28:10","guid":{"rendered":"http:\/\/www.marblestation.com\/blog\/?p=148"},"modified":"2012-04-26T19:06:38","modified_gmt":"2012-04-26T17:06:38","slug":"servidor-subversion-con-gentoo","status":"publish","type":"post","link":"https:\/\/www.marblestation.com\/?p=148","title":{"rendered":"Servidor subversion con Gentoo"},"content":{"rendered":"<p>Hoy he creado un servidor <a href=\"http:\/\/subversion.tigris.org\/\">subversi\u00f3n<\/a> (reemplazo de <a href=\"http:\/\/www.cvshome.org\/\">CVS<\/a>) en mi LAN. Para los que no conozcan subversi\u00f3n solo decir que se utiliza para el control de versiones de c\u00f3digo fuente (o incluso de otros tipos de archivos como configuraciones), es muy parecido a CVS pero incorpora importantes novedades que lo hacen mejor y m\u00e1s flexible:<\/p>\n<ul>\n<li>Versionado de directorios, movimientos y metadatos. Esta era una gran carencia en CVS, para mover un archivo de directorio o renombrarlo se perdia todo el historial del mismo.<\/li>\n<li>Commits at\u00f3micos. Dos usuarios que intenten actualizar el repositorio en el servidor a la vez no se ven afectados por tal situacion.<\/li>\n<li>Posibilidad de trabajar con apache, esto hace que nos podamos aprovechar de toda la tecnolog\u00eda de este magn\u00edfico servidor web. Es posible utilizar SSL (encriptaci\u00f3n), trabajar remotamente utilizando el puerto est\u00e1ndar de los servidores web (puerto 80) el cual no suele estar bloqueado por los firewalls, autentificaci\u00f3n de usuarios, etc&#8230;<\/li>\n<\/ul>\n<p>Subversion utiliza apache 2 para servir por red y yo ya disponia de este bien configurado, por tanto parto de una buena situaci\u00f3n \ud83d\ude42 Lo primero ha sido emerger subversion, es importante tener en la variable USE activado &#8220;apache2&#8221; (es posible editar las USE con el comando ufed, emerge ufed ;-)) de lo contrario solo se nos instalar\u00e1 el cliente y no el servidor subversion:<br \/>\n<!--more--><\/p>\n<pre>\r\nemerge subversion\r\n<\/pre>\n<p>A continuaci\u00f3n se necesita ejecutar la configuraci\u00f3n del ebuild, como la versi\u00f3n instalada ha sido la 1.0.4-r1 se utilizar\u00e1 el correspondiente ebuild:<\/p>\n<pre>\r\nebuild \/usr\/portage\/dev-util\/subversion\/subversion-1.0.4-r1.ebuild config\r\n<\/pre>\n<p>Esto prepara el repositorio en \/var\/svn\/repos\/, a continuaci\u00f3n debemos crear el fichero con los usuarios que vamos a dar acceso escritura al servidor subversion:<\/p>\n<pre>\r\nhtpasswd2 -m -c \/var\/svn\/conf\/svnusers usuario1\r\nhtpasswd2 -m \/var\/svn\/conf\/svnusers usuario2\r\nhtpasswd2 -m \/var\/svn\/conf\/svnusers usuario3\r\n<\/pre>\n<p>El siguiente paso es editar el archivo de configuraci\u00f3n del m\u00f3dulo subversion para apache2, se encuentra en \/etc\/apache2\/conf\/modules.d\/47_mod_dav_svn.conf y por defecto contiene:<\/p>\n<pre>\r\n&#60;IfDefine SVN>\r\n        &#60;IfModule !mod_dav_svn.c>\r\n                LoadModule dav_svn_module       extramodules\/mod_dav_svn.so\r\n        &#60;\/IfModule>\r\n        &#60;Location \/svn\/repos>\r\n                DAV svn\r\n                SVNPath \/var\/svn\/repos\r\n                AuthType Basic\r\n                AuthName \"Subversion repository\"\r\n                AuthUserFile \/var\/svn\/conf\/svnusers\r\n                Require valid-user\r\n        &#60;\/Location>\r\n&#60;\/IfDefine>\r\n<\/pre>\n<p>Y yo lo he modificado a:<\/p>\n<pre>\r\n&#60;IfDefine SVN>\r\n   &#60;IfModule !mod_dav_svn.c>\r\n      LoadModule dav_svn_module  extramodules\/mod_dav_svn.so\r\n   &#60;\/IfModule>\r\n   &#60;Location \/svn\/repos>\r\n      DAV svn\r\n      SVNPath \/var\/svn\/repos\r\n                                                                                                                                         \r\n      # Para read-only no es necesario autentificacion\r\n      &#60;LimitExcept GET PROPFIND OPTIONS REPORT>\r\n         AuthType Basic\r\n         AuthName \"Subversion repository\"\r\n         AuthUserFile \/var\/svn\/conf\/svnusers\r\n         Require valid-user\r\n      &#60;\/LimitExcept>\r\n   &#60;\/Location>\r\n&#60;\/IfDefine SVN>\r\n<\/pre>\n<p>De esta forma limito el acceso total (escritura) solo para usuarios autentificados y permito acceso limitado (s\u00f3lo lectura) a usuarios no autentificados.<\/p>\n<p>Finalmente hay que indicar a Apache que coga la configuraci\u00f3n de los m\u00f3dulos DAV y SVN, por tanto se ha de a\u00f1adir &#8220;-D DAV -D SVN&#8221; en \/etc\/conf.d\/apache2:<\/p>\n<pre>\r\nAPACHE2_OPTS=\"-D SSL -D PHP4 -D DAV -D SVN\"\r\n<\/pre>\n<p>En mi caso tambi\u00e9n aparece SSL y PHP4 ya que anteriormente ya habia configurado estos 2 m\u00f3dulos. Y ahora ya podemos reiniciar el servidor apache:<\/p>\n<pre>\r\n\/etc\/init.d\/apache2 restart\r\n<\/pre>\n<p>Para comprobar que funciona podemos intentar acceder a trav\u00e9s de nuestro navegador apuntando a &#8220;http:\/\/localhost\/svn\/repos\/&#8221; o incluso, si tenemos configurado el SSL normal, autom\u00e1ticamente tambi\u00e9n podremos utilizar &#8220;https:\/\/localhost\/svn\/repos\/&#8221;. Si no hay ningun error es que todo ha ido bien, pero evidentemente el repositorio esta vacio.<\/p>\n<p>En un repositorio suelen ir proyectos que esten relacionados y que en ocasiones incluso compartan ficheros, de hecho, incluso las revisiones son generales para todo el repositorio. Si queremos tener proyectos muy bien diferenciados deberiamos crear diferentes repositorios. En mi caso me va bien con tener unicamente uno.<\/p>\n<p>Para poder a\u00f1adir un proyecto:<\/p>\n<pre>\r\ncd \/home\/user\/directorio\/proyecto1\/\r\nsvn import . -m \"Primera subida\" http:\/\/localhost\/svn\/repos\/proyecto1\/\r\n<\/pre>\n<p>Para bajarlo y poder trabajar con el:<\/p>\n<pre>\r\ncd \/home\/user\/trabajo\/\r\nsvn checkout http:\/\/localhost\/svn\/repos\/proyecto1\/\r\n<\/pre>\n<p>Esto nos crear\u00e1 &#8220;\/home\/user\/trabajo\/proyecto1\/&#8221; con el codigo fuente del repositorio, a partir de ese momento podemos trabajar con dicho c\u00f3digo (podriamos usar https en lugar de http para que la comunicaci\u00f3n se realice cifrada bajo SSL), cuando queramos subir nuestras modificaciones de nuevo al repositorio:<\/p>\n<pre>\r\ncd \/home\/user\/trabajo\/proyecto1\/\r\nsvn commit -m \"Nuevo comentario\"\r\n<\/pre>\n<p>Imaginemos que pasamos unas horas\/dias sin modificar el c\u00f3digo y queremos actualizarlo con la ultima versi\u00f3n del respositorio ya que es muy probable que algun otro programador haya subido cambios:<\/p>\n<pre>\r\ncd \/home\/user\/trabajo\/proyecto1\/\r\nsvn update\r\n<\/pre>\n<p>Si continuamos modificando y a\u00f1adimos un nuevo fichero al proyecto, es decir, imaginemos que teniamos 2 ficheros (&#8220;codigo.cs&#8221; y &#8220;main.cs&#8221;) y creamos uno nuevo llamado &#8220;objetos.cs&#8221;, debemos informar a subversion que lo debe incluir (funcionaria igual para subdirectorios con m\u00e1s ficheros, bastaria indicar el subdirectorio):<\/p>\n<pre>\r\ncd \/home\/user\/trabajo\/proyecto1\/\r\nsvn add objetos.cs\r\n<\/pre>\n<p>Los cambios no seran efectivos en el servidor hasta que no se realice un commit:<\/p>\n<pre>\r\ncd \/home\/user\/trabajo\/proyecto1\/\r\nsvn commit\r\n<\/pre>\n<p>Hay comandos con los que he especificado -m &#8220;texto&#8221;, esto sirve para a\u00f1adir explicaciones a los cambios que hacemos. En caso de que no especifiquemos -m se abrir\u00e1 el editor especificado en la variable de entorno SVN_EDITOR, como acostumbro a utilizar vi he a\u00f1adido a mi .bash:<\/p>\n<pre>\r\nexport SVN_EDITOR=vim\r\n<\/pre>\n<p>Cabe destacar que aqui he explicado la forma de configurar un servidor de subversi\u00f3n pero es posible tener un repositorio local, para el uso de una sola m\u00e1quina de forma que no es necesaria la configuraci\u00f3n de apache. Por supuesto en esta modalidad perdemos la posibilidad de que varios programadores accedan desde sus PCs al repositorio, pero puede resultar \u00fatil cuando queremos trabajar nosotros solos en algun proyecto y nos gusta utilizar control de versiones para poder deshacer cambios en cualquier momento. Para trabajar asi basta con crear un repositorio:<\/p>\n<pre>\r\nsvnadmin create \/home\/usuario\/repo\r\n<\/pre>\n<p>Y en todos los comando que antes hemos visto y utilizabamos el protocolo http:\/\/&#8230;. ahora se substituir\u00e1 por file:\/\/\/home\/usuario\/repo\/, por ejemplo:<\/p>\n<pre>\r\nsvn checkout file:\/\/\/home\/usuario\/repo\/\r\n<\/pre>\n<p>Estos serian los comandos m\u00e1s b\u00e1sicos, los que hayais utilizado ya CVS vereis que es muy similar su uso y por tanto la curva de aprendizaje es practicamente inexistente. Si ejecutais &#8220;svn help&#8221; podreis ver un listado r\u00e1pido de todos los comandos disponibles, tambi\u00e9n es posible utilizar una herramienta gr\u00e1fica llamada <a href=\"http:\/\/rapidsvn.tigris.org\/\">RapidSVN<\/a> (emerge rapidsvn) con versiones para GNU\/Linux y MS Windows. Para una informaci\u00f3n detallada y profunda lo mejor es consultar este libro: <a href=\"http:\/\/svnbook.red-bean.com\">Version Control with Subversion<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Hoy he creado un servidor subversi\u00f3n (reemplazo de CVS) en mi LAN. Para los que no conozcan subversi\u00f3n solo decir que se utiliza para el control de versiones de c\u00f3digo fuente (o incluso de otros tipos de archivos como configuraciones), es muy parecido a CVS pero incorpora importantes novedades que lo hacen mejor y m\u00e1s &hellip; <a href=\"https:\/\/www.marblestation.com\/?p=148\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Servidor subversion con Gentoo<\/span> <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,6],"tags":[],"class_list":["post-148","post","type-post","status-publish","format-standard","hentry","category-espanyol","category-tecnologia"],"_links":{"self":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/148","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=148"}],"version-history":[{"count":1,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/148\/revisions"}],"predecessor-version":[{"id":1772,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=\/wp\/v2\/posts\/148\/revisions\/1772"}],"wp:attachment":[{"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=148"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=148"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.marblestation.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=148"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}