jueves, 10 de diciembre de 2009

TortoiseSVN

TortoiseSVN es un cliente gratuito de código abierto para el sistema de control de versiones Subversion.

Integrado en la Shell de Windows, por ejemplo el “explorador”. Y ni siquiera está obligado a usar el Explorador de Windows.

Los menús contextuales de TortoiseSVN también funcionan en otros administradores de archivos, y en la ventana Fichero/Abrir que es común a la mayoría de aplicaciones estándar de Windows.

Todos los comandos de Subversion están disponibles desde el menú contextual del explorador.

TortoiseSVN añade su propio submenú allí.

¿Qué necesitamos para empezar?

•Un cliente, como puede ser TortoiseSVN, o el propio que incorpora Subversion.

•La versión más reciente de TortoiseSVN es la 1.2, con capacidad para bloquear.
http://tortoisesvn.tigris.org/download.html

•La versión 1.2 de Subversion: http://subversion.tigris.org/project_packages.html

•Un repositorio, que podemos crear en nuestro servidor SVN, si disponemos de uno; o bien, en local con el propio cliente TortoiseSVN.

Crear el Repositorio con TortoiseSVN

•Seleccionar directorio donde crear el repositorio.

•¿Cómo accedo al cliente TortoiseSVN? A través del “explorador de archivos”, desde el menú contextual que aparece pulsando el botón derecho.

•Opción “Crear repositorio aquí”. Inicialmente vacío.



•¿Cómo cargo datos en el repositorio? Me sitúo en el directorio que quiero cargar, y con la opción “Importar” de TortoiseSVN, índico en qué repositorio lo quiero importar.



•¿Cómo puedo ver lo que hay en el repositorio?

•Usar la opción “Navegador”. El directorio donde he creado el repositorio no se debe tocar.

Subversion y Netbeans

Para empezar a utilizar debemos tener instalado NetBeans en nuestra máquina con Subversion:

1.Abrimos NetBeans y vamos al menú Versioning > Subversion > Checkout.
NetBeans nos alertará de que no tenemos Subversion instalado.


2.Escogemos la primera opción y presionamos OK. Empezará a instalar, primero nos aparece el contrato de licencia, lo aceptamos. A continuación empieza a instalar, en la parte inferior derecha de NetBeans podemos ver la barra de proceso



3.Una vez terminado es proceso Netbeans nos solicitará reiniciar el aplicativo, damos a aceptar.

4.Una vez instalado vemos como ya tenemos más opciones disponibles en el menú Versioning > Subversion

5.Seleccionamos en el menú Versioning > Subversion > Import Into Repository. Nos aparecerá un panel de configuración del repositorio,

6.En este paso necesitaremos usuario y contraseña que se creó con la herramienta VisualSVN Server.




7.Una vez tenemos el panel del NetBeans configurado podemos escoger el directorio donde poner el mensaje de importación (obligatorio) e incluso escoger el lugar donde importar. Le damos a Finish y ya nos hace la importación. Este proceso acostumbra a tardar unos minutos, en la barra inferior derecha encontramos el proceso.


8.Una vez finalizado, se realiza automáticamente un commit de los archivos y los mismos ya estarán disponibles en el repositorio.

Sincronizar archivos modificados
Después de haber modificado nuestros archivos del proyecto, necesitaremos subirlos al repositorio, podemos saber que archivos son los modificados porque el nombre del archivo se queda de color azul cuando esta modificado desde la última sincronización.

Una manera sencilla de hacer una unión de ficheros con lo que hemos modificado nosotros es ir al menú Versioning y pulsar sobre Commit esto subirá los ficheros que nosotros hemos modificado. Si mientras nosotros trabajamos necesitamos mirar si algún miembro del equipo ha tocado algún fichero podemos ir al menú Versioning y pulsar sobre Update, esto nos informará de los cambios.

También podemos usar estos menús en archivos individuales del proyecto, para así ganar velocidad en la sincronización. Para hacerlo debemos ir al menú Subversion del menú contextual que sale al hacer clic con el botón derecho del ratón sobre el fichero.

VisualSVN Server

VisualSVN Server contiene todo lo necesario para instalar, configurar y gestionar un servidor de Subversion; es gratuito, aunque para que funcione es necesario instalar Web Apache (el cual viene incluido en el paquete).

Incluir Apache es una buena solución si se necesita poder acceder a nuestro servidor SVN desde cualquier lugar que tenga una conexión a Internet, de esta forma se puede usar el puerto 80 para las comunicaciones y pasar a través de firewalls sin problemas. Sin embargo, sino necesitas esta funcionalidad, posiblemente sea más sencillo instalar sólo el servidor de SVN usando el puerto estándar (3690).

VisualSVN Server se carga como un servicio más. Su panel de control utiliza el aspecto familiar de las consolas de Windows, con un resumen de los repositorios activos y la dirección del servidor.

Los repositorios se pueden crear o importar desde el mismo panel de VisualSVN Server. En las propiedades de cada elemento hay una pestaña para cambiar los permisos de seguridad.



Ventana principal de VisualSVN Server

Comparando Mercurial con Subversion

Comparando un poco estos dos sistemas, ambos tienen comandos con nombres similares para hacer las mismas operaciones, por lo que si se conoce una, sería bastante sencillo aprender a utilizar otra. Ambas herramientas funcionan en los sistemas operativos populares (Windows, Linux, Mac OS)

Subversion se encuentra en desventaja dado que casi todas las órdenes deben tratar con el servidor y Subversion no tiene utilidades de replicación adecuadas, la capacidad del servidor y el ancho de banda se convierten en cuellos de botella para proyectos modestamente grandes.

Dado que Subversion no almacena el historial de revisiones en el cliente, es muy bueno para administrar proyectos que tienen muchos ficheros binarios grandes.
En general ambas son buenas, todo depende del enfoque del proyecto al que se le quiere aplicar el controlador de la versión.

GIT

Git es un sistema de control de versiones diseñado para manejar proyectos muy grandes con velocidad y eficiencia, pero igual de apropiado para repositorios pequeños; es especialmente popular con la comunidad open source, sirviendo como plataforma de desarrollo para proyectos como el Kernel Linux, Ruby on Rails, WINE o X.org.

Git cae en la categoría de herramientas de manejo de código fuente distribuido, similar por ejemplo a Mercurial o Bazaar. Cada directorio de trabajo de Git es un repositorio completo con historial y capacidades totales de tracking de revisiones, independiente de acceso de red o un servidor central. Aún así, Git es extremadamente rápido y eficiente con el espacio.

Git es un proyecto Open Source cubierto por la GNU General Public License v2. Originalmente escrito por Linus Torvalds y mantenido por Junio C Hamano.

Mercurial

Mercurial cuenta con un conjunto único de propiedades relativamente buenas como sistema de control de versiones, ya que es fácil de aprender y usar, es liviana, escalable y fácil de acondicionar. Las ordenes de Mercurial y su conjunto de características son uniformes y consistentes.

En un proyecto pequeño, se puede comenzar a trabajar con Mercurial, donde crear nuevos cambios y ramas, transferir cambios (localmente o por la red); y las operaciones relacionadas con el estado y el historial son rápidas. Mercurial buscar ser ligero y no incomodar en su camino combinando poca sobrecarga cognitiva con operaciones rápidas.

La utilidad de Mercurial no se limita solamente a proyectos pequeños, sino más bien está siendo utilizado en proyectos con centenas de miles de contribuyentes, cada uno conteniendo decenas de miles de ficheros y centenas de megabytes de código fuente.

Baazaar

El sistema de control de versiones Bazaar se convirtió recientemente en un proyecto GNU. Su meta es ser un sistema de control de versiones acorde a la colaboración y cooperación en el núcleo del software libre. Busca facilitar el uso de control de versiones distribuido a través de todas las plataformas. Tiene una interface simple y amigable, para que los nuevos usuarios lo encuentren familiar y natural.

La operación básica para el control de versiones distribuido es el branching y merging, por lo que Bazaar está diseñado en gran parte para asegurarse que se puedan hacer branch y merge de forma eficiente entre individuos y equipos, usando ramas locales o remotas. Para los desarrolladores, hay un API de extensión y una suite de plugins para permitirles extender Bazaar, y bzrlib facilita la tarea de incluir la funcionalidad de Bazaar en sus propias aplicaciones GPL.

Una característica importante, es que intenta hacer lo más directa posible la interoperabilidad con proyectos que usan un sistema de control de versionado distinto. Su meta es que sea posible que alguien use Bazaar para participar en cualquier proyecto. Así que puede representar las operaciones de cualquier otro sistema, y hay plugins que permiten leer el log de versiones para un proyecto en Bazaar desde Subversión, Git, CVS y otros proyectos. Por ejemplo,
se puede mantener el trunk del desarrollo de un proyecto en Subversión, y correr “import” constantemente de ese trunk en Bazaar de donde los desarrolladores pueden hacer branch y merge.
Se pueden alojar ramas de Bazaar en casi cualquier servidor donde haya acceso de lectura y escritura sobre SFTP, FTP ó HTTP, o sobre SSH con el smart server de bzr.
Bazaar funciona en GNU/Linux, UNIX, Windows y OS X. Está programado en Python, y además de su comunidad, tiene el apoyo de Canonical.

Subversion

Subversion es una herramienta de control de revisiones muy popular, desarrollada para reemplazar a CVS, con el objetivo de mejorar algunos aspectos que dificultaban el uso de la aplicación. Tiene una arquitectura centralizada tipo cliente/servidor

Subversion es una herramienta de control de revisiones muy popular, desarrollada para reemplazar a CVS, con el objetivo de mejorar algunos aspectos que dificultaban el uso de la aplicación. Tiene una arquitectura centralizada tipo cliente/servidor

Las características fundamentales son:

•Número de versión global al repositorio que se incrementa con cada cambio, por lo que es posible volver a una versión anterior indicando dicho número global.

•Control de cambios en ficheros y directorios (si, almacena y controla cambios en árboles completos de carpetas y ficheros). Mantiene el histórico de versiones de un fichero aunque se mueva o renombre.

•Detecta y trata apropiadamente los ficheros binarios, uno de los puntos débiles de CVS. A estos ficheros les añade una propiedad indicando su tipo.

•La transmisión entre cliente y servidor incluye únicamente los cambios lo que supone un ahorro del ancho de banda. Además, los cambios se calculan a nivel de byte (en lugar de línea ampliamente usado) lo que reduce aún más el tamaño de las modificaciones.

Svn co ruta_repositorio [destino]

Descarga una copia (checkout) de cualquier carpeta contenida en el repositorio (no es necesario bajar la raíz del repositorio, se puede bajar cualquier carpeta contenida en el mismo) que se denominará copia de trabajo. La copia de trabajo son ficheros locales en la máquina por lo que puede ser modificada según se desee.

Las rutas de repositorio tienen la forma protocolo://usuario:password@servidor/ruta. Existen múltiples protocolos como Webdav, svn (protocolo propio), svn+ssh (protocolo svn a través de un túnel ssh para asegurarlo.

Svn update

Se encarga de descargar los últimos cambios del repositorio y mezclarlos en la copia de trabajo para que coincida con la última versión disponible.
Si en el proceso de mezcla se detectan conflictos irresolubles, se marcan en la copia de trabajo para que el usuario los resuelva. De esta forma, se evita corromper el repositorio.

Svn ci [ruta]

Cuando se finalizan los cambios se envían al repositorio (commit). En este momento, se comprueba si la versión base del usuario es la última del repositorio y si es así se envían los cambios creando una nueva revisión.
Si las versiones no coinciden, el usuario deberá actualizar (update) su copia de trabajo con lo que se marcarán los conflictos en la copia de trabajo


Además de este cliente de consola, existen aplicaciones gráficas que realizan ese trabajo de forma transparente y más agradable para el usuario.

Por su parte, es posible atacar al servidor utilizando distintos clientes independientemente de la plataforma en la que ejecute cada uno de ellos. Es posible utilizar un cliente en Windows que se conecte con un servidor en Unix o Mac y viceversa, también se puede integrar Subversion a distintas plataformas de desarrollo que funcionan como clientes como netbeans, eclipse, Dreamweaver.

Si se utiliza Windows, la opción más adecuada es TortoiseSVN. Es un cliente que se integra con el explorador de Windows y que permite realizar todas las acciones mediante entradas en el menú contextual de los ficheros y carpetas. Igualmente las plataformas mencionadas anteriormente igual son clientes gráficos que permiten esta integración.

Para el escritorio KDE existe un plugin similar denominado kdesvn aunque no implementa toda su funcionalidad. Sin embargo, para un uso habitual es suficientemente útil.

Concurrent Versions System (CVS)

El Sistema de Control de Versiones más conocido por sus siglas en inglés CVS (Concurrent Versions System) es una herramienta que mantiene el registro de todo el trabajo y los cambios en la implementación de un proyecto informático (de software) y permite que distintos desarrolladores (potencialmente situados a gran distancia) colaboren en el mismo.

CVS es una herramienta que funciona en un esquema de cliente y servidor. Existe un cliente o estación de trabajo en donde los desarrolladores hacen modificaciones al código y realizan las pruebas necesarias para satisfacer los requerimientos. En el servidor existe una versión consolidada del proyecto. Cada cierto tiempo los desarrolladores actualizan sus versiones de trabajo desde el servidor y por otra parte envían sus propios cambios hacia el servidor.

Existen servidores para Linux y Unix, así como clientes para una extensa gama de plataformas (Linux, Windows, Mac OS, etc).
Uno de los beneficios de este esquema, es que se puede integrar la funcionalidad de cliente CVS en las herramientas de desarrollo integradas. En la plataforma Linux es común que se realice esta integración, debido a lo fundamental que se ha convertido CVS en la mayoría de los proyectos que integran estas plataformas. Es así como por ejemplo podemos encontrar KDevelop de KDE, Anjuta y Eclipse en GNOME, Windows integrados con CVS.

CVS como herramienta no resuelve todos los problemas del desarrollo en equipo.
Simplemente es una ayuda para que las cosas más tediosas puedan ser automatizadas.
Las aéreas en donde CVS no está involucrado tienen relación con el tratamiento del proyecto a un nivel global. Actividades como la planificación, los releases, etc, quedan fuera de su ámbito de trabajo y deben ser abordadas por las personas y otras herramientas complementarias

Control de Versiones

Durante el desarrollo de cualquier producto, no solamente del código de un programa, éste evoluciona mientras se realizan sucesivos cambios en él. Sin ir más lejos, un libro no se escribe entero en un par de horas sino que se prolonga durante un número de sesiones indeterminadas durante las cuales se añade más y más contenido. Esta adición de contenido realmente son cambios sucesivos al documento. Evidentemente, no todos los cambios consisten en adicciones sino que muchas veces se modifican o eliminan partes ya existentes por diversos motivos.

Generalmente cuando se están desarrollando proyectos ya sean pequeños o grandes se tiene como mínimo la participación de dos desarrolladores, esto hace que se trabaje en diferentes módulos del proyecto que luego de manera manual serán pegadas las partes, sin embargo si el grupo de desarrolladores va creciendo el modo de pegar las partes creadas por cada programador se vuelve bien difícil y complicada, es por eso que a lo largo de los años se han desarrollado diferentes herramientas que permiten llevar un control de las distintas versiones de los proyectos, donde se permite gestionar de una manera más organizada los repositorios de archivos y sus distintas versiones, utilizando una arquitectura cliente-servidor, donde un servidor guarda las versiones actuales del proyecto y su historia, todo esto dependiendo de las cambios y actualizaciones que haga el desarrollador. Independientemente del tipo de cambio realizado, los cambios no son siempre definitivos ni correctos. En muchos casos, un cambio introduce un error que es corregido con cambios posteriores pero, en algunos casos, se desearía poder deshacer completamente un cambio erróneo. En estas circunstancias es cuando interviene los programas de gestión de versiones.

Mediante los procesos definidos de estos sistemas, es posible trazar los cambios que se han realizado en el tiempo. Al disponer de esta información, es posible identificar y controlar todos y cada uno de los cambios realizados. Asimismo, es posible regenerar sin errores el estado del producto en cualquier momento de su desarrollo, es decir, cualquiera de sus versiones, además nos da una serie de ventajas, ya que permite que varios clientes pueden sacar copias del proyecto al mismo tiempo, realizar cambios a los ficheros manteniendo un histórico de los cambios, deshacer los cambios hechos en un momento dado y recuperar versiones pasadas así evitando posibles errores que ocurran en un proceso de actualización, también permiten ver un histórico de cambios y comentarios, lo cual permite que los clientes pueden también comparar diferentes versiones de archivos.

Llevar este control puede parecer complejo en un inicio pero simplifica enormemente el trabajo a corto plazo. Una vez implantado se transforma en una herramienta indispensable de trabajo.

Todos los sistemas de control de versiones se basan en el concepto repositorio. Un repositorio no es más que el conjunto de versiones del producto. Una vez creado, los distintos usuarios realizan sus cambios sobre el repositorio que se encarga de almacenarlos permitiendo la recuperación de cualquier versión.

Existen dos tipos de repositorios:

Centralizado

Cuando se desarrollaron los sistemas de control de versiones, muchos de ellos se hicieron en esquema cliente-servidor, con lo que el desarrollo de las herramientas está claramente diferenciado entre:

•El cliente: Es la aplicación que se conecta al servidor y mantiene una copia local del repositorio, así como se encarga, generalmente de la corrección de conflictos y la mayoría de lógica del sistema.

•El servidor: Es el sistema que toma los datos del cliente y los almacena a espera de una o múltiples peticiones de esos datos. Este sistema se encargaría del almacenamiento de las versiones, control de concurrencia, bloqueos y otras características parecidas a las de las bases de datos.

¿Qué limitaciones y características posee?

•El sistema servidor es un repositorio, como los que mantienen los clientes, pero perfectamente sincronizado y sin que dé lugar a conflictos. Es la copia maestra de los datos.

•Cuando un sistema web quiere hacer un listado, puede tomar los datos de este servidor y siempre serán seguros, con lo que no tendrá que resolver conflictos, ni tendrá que hacer mezclas.

•Una copia local debe de poder mezclarse con el repositorio central cuando queramos publicar un conjunto de cambios o cuando queramos tomar la última versión publicada en concordancia con nuestra copia local.

•Es normal ver en muchos de estos sistemas ramificaciones, versiones, etiquetas, o similares, a modo de tener varias copias según nos interese. Estas ramificaciones están en el servidor y en algunos casos puede llegar a ser muy costosa su diferenciación.

Algunos ejemplos de Controladores de Versiones Centralizados:

•Concurrent Versions System (CVS)

•SubVersion

Distribuido

Desarrolladores como Linus Torvalds, Eric S. Raymond y otros más, han desarrollado sistemas distribuidos de control de versiones tales como GIT, Baazaar, Mercurial, darcs, entre otros; estos sistemas se destacan por haber sido desarrollados en un formato distribuido, esto quiere decir que, en sí, no hay un servidor que mantenga una copia del repositorio, sino que está mantenida entre los clientes que estén en uso del repositorio y, al igual que los clientes P2P, mientras más desarrolladores haya conectados, mejor conectividad habrá entre todos.

En cualquiera de los dos casos, el repositorio es compartido por todos los usuarios (o al mismo usuario desde distintas máquinas) que tengan acceso al mismo. Es posible que se produzcan ediciones simultáneas de los mismos elementos que generen conflictos. Para solucionar este problema existen dos políticas básicas de resolución de conflictos:

Bloqueo-modificación-desbloqueo:

En esta política se evitan las modificaciones concurrentes. Cuando un usuario desea realizar una modificación, indica el elemento a modificar que queda bloqueado en el repositorio por lo que se impide el acceso al resto de usuarios (exclusión mutua). Cuando finaliza de realizar sus cambios, los envía al repositorio liberando el bloqueo con lo que el resto de los usuarios puede obtener la copia actualizada para realizar sus propios cambios.

Copiar-modificar-mezclar:

Esta política permite las modificaciones simultáneas. Cada usuario hace una copia del repositorio en su máquina y procede trabajar con ella como si no fuera un repositorio. Cuando finaliza su trabajo, envía los cambios al repositorio que se encarga de analizar los cambios realizados por el usuario y los que se han realizado en el propio repositorio y realiza la mezcla.

Evidentemente, la primera política es mucho más restrictiva lo que dificulta el trabajo diario ralentizando el acceso a los recursos y ocasionando problemas si no se liberan recursos bloqueados. La segunda, por su parte, tiene como inconveniente que no siempre es posible mezclar los cambios realizados aunque en esos casos, utiliza al usuario que envía cambios para solucionar esos conflictos irresolubles automáticamente.

Esto da una serie de ventajas al sistema centralizado, como son:

•Disponer de forma distribuida de la información del repositorio al completo, tanto de forma local, como a través de los demás componentes del grupo.

•Cada cambio se va replicando entre los demás equipos distribuidos, a modo de que puedan emplear esos datos y actualizarlos en sus sistemas.

•El sistema de control de versiones distribuido ha sido pensado con la forma de trabajo basada en ramas, unión central en una sola versión (trunk) y liberaciones (o tags). Con lo que cada rama puede identificarse como cada copia distribuida que se use.

•Una máquina servidora puede emplearse, al estar siempre conectada, como otro punto de sincronización, con la ventaja de que, aunque cayera, mientras haya más miembros conectados, el sistema siempre se mantiene activo y con buen ancho de banda.

Algunos ejemplos de Controladores de Versiones Distribuidos:

•Baazaar

•Mercurial

•GIT