Copyright © 2002, 2003, 2004 Ben Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato
(TBA)
Tabla de contenidos
file://?Lista de figuras
Lista de tablas
Lista de ejemplos
.svn/entries típico.Una mala lista de preguntas y respuestas frecuentes (FAQ[1].) es aquella compuesta a partir de las preguntas que el autor de la FAQ desearía que la gente hiciese, en lugar de las preguntas que la gente hace realmente. Quizás haya visto una de estas antes:
P: ¿Cómo puedo usar Glorbosoft XZY para maximizar la productividad de mi equipo?
R: Muchos de nuestros clientes desean saber cómo maximizar su productividad a través de nuestras innovaciones patentadas de software para trabajo en grupo. La respuesta es simple: primero, haga clic en el menú “
Archivo”, baje hasta “Incrementar productividad”, entonces…
El problema con FAQs de este estilo es que no son, en un sentido literal, FAQs en absoluto. Nadie llamó nunca a la línea de soporte técnico y preguntó, “¿Cómo podemos maximizar la productividad?”. En su lugar, la gente hizo preguntas altamente específicas, como, “¿Cómo podemos modificar el sistema de calendario para enviar recordatorios con dos días de antelación en lugar de uno?” y similares. Pero es mucho más fácil inventar preguntas y respuestas frecuentes que descubrirlas de verdad. Compilar una verdadera hoja de preguntas y respuestas frecuentes requiere una esfuerzo sostenido y organizado: durante el tiempo de vida del software las preguntas realizadas deben ser rastreadas, las respuestas monitorizadas, y todo ello recogido en un todo coherente e indexado que refleje la experiencia colectiva de los usuarios en ambientes de producción. Requiere de la actitud paciente y observadora de un naturalista de campo. Sin grandes hipótesis ni discursos visionarios—ojos abiertos y tomar notas con detalle es lo que más se necesita.
Lo que me encanta de este libro es que creció justo de un proceso similar, y se puede apreciar en cada página. Es el resultado directo de los encuentros que tuvieron los autores con los usuarios. Comenzó con la observación de Ben Collins-Sussman, que las mismas preguntas básicas estaban siendo realizadas una y otra vez en la lista de correo de Subversion: ¿Cuál es el flujo de trabajo estándar recomendado con Subversion? ¿Funcionan las etiquetas y ramas del mismo modo que en otros sistemas de control de versiones? ¿Cómo puedo averiguar quién ha hecho un cambio en particular?
Frustrado por ver las mismas preguntas día tras otro, Ben trabajó intensamente durante un mes en verano del 2002 para escribir El Manual de Subversion [2], un manual de sesenta páginas que cubría el uso básico de Subversion. El manual no tenía pretensiones de ser una obra completa, pero fue distribuido con Subversion y ayudó a los usuarios a superar ese bache inicial en su curva de aprendizaje. Cuando O'Reilly y Asociados decidió publicar un libro completo sobre Subversion, el camino del mínimo esfuerzo era obvio: expandir el manual de Subversion.
A los tres coautores del nuevo libro se les presentó una oportunidad sin igual. Oficialmente, su tarea consistía en escribir un libro de arriba hacia abajo, comenzando a partir de una tabla de contenidos y borrador inicial. Pero también tenían acceso a un flujo constante—de hecho, un géiser incontrolable—de material práctico. Subversion ya estaba en manos de miles de usuarios, y éstos estaban proporcionando toneladas de retroalimentación, no sólo sobre Subversion, sino también sobre la documentación existente.
Durante el tiempo que llevó escribir este libro, Ben, Mike y Brian frecuentaron las listas de correo y sesiones de chat de Subversion incesantemente, anotando cuidadosamente los problemas que estaban teniendo los usuarios en situaciones de la vida real. Monitorizar tal respuesta es de todos modos parte de la descripción de su puesto de trabajo en CollabNet, y les dio una gran ventaja cuando comenzaron a documentar Subversion. El libro producido está firmemente establecido sobre unos cimientos de experiencia, no en las arenas movedizas de las puras ilusiones; combina las mejores características de un manual de usuario y una lista de preguntas y respuestas frecuentes. Esta dualidad quizás no sea advertida durante una primera lectura. Leído en orden, de principio a fin, el libro es simplemente una descripción directa de una pieza de software. Hay una visión general, el obligado tour guiado, un capítulo sobre administración, algunos temas avanzados, y por supuesto una referencia de los comandos y una guía para resolver problemas. Sólo cuando se vuelve a revisar se ve brillar su autenticidad: los detalles que sólo pueden resultar de encuentros con lo inesperado, ejemplos extraídos de casos de uso genuinos, y sobre todo la sensibilidad hacia las necesidades del usuario y su punto de vista.
Por supuesto, nadie puede garantizar que este libro responderá
cualquier pregunta que tenga sobre Subversion. A veces, la
precisión con la que se anticipa a sus dudas le parecerá
misteriosamente telepática; pero ocasionalmente, se
topará con un agujero en el conocimiento de la comunidad
de usuarios y se quedará con las manos vacías. Cuando
esto ocurra, lo mejor que puede hacer es mandar un correo electrónico
a <users@subversion.tigris.org> y exponer
su problema. Los autores aun siguen ahí, observando, y
esto no sólo incluye a los tres que aparecen en la portada,
sino muchos otros que contribuyeron correcciones al material
original. Desde el punto de vista de la comunidad de usuarios,
solucionar su problema es meramente un agradable efecto colateral de un
proyecto mucho mayor—en concreto, ajustar ligeramente
este libro, y en definitiva Subversion, para que se adapte
mejor a la forma en que la gente realmente lo usa. Están
deseosos de escucharle, no únicamente porque le pueden ayudar,
sino porque usted puede ayudarles a ellos. Con Subversion,
como con todos los proyectos de software libre en activo,
usted no está solo.
Deje que este libro sea su primer compañero.
— , Chicago, 14 de Marzo, 2004
Tabla de contenidos
“Si C le da suficiente cuerda para ahorcarse, piense en Subversion como una especie de almacén de cuerdas.” —Brian W. Fitzpatrick
En el mundo del software de código fuente abierto, Concurrent Versions System (CVS[3]) ha sido durante mucho tiempo la herramienta seleccionada para el control de versiones. Y con razón. CVS es software libre, y su modus operandi sin restricciones y soporte para trabajar en red—lo que permite a docenas de programadores dispersos geográficamente compartir su trabajo—se adapta muy bien a la naturaleza colaborativa del mundo de código fuente abierto. CVS y su modelo de desarrollo semi caótico se han convertido en la piedra angular de la cultura del código fuente abierto.
Pero al igual que muchas herramientas, CVS está haciéndose viejo. Subversion es un sistema de control de versiones relativamente nuevo diseñado para ser el sucesor de CVS. Los diseñadores se marcaron el objetivo de ganarse el corazón de los usuarios de CVS de dos modos: creando un sistema de código fuente abierto con un diseño (y “look and feel”) similar a CVS, e intentando corregir los defectos más notables de CVS. A pesar de que el resultado no representa necesariamente la siguiente gran evolución en diseño de los sistemas de control de versiones, Subversion es muy potente, muy fácil de usar y muy flexible.
Este libro documenta la serie 1.0 del sistema de control de versiones Subversion. Nos hemos esforzado por ser meticulosos. No obstante, Subversion cuenta con una próspera y energética comunidad de desarrolladores, por lo que, sin duda, ya habrá algunas características y mejoras planeadas para futuras versiones de Subversion que puedan modificar algunos comandos y notas específicas en este libro.
Este libro está orientado a los usuarios que saben manejar ordenadores y quieren usar Subversion para gestionar sus datos. Aunque Subversion puede ejecutarse en varios sistemas operativos diferentes, su interfaz de usuario principal es la línea de comandos. Es esta herramienta de línea de comandos (svn) la que será explicada y usada en este libro. Por consistencia, los ejemplos de este libro asumen que el lector está usando un sistema operativo tipo Unix y se siente relativamente cómodo con Unix y las interfaces de línea de comandos.
Dicho ésto, el programa svn también funciona
en otras plataformas además de Unix como Microsoft Windows. A excepción
de algunos detalles, como el uso de contra barras
(\)
en lugar de barras de dividir (/) como
separadores en la ruta de los ficheros, los datos de entrada y de
salida de esta herramienta cuando se ejecuta bajo Windows son
idénticos a los de la versión para Unix. No obstante, es posible que
los usuarios de Windows obtengan mejores resultados ejecutando
los ejemplos bajo el entorno de emulación Unix Cygwin.
Probablemente, la mayoría de los lectores serán programadores o administradores de sistemas que necesiten seguir la pista a los cambios realizados sobre el código fuente. Éste es el uso más común de Subversion y, por lo tanto, el escenario que subyace en todos los ejemplos del libro. Pero Subversion puede usarse para administrar los cambios en cualquier tipo de información: imágenes, música, bases de datos, documentación, etc. Para Subversion, todos los datos no son más que datos.
A pesar de que este libro asume que el lector nunca ha usado un sistema de control de versiones, también hemos intentado facilitar a los usuarios de CVS realizar un cambio indoloro a Subversion. Pequeñas notas secundarias mencionarán CVS de vez en cuando, y un apéndice especial resume la mayoría de las diferencias entre CVS y Subversion.
Este libro intenta ser útil a personas con diferentes grados de experiencia—desde personas sin experiencia previa en el control de versiones hasta administradores de sistemas experimentados. Dependiendo de su propia experiencia, algunos capítulos le resultarán más o menos importantes. A continuación se detalla una “lista de lecturas recomendadas” para varios tipos de lectores:
Aquí asumimos que probablemente ya ha usado CVS antes, y que se muere por instalar y ejecutar un servidor Subversion lo antes posible. Los capítulos 5 y 6 le mostrarán cómo crear su primer repositorio y ofrecer acceso al mismo por red. Después de realizar estas tareas, el capítulo 3 y el apéndice A son las rutas más rápidas para aprender a manejar el programa cliente de Subversion aprovechando su experiencia con CVS.
Su administrador probablemente ya ha configurado el servidor de Subversion, así que necesita aprender a usar el cliente. Si nunca ha usado un sistema de control de versiones (como CVS), entonces los capítulos 2 y 3 son una introducción vital. Si ya tiene experiencia con CVS, el capítulo 3 y el apéndice A son los mejores sitios para comenzar.
Independientemente de que sea usuario o administrador, su proyecto acabará por crecer. Le interesará aprender cómo hacer cosas más avanzadas con Subversion, como por ejemplo usar ramas de desarrollo y realizar mezclas (capítulo 4), cómo usar la característica de propiedades de Subversion, cómo configurar las opciones de tiempo de ejecución (capítulo 7), y otras cosas. Los capítulos 4 y 7 no son vitales al principio, pero no olvide leerlos una vez se haya familiarizado con los conceptos básicos.
Asumimos que ya está familiarizado con Subversion y que ahora desea extender su funcionalidad o crear nuevo software usando sus múltiples APIs. El capítulo 8 está dedicado a usted.
El libro termina con material de referencia—el capítulo 9 es una guía de referencia de todos los comandos de Subversion, y los apéndices cubren varios temas interesantes. Una vez haya terminado de leer este libro, estos capítulos serán posiblemente los que vuelva a usar.
Esta sección cubre las convenciones empleadas en este libro.
Usada para comandos, salida de comandos y parámetros
Anchura constante en cursivaUsada para elementos que se pueden reemplazar tanto en código fuente como texto
CursivaUsada para nombres de ficheros y directorios
Este icono señala una nota relacionada con el texto al que acompaña.
Este icono señala una sugerencia útil relacionada con el texto al que acompaña.
Este icono señala un aviso relacionado con el texto al que acompaña.
Tenga en cuenta que los ejemplos de código fuente no son más que eso—ejemplos. Aunque puedan ser compilados con los comandos apropiados, su objetivo es el de ilustrar el problema expuesto, y no tienen por qué ser ejemplos de un buen estilo de programación.
Aquí tiene un listado de los siguientes capítulos y sus contenidos:
Cubre la historia de Subversion, sus características, arquitectura, componentes y métodos de instalación. También incluye una guía rápida para comenzar.
Explica los conceptos básicos del control de versiones y los diferentes modelos de versionado, así como el repositorio de Subversion, las copias de trabajo y las revisiones.
Da un repaso a un día cualquiera en la vida de un usuario de Subversion. Muestra cómo usar Subversion para obtener, modificar y enviar cambios al repositorio.
Explica las ramas, fusiones y etiquetado, incluyendo los mejores métodos para crear ramas y fusionarlas, casos de uso comunes, cómo deshacer cambios y cómo alternar fácilmente entre ramas de desarrollo.
Describe los elementos básicos de un repositorio Subversion, cómo crear, configurar y mantener un repositorio, y las herramientas que puede usar para hacer todo esto.
Explica cómo configurar su servidor Subversion y tres
métodos de acceso: HTTP, el protocolo
svn y el acceso local. También cubre los
detalles de autenticación, autorización y acceso anónimo.
Explora los ficheros de configuración del cliente de
Subversion, las propiedades de ficheros y directorios, cómo
ignorar ficheros en su copia local,
cómo incluir árboles externos en su copia local, y
finalmente, cómo manejar ramas de desarrollo.
Describe detalles internos de Subversion, el sistema de ficheros de Subversion, y las áreas administrativas de una copia local desde el punto de vista de un programador. Muestra cómo usar las APIs públicas para escribir un programa que use Subversion, y sobre todo, cómo contribuir al desarrollo de Subversion.
Explica con detalle todo subcomando de svn, svnadmin, y svnlook junto con una gran cantidad de ejemplos para todos los gustos.
Cubre las similitudes y diferencias entre Subversion y CVS, con numerosas sugerencias para deshacerse de los malos hábitos adquiridos tras años de uso de CVS. Incluye descripciones de los números de revisión de Subversion, versionado de directorios, operaciones offline, update vs. status, ramas, etiquetas, metadatos, resolución de conflictos y autenticación.
Dedicado a las dificultades y problemas habituales usando y compilando Subversion.
Describe los detalles de WebDAV y DeltaV, y cómo configurar su repositorio Subversion para que pueda ser montado como una recurso DAV compartido en modo lectura/escritura.
Trata las herramientas que soportan o usan Subversion, incluyendo programas cliente alternativos, navegadores de repositorio y similares.
Este libro comenzó con fragmentos de documentación escritos por los desarrolladores del proyecto Subversion, los cuales fueron reescritos y agrupados en una única obra. Como tal, siempre ha estado bajo una licencia libre. (Lea Apéndice F, Copyright.) De hecho, el libro fue escrito bajo escrutinio público como parte de Subversion. Ésto significa dos cosas:
Siempre encontrará la última versión de este libro en el propio árbol de código fuente de Subversion.
Puede distribuir y realizar cambios en el libro a su gusto—está bajo una licencia libre. Por supuesto, en lugar de distribuir su propia versión privada de este libro, preferiríamos que enviase cualquier comentario o parche a la comunidad de desarrolladores Subversion. Lea “Contribuyendo a Subversion” para aprender cómo tomar parte en la comunidad.
Puede enviar comentarios y preguntas sobre la publicación a O'Reilly aquí: ###insert boilerplate.
Una versión online reciente de este libro puede encontrarse
en http://svnbook.red-bean.com.
Este libro no hubiese sido posible (y no muy útil) si Subversion no existiese. Por esta razón, los autores quieren agradecer a Brian Behlendorf de CollabNet por su visión y apoyo económico a tan peligroso y ambicioso nuevo proyecto de código fuente abierto; Jim Blandy por el nombre original Subversion y diseño; te queremos, Jim; Karl Fogel por ser tan buen amigo y excelente líder de la comunidad, en ese orden.[4]
Gracias a O'Reilly y nuestros editores, Linda Mui y Tatiana Diaz por su paciencia y apoyo.
Finalmente, queremos dar gracias a las innumerables personas que contribuyeron al libro con revisiones informales, sugerencias y correcciones: A pesar de ser sin lugar a dudas una lista incompleta, este libro sería incompleto e incorrecto sin la ayuda de Jani Averbach, Ryan Barrett, Francois Beausoleil, Jennifer Bevan, Matt Blais, Zack Brown, Martin Buchholz, Brane Cibej, John R. Daily, Peter Davis, Olivier Davy, Robert P. J. Day, Mo DeJong, Brian Denny, Joe Drew, Nick Duffek, Ben Elliston, Justin Erenkrantz, Shlomi Fish, Julian Foad, Chris Foote, Martin Furter, Dave Gilbert, Eric Gillespie, Matthew Gregan, Art Haas, Greg Hudson, Alexis Huxley, Jens B. Jorgensen, Tez Kamihira, David Kimdon, Mark Benedetto King, Andreas J. Koenig, Nuutti Kotivuori, Matt Kraai, Scott Lamb, Vincent Lefevre, Morten Ludvigsen, Paul Lussier, Bruce A. Mah, Philip Martin, Feliciano Matias, Patrick Mayweg, Gareth McCaughan, Jon Middleton, Tim Moloney, Mats Nilsson, Joe Orton, Amy Lyn Pilato, Kevin Pilch-Bisson, Dmitriy Popkov, Michael Price, Mark Proctor, Steffen Prohaska, Daniel Rall, Tobias Ringstrom, Garrett Rooney, Joel Rosdahl, Christian Sauer, Larry Shatzer, Russell Steicke, Sander Striker, Erik Sjoelund, Johan Sundstroem, John Szakmeister, Mason Thomas, Eric Wadsworth, Colin Watson, Alex Waugh, Chad Whitacre, Josef Wolf, Blair Zajac, y toda la comunidad de Subversion.
Gracias a mi mujer Frances, quien, tras muchos meses llegó a oír, “Pero cariño, todavía estoy trabajando en el libro”, en lugar del habitual, “Pero cariño, todavía estoy escribiendo emails.” ¡No tengo ni idea de dónde saca toda su paciencia! Ella es mi contrapeso ideal.
Gracias a mi familia adquirida por su sincero apoyo, a pesar de no tener interés real en el tema. (Ya sabe, aquellos que cuando dicen, “Oh, ¿estás escribiendo un libro?”, y les respondes que es sobre ordenadores, desvían su mirada.)
Gracias a todos mis amigos íntimos, quienes enriquecen mi vida. No me miréis de ese modo—sabéis quienes sois.
Muchísimas gracias a mi mujer Marie por ser increíblemente comprensiva, apoyarme, y sobre todo, ser paciente. Gracias a mi hermano Eric quien me introdujo a la programación UNIX hace tiempo. Gracias a mi madre y abuela por todo su apoyo, sin olvidar aquellas vacaciones de navidades en las que tuvieron que soportarme porque nada más llegar a casa me dediqué a mi portátil para trabajar en el libro.
A Mike y Ben: ha sido un placer trabajar con vosotros en el libro. Vaya, ¡es un placer trabajar con vosotros en el trabajo!
A todas las personas de la comunidad Subversion y la Apache Software Foundation, gracias por aceptarme. No pasa un solo día sin que aprenda algo de al menos uno de vosotros.
Por último, gracias a mi abuelo, que siempre me decía “la libertad es responsabilidad.” No podría estar más de acuerdo.
Gracias en especial a mi mujer, Amy, por su amor y paciente apoyo, por soportar largas noches, e incluso por revisar secciones enteras de este libro—siempre das lo mejor, y lo haces con increíble elegancia. Gavin, cuando seas suficientemente mayor para leer, espero que estés tan orgulloso de tu papá como él lo está de ti. A mamá y papá (y el resto de la familia), gracias por vuestro constante apoyo y entusiasmo.
Me quito el sombrero ante Shep Kendall, a través de quien
descubrí el mundo de los ordenadores; Ben Collins-Sussman,
mi guía turístico por el mundo del código fuente
abierto; Karl Fogel—tu eres
mi .emacs; Greg Stein, por
transmitirme conocimientos prácticos de programación. Brian
Fitzpatrick—por compartir esta experiencia literaria
conmigo. A todas las numerosas personas de las que
siempre estoy aprendiendo cosas nuevas—¡continuad
enseñando!
Por último, a Aquél que demuestra perfectamente excelencia creativa—gracias.
[3] N.T.: Sistema concurrente de versiones. Debido a que el comando principal de este software se llama “cvs”, se usa la abreviación tanto para referirse al comando como al sistema completo y por ello no se traduce.
[4] Oh, y gracias Karl, por tener demasiado trabajo como para haber escrito este libro.
Tabla de contenidos
El control de versiones es el arte del manejo de los cambios en la información. Ha sido durante mucho tiempo una herramienta crítica para los programadores, quienes normalmente empleaban su tiempo haciendo pequeños cambios en el software y después deshaciendo esos cambios al día siguiente. Pero la utilidad del software de control de versiones se extiende más allá de los límites del mundo del desarrollo de software. Allá donde pueda encontrarse a gente usando ordenadores para manejar información que cambia a menudo, hay un hueco para el control de versiones. Y aquí es donde entra en juego Subversion.
Este capítulo contiene una introducción general a Subversion — qué es; qué hace; cómo conseguirlo.
Subversion es un sistema de control de versiones libre y de código fuente abierto. Es decir, Subversion maneja ficheros y directorios a través del tiempo. Hay un árbol de ficheros en un repositorio central. El repositorio es como un servidor de ficheros ordinario, excepto porque recuerda todos los cambios hechos a sus ficheros y directorios. Ésto le permite recuperar versiones antiguas de sus datos, o examinar el historial de cambios de los mismos. En este aspecto, mucha gente piensa en los sistemas de versiones como en una especie de “máquina del tiempo ”.
Subversion puede acceder al repositorio a través de redes, lo que le permite ser usado por personas que se encuentran en distintos ordenadores. A cierto nivel, la capacidad para que varias personas puedan modificar y administrar el mismo conjunto de datos desde sus respectivas ubicaciones fomenta la colaboración. Se puede progresar mas rápidamente sin un único conducto por el cual deban pasar todas las modificaciones. Y puesto que el trabajo se encuentra bajo el control de versiones, no hay razón para temer por que la calidad del mismo vaya a verse afectada por la pérdida de ese conducto único—si se ha hecho un cambio incorrecto a los datos, simplemente deshaga ese cambio.
Algunos sistemas de control de versiones son también sistemas de administración de configuración de software. Estos sistemas son diseñados específicamente para la administración de árboles de código fuente, y tienen muchas características que son específicas del desarrollo de software— tales como el entendimiento nativo de lenguajes de programación, o el suministro de herramientas para la construcción de software. Sin embargo, Subversion no es uno de estos sistemas. Subversion es un sistema general que puede ser usado para administrar cualquier conjunto de ficheros. Para usted, esos ficheros pueden ser código fuente— para otros, cualquier cosa desde la lista de la compra de comestibles hasta combinaciones de vídeo digital y más allá.
A principios del 2000, CollabNet, Inc. (http://www.collab.net)
comenzó a buscar desarrolladores
para escribir un sustituto para CVS. CollabNet ofrece un conjunto de
herramientas de software colaborativo llamado SourceCast, del cual un componente
es el control de versiones. Aunque SourceCast usaba CVS como su
sistema de control de versiones inicial, las limitaciones de CVS
se hicieron evidentes desde el
principio, y CollabNet sabía que tendría que encontrar algo mejor.
Desafortunadamente, CVS se había convertido en el estándar
de facto en el mundo del código
abierto porque no había
nada mejor, al menos no bajo una licencia libre.
Así CollabNet decidió escribir un nuevo sistema de control de
versiones desde cero, manteniendo las ideas básicas de CVS, pero sin sus
fallos y defectos.
En febrero del 2000, contactaron con Karl Fogel, autor de Open Source Development with CVS (Coriolis, 1999), y le preguntaron si le gustaría trabajar en este nuevo proyecto. Casualmente, por aquel entonces Karl ya se encontraba discutiendo sobre el diseño de un nuevo sistema de control de versiones con su amigo Jim Blandy. En 1995, los dos habían fundado Cyclic Software, compañía que hacía contratos de soporte de CVS, y aunque después vendieron el negocio, seguían usando CVS todos los días en sus trabajos. La frustración de ambos con CVS había conducido a Jim a pensar cuidadosamente acerca de mejores vías para administrar datos versionados , y no sólo tenía ya el nombre de “Subversion”, sino también el diseño básico del repositorio de Subversion. Cuando CollabNet llamó, Karl aceptó inmediatamente trabajar en el proyecto, y Jim consiguió que su empresa, RedHat Software, básicamente lo donara al proyecto por un período de tiempo indefinido. Collabnet contrató a Karl y a Ben Collins-Sussman, y el trabajo detallado de diseño comenzó en mayo. Con la ayuda de algunos ajustes bien colocados de Brian Behlendorf y Jason Robbins de CollabNet, y Greg Stein (por aquel entonces un activo desarrollador independiente del proceso de especificación de WebDAV/DeltaV), Subversion atrajo rápidamente a una comunidad activa de desarrolladores. Ésto vino a demostrar que era mucha la gente que había tenido las mismas frustrantes experiencias con CVS, y que había recibido con agrado la oportunidad de hacer algo al respecto.
El equipo de diseño original estableció algunos objetivos simples. No querían abrir nuevos caminos en la metodología del control de versiones, sólo querían corregir CVS. Decidieron que Subversion incorporaría las características de CVS, y que preservarían el mismo modelo de desarrollo, pero sin duplicar los defectos obvios de CVS. Y aunque no necesitaba ser un reemplazo exacto de CVS, debía ser lo bastante similar para que cualquier usuario de CVS pudiera hacer el cambio con poco esfuerzo.
Después de catorce meses de codificación, Subversion pasó a ser “auto-hospedado” el 31 de agosto del 2001. Es decir, los desarrolladores de Subversion dejaron de usar CVS para la administración del propio código fuente de Subversion, y en su lugar empezaron a usar Subversion.
Si bien fue CollabNet quien inició el proyecto, y todavía financia una gran parte del trabajo (paga el salario de unos pocos desarrolladores a tiempo completo de Subversion), Subversion funciona como la mayoría de proyectos de código abierto, dirigido por un conjunto informal de reglas transparentes que fomentan el mérito. La licencia copyright de CollabNet es completamente compatible con las Directrices de Software Libre de Debian. En otras palabras, cualquier persona es libre de descargar, modificar, y redistribuir Subversion como desee; no se requiere ningún permiso de CollabNet o de cualquier otra persona.
Al discutir acerca de las características que Subversion aporta al mundo del control de versiones, a menudo es útil hablar de ellas en términos de cómo han mejorado sobre el diseño de CVS. Si no está familiarizado con CVS, quizás no entienda todas estas características. Y si no está familiarizado con el control de versiones en absoluto, se le pueden nublar los ojos a menos que lea primero Capítulo 2, Conceptos básicos, donde proporcionamos una leve introducción al control de versiones en general.
Subversion proporciona:
CVS solamente lleva el historial de ficheros individuales, pero Subversion implementa un sistema de ficheros versionado “virtual ” que sigue los cambios sobre árboles de directorios completos a través del tiempo. Ambos, ficheros y directorios, se encuentran bajo el control de versiones.
Dado que CVS está limitado al versionado de ficheros, operaciones como copiar y renombrar—las cuales pueden ocurrir sobre ficheros, pero que realmente son cambios al contenido del directorio en el que se encuentran—no son soportadas por CVS. Adicionalmente, en CVS no puede reemplazar un fichero versionado con algo nuevo que lleve el mismo nombre sin que el nuevo elemento herede el historial del fichero antiguo—que quizás sea completamente distinto al anterior. Con Subversion, usted puede añadir, borrar, copiar, y renombrar ficheros y directorios. Y cada fichero nuevo añadido comienza con un historial nuevo, limpio y completamente suyo.
Una colección cualquiera de modificaciones o bien entra por completo al repositorio, o bien no lo hace en absoluto. Ésto permite a los desarrolladores construir y enviar los cambios como fragmentos lógicos e impide que ocurran problemas cuando sólo una parte de los cambios enviados lo hace con éxito.
Cada fichero y directorio tiene un conjunto de propiedades —claves y sus valores —asociado a él. Usted puede crear y almacenar cualquier par arbitrario de clave/valor que desee. Las propiedades son versionadas a través del tiempo, al igual que el contenido de los ficheros.
Subversion tiene una noción abstracta del acceso al repositorio, facilitando a las personas implementar nuevos mecanismos de red. Subversion puede conectarse al servidor HTTP Apache como un módulo de extensión. Ésto proporciona a Subversion una gran ventaja en estabilidad e interoperabilidad, y acceso instantáneo a las características existentes que ofrece este servidor—autenticación, autorización, compresión de la conexión, etcétera. También tiene disponible un servidor de Subversion independiente, y más ligero. Este servidor habla un protocolo propio, el cual puede ser encaminado fácilmente a través de un túnel SSH.
Subversion expresa las diferencias del fichero usando un algoritmo de diferenciación binario, que funciona idénticamente con ficheros de texto (legibles para humanos) y ficheros binarios (ilegibles para humanos). Ambos tipos de ficheros son almacenados igualmente comprimidos en el repositorio, y las diferencias son transmitidas en ambas direcciones a través de la red.
El coste de ramificación y etiquetado no necesita ser proporcional al tamaño del proyecto. Subversion crea ramas y etiquetas simplemente copiando el proyecto, usando un mecanismo similar al enlace duro. De este modo estas operaciones toman solamente una cantidad de tiempo pequeña y constante.
Subversion no tiene un equipaje histórico; está implementado como una colección de bibliotecas compartidas en C con APIs bien definidas. Ésto hace a Subversion extremadamente fácil de mantener y reutilizable por otras aplicaciones y lenguajes.
Figura 1.1, “Arquitectura de Subversion” ilustra lo que uno podría titular una visión panorámica del diseño de Subversion.
En un extremo se encuentra un repositorio de Subversion que conserva todos los datos versionados. Al otro lado, hay un programa cliente Subversion que administra réplicas parciales de esos datos versionados (llamadas “copias de trabajo”). Entre estos extremos hay múltiples rutas a través de varias capas de acceso al repositorio (AR). Algunas de estas rutas incluyen redes de ordenadores y servidores de red que después acceden al repositorio. Otras pasan por alto la red y acceden al repositorio directamente.
Subversion está construido sobre una capa de portabilidad llamada APR (la biblioteca Apache Portable Runtime), lo cual significa que Subversion debería funcionar en cualquier sistema operativo donde lo haga el servidor httpd Apache: Windows, Linux, todos los sabores de BSD, Mac OS X, Netware y otros.
La manera más sencilla de obtener Subversion es descargando un
paquete binario construido para su sistema operativo. El sitio web
de Subversion (http://subversion.tigris.org) dispone a menudo
de estos paquetes disponibles para su descarga, publicados por
voluntarios. El sitio web contiene generalmente paquetes que incluyen
instaladores gráficos para los usuarios de los sistemas operativos de
Microsoft. Si usted usa un sistema operativo Unix o similar, puede usar el
sistema nativo de distribución de paquetes de su sistema (RPMs, DEBs,
el árbol de ports, etc.) para obtener Subversion.
Alternativamente, usted puede compilar Subversion directamente a partir
del código fuente. Del sitio web de
Subversion, descargue la ultima versión del código fuente. Después de desempaquetarlo,
siga las instrucciones del fichero INSTALL para
compilarlo. Observe que cada paquete de código fuente
que se publica contiene todo lo necesario para construir un cliente de línea
de comandos capaz de comunicarse con un
repositorio remoto (en particular, las bibliotecas apr, apr-util y neon).
Sin embargo, las partes opcionales de Subversion tienen otras muchas dependencias,
tales como la base de datos Berkeley DB y posiblemente el servidor web Apache.
Si usted quiere hacer una compilación completa, asegúrese de tener todos
los paquetes documentados
en el fichero INSTALL. Si planea trabajar en el
propio Subversion, puede usar su
programa cliente para obtener la última y más reciente versión del
código fuente.
Este procedimiento está documentado en “Obtenga el código fuente”.
Una vez instalado, Subversion se compone de un número diferente de piezas. A continuación se presenta una visión general de estos componentes. No se alarme si las descripciones breves no le dejan las cosas muy claras —hay páginas de sobra en este libro dedicadas a aliviarle esa confusión.
El programa cliente de línea de comandos.
Programa para informar del estado (en términos de revisiones de los elementos presentes) de una copia de trabajo.
Una herramienta para inspeccionar un repositorio de Subversion.
Herramienta para crear, modificar o reparar un repositorio de Subversion.
Un programa para filtrar el formato de salida de volcado de repositorios Subversion.
Un módulo para el servidor HTTP Apache usado para hacer que su repositorio esté disponible a otros a través de una red.
Un servidor independiente, ejecutable como proceso demonio o invocable por SSH; otra manera de hacer que su repositorio esté disponible para otros a través de una red.
Suponiendo que ha instalado Subversion correctamente, debería estar preparado para comenzar. Los próximos dos capítulos le guiarán a través del uso de svn, el programa cliente de Subversion de línea de comandos.
Algunas personas tienen problemas para absorber una nueva tecnología leyendo un enfoque del tipo "arriba a abajo" como el que ofrece este libro. Esta sección es una introducción muy breve a Subversion, y está pensada para dar a los principiantes algo con lo que defenderse. Si usted es de los que prefiere aprender experimentando, la siguiente demostración le pondrá en marcha. A lo largo del camino, le iremos dando enlaces a los capítulos relevantes de este libro.
Si a usted le resulta completamente nuevo el concepto de control de versiones o el modelo “copiar-modificar-mezclar” usado tanto por CVS como por Subversion, debería leer Capítulo 2, Conceptos básicos antes de seguir adelante.
El siguiente ejemplo asume que usted tiene preparados
tanto el cliente de línea de comandos de Subversion svn,
como la herramienta administrativa svnadmin.
También asume que su cliente svn ha sido compilado
con soporte para la base de datos Berkeley DB. Puede comprobarlo ejecutando
svn --version y asegurándose de que el modulo
ra_local está disponible. Sin este módulo,
el cliente no podrá acceder a URLs del tipo file://
Subversion almacena todos los datos versionados en un repositorio central. Para comenzar, cree un nuevo repositorio:
$ svnadmin create /path/to/repos $ ls /path/to/repos conf/ dav/ db/ format hooks/ locks/ README.txt
Este comando crea un nuevo directorio
/path/to/repos que contiene un repositorio de
Subversion. Asegúrese de que este directorio reside en un disco local y
no compartido en red. Este nuevo directorio
contiene principalmente una colección de ficheros de la base de
datos Berkeley DB. Para más información sobre la creación y
mantenimiento de repositorios, vea Capítulo 5, Administración del Repositorio.
A continuación, cree un árbol de ficheros y directorios para
importar dentro del repositorio. Por razones que se aclararán más
tarde (vea Capítulo 4, Crear ramas y fusionarlas), su estructura debería
tener tres directorios en el primer nivel de la jerarquía
llamados branches,tags,
y trunk:
/tmp/project/branches/
/tmp/project/tags/
/tmp/project/trunk/
foo.c
bar.c
Makefile
…
Una vez tenga un árbol de datos listo para continuar, impórtelo dentro del repositorio con el comando svn import (vea “svn import”):
$ svn import /tmp/project file:///path/to/repos -m "initial import" Adding /tmp/project/branches Adding /tmp/project/tags Adding /tmp/project/trunk Adding /tmp/project/trunk/foo.c Adding /tmp/project/trunk/bar.c Adding /tmp/project/trunk/Makefile … Committed revision 1. $
Ahora el repositorio contiene este árbol de datos. Observe
que el directorio original /tmp/project
no se ha modificado; Subversion no se preocupa por él (de hecho,
puede incluso borrar ese directorio si lo desea).
Para comenzar a manipular los datos del repositorio, necesitará
crear una nueva “copia de trabajo” de los datos,
una especie de entorno de trabajo privado. Pida a Subversion que
“obtenga”
[5] una copia de
trabajo del directorio trunk del repositorio:
$ svn checkout file:///path/to/repos/trunk project A project/foo.c A project/bar.c A project/Makefile … Checked out revision 1.
Ahora usted dispone de una copia personal de parte del repositorio
en un nuevo directorio llamado project. Puede
editar los ficheros en su copia de trabajo y después
depositar esos cambios
de nuevo en el repositorio.
Entre en su copia de trabajo y edite el contenido de un fichero.
Ejecute svn diff para ver las diferencias introducidas por sus cambios en formato diff unificado.
Ejecute svn commit para depositar la nueva versión de su fichero en el repositorio.
Ejecute svn update para “sincronizar” su copia de trabajo con el repositorio.
Para un recorrido completo por todas las operaciones que puede realizar con su copia de trabajo, vea Capítulo 3, Recorrido guiado.
Llegado este punto, usted tiene la opción de hacer que su repositorio Subversion esté disponible a otros a través de una red. Vea Capítulo 6, Configuración del servidor para aprender acerca de los diferentes tipos de procesos servidor disponibles y cómo configurarlos.
[5] N.T.: En la bibliografía sobre control de versiones se suele utilizar el vocablo inglés «check out» para referirse a la operación usada para obtener una copia (parcial) de un repositorio centralizado. En ocasiones, la obtención de dicha copia implica la conexión a un servidor remoto, por lo que en la traducción es común emplear indistintamente los términos «obtener» y «descargar» para referirse a esta operación.
Tabla de contenidos
Este capítulo es una introducción breve e informal a Subversion. Si es nuevo en el tema del control de versiones, este capítulo es definitivamente para usted. Empezaremos tratando los conceptos generales en el control de versiones, seguiremos con las ideas específicas detrás de Subversion, y mostraremos algunos ejemplos simples de Subversion en acción.
Aunque los ejemplos de este capítulo muestran a gente compartiendo colecciones de archivos de código fuente, tenga en mente que Subversion puede manejar cualquier tipo de colección de archivos—no está limitado a asistir a programadores de ordenadores.
Subversion es un sistema centralizado para compartir información. La parte principal de Subversion es el repositorio, el cual es un almacén central de datos. El repositorio guarda información en forma de árbol de archivos—una típica jerarquía de archivos y directorios. Cualquier número de clientes puede conectarse al repositorio y luego leer o escribir en esos archivos. Al escribir datos, un cliente pone a disposición de otros la información; al leer datos, el cliente recibe información de otros. La figura Figura 2.1, “Un sistema cliente/servidor típico” ilustra ésto.
Entonces, ¿qué tiene ésto de interesante?. Hasta ahora, suena como la definición del típico servidor de archivos. Y, de hecho, el repositorio es una especie de servidor de archivos, pero no del tipo habitual. Lo que hace especial al repositorio de Subversion es que recuerda todos los cambios hechos sobre él: cada cambio a cada archivo, e inclusive cambios al propio árbol de directorios, tales como la adición, borrado y reubicación de archivos y directorios.
Cuando un cliente lee datos del repositorio, normalmente sólo ve la ultima versión del árbol de archivos. Sin embargo, el cliente también tiene la posibilidad de ver estados previos del sistema de archivos. Por ejemplo, un cliente puede hacer consultas históricas como, “¿Qué contenía este directorio el miércoles pasado?” Esta es la clase de preguntas que resulta esencial en cualquier sistema de control de versiones: sistemas que están diseñados para registrar y seguir los cambios en los datos a través del tiempo.
La misión principal de un sistema de control de versiones es permitir la edición colaborativa y la compartición de los datos. Sin embargo, existen diferentes sistemas que utilizan diferentes estrategias para alcanzar este objetivo.
Todos los sistemas de control de versiones tienen que resolver un problema fundamental: ¿Cómo permitirá el sistema a los usuarios el compartir información, pero al mismo tiempo impedirá que se pisen los callos mutuamente de forma accidental? Es muy sencillo para los usuarios el sobreescribir accidentalmente los cambios de los demás en el repositorio.
Considere el escenario mostrado en Figura 2.2, “El problema a evitar”. Suponga que tenemos dos colaboradores, Juan y Carmen. Cada uno de ellos decide editar el mismo archivo del repositorio al mismo tiempo. Si Juan guarda sus cambios en el repositorio en primer lugar, es posible que (unos momentos más tarde) Carmen los sobreescriba accidentalmente con su propia versión del archivo. Si bien es cierto que la versión de Juan no se ha perdido para siempre (porque el sistema recuerda cada cambio), cualquier cambio que Juan haya hecho no estará presente en la versión más reciente de Carmen porque, para empezar, ella nunca vio los cambios de Juan. El trabajo de Juan sigue efectivamente perdido—o al menos ausente en la última versión del archivo—y probablemente por accidente. ¡Esta es definitivamente una situación que queremos evitar!
Muchos sistemas de control de versiones utilizan un modelo de bloqueo-modificación-desbloqueo para atacar este problema. En un sistema como éste, el repositorio sólo permite a una persona modificar un archivo al mismo tiempo. Juan debe “bloquear” primero el archivo para luego empezar a hacerle cambios. Bloquear un archivo se parece mucho a pedir prestado un libro de la biblioteca; si Juan ha bloqueado el archivo, entonces Carmen no puede hacerle cambios. Por consiguiente, si ella intenta bloquear el archivo, el repositorio rechazará la petición. Todo lo que puede hacer es leer el archivo y esperar a que Juan termine sus cambios y deshaga el bloqueo. Tras desbloquear Juan el archivo, Carmen puede aprovechar su turno bloqueando y editando el archivo. La figura Figura 2.3, “La solución bloqueo-modificación-desbloqueo” demuestra esta sencilla solución.
El problema con el modelo bloqueo-modificación-desbloqueo es que es un tanto restrictivo y a menudo se convierte en un obstáculo para los usuarios:
Bloquear puede causar problemas administrativos. En ocasiones Juan bloqueará un archivo y se olvidará de él. Mientras tanto, como Carmen está aún esperando para editar el archivo, sus manos están atadas. Y luego Juan se va de vacaciones. Ahora Carmen debe conseguir que un administrador deshaga el bloqueo de Juan. La situación termina causando muchas demoras innecesarias y pérdida de tiempo.
Bloquear puede causar una serialización innecesaria. ¿Qué sucede si Juan está editando el inicio de un archivo de texto y Carmen simplemente quiere editar el final del mismo archivo? Estos cambios no se solapan en absoluto. Ambos podrían editar el archivo simultáneamente sin grandes perjuicios, suponiendo que los cambios se combinaran correctamente. No hay necesidad de turnarse en esta situación.
Bloquear puede causar una falsa sensación de seguridad. Imaginemos que Juan bloquea y edita el archivo A, mientras que Carmen bloquea y edita el archivo B al mismo tiempo. Pero suponga que A y B dependen uno del otro y que los cambios hechos a cada uno de ellos son semánticamente incompatibles. Súbitamente A y B ya no funcionan juntos. El sistema de bloqueo se mostró ineficaz a la hora de evitar el problema—sin embargo, y de algún modo, ofreció una falsa sensación de seguridad. Es fácil para Juan y Carmen imaginar que al bloquear archivos, cada uno está empezando una tarea segura y aislada, lo cual les inhibe de discutir sus cambios incompatibles desde un principio.
Subversion, CVS y otros sistemas de control de versiones utilizan un modelo del tipo copiar-modificar-mezclar como alternativa al bloqueo. En este modelo, el cliente de cada usuario se conecta al repositorio del proyecto y crea una copia de trabajo personal—una réplica local de los archivos y directorios del repositorio. Los usuarios pueden entonces trabajar en paralelo, modificando sus copias privadas. Finalmente, todas las copias privadas se combinan (o mezclan) en una nueva versión final. El sistema de control de versiones a menudo ayuda con la mezcla, pero en última instancia es un ser humano el responsable de hacer que ésto suceda correctamente.
He aquí un ejemplo. Digamos que Juan y Carmen crean sendas copias de trabajo del mismo proyecto, extraídas del repositorio. Ambos trabajan concurrentemente y hacen cambios a un mismo archivo A dentro de sus copias. Carmen guarda sus cambios en el repositorio primero. Cuando Juan intenta guardar sus cambios más tarde, el repositorio le informa de que su archivo A está desactualizado. En otras palabras, que el archivo A en el repositorio ha sufrido algún cambio desde que lo copió por última vez. Por tanto, Juan le pide a su cliente que mezcle cualquier cambio nuevo del repositorio con su copia de trabajo del archivo A. Es probable que los cambios de Carmen no se solapen con los suyos; así que una vez que tiene ambos juegos de cambios integrados, Juan guarda su copia de trabajo de nuevo en el repositorio. Las figuras Figura 2.4, “La solución copiar-modificar-mezclar” y Figura 2.5, “La solución copiar-modificar-mezclar (continuación)” muestran este proceso.
¿Pero qué ocurre si los cambios de Carmen sí se solapan con los de Juan? ¿Entonces qué? Esta situación se conoce como conflicto y no suele suponer un gran problema. Cuando Juan le pide a su cliente que mezcle los últimos cambios del repositorio en su copia de trabajo, su copia del archivo A se marca de algún modo para indicar que está en estado de conflicto: Juan podrá ver ambos conjuntos de cambios conflictivos y escoger manualmente entre ellos. Observe que el programa no puede resolver automáticamente los conflictos; sólo los humanos son capaces de entender y tomar las decisiones inteligentes oportunas. Una vez que Juan ha resuelto manualmente los cambios solapados—posiblemente después de discutirlos con Carmen—ya podrá guardar con seguridad el archivo mezclado en el repositorio.
La solución copiar-modificar-mezclar puede sonar un tanto caótica, pero en la práctica funciona extremadamente bien. Los usuarios pueden trabajar en paralelo, sin tener que esperarse el uno al otro. Cuando trabajan en los mismos archivos, sucede que la mayoría de sus cambios concurrentes no se solapan en absoluto; los conflictos son poco frecuentes. El tiempo que toma resolver los conflictos es mucho menor que el tiempo perdido por un sistema de bloqueos.
Al final, todo desemboca en un factor crítico: la comunicación entre los usuarios. Cuando los usuarios se comunican pobremente, los conflictos tanto sintácticos como semánticos aumentan. Ningún sistema puede forzar a los usuarios a comunicarse perfectamente, y ningún sistema puede detectar conflictos semánticos. Por consiguiente, no tiene sentido dejarse adormecer por la falsa promesa de que un sistema de bloqueos evitará de algún modo los conflictos; en la práctica, el bloqueo parece inhibir la productividad más que otra cosa.
Es hora de movernos de lo abstracto a lo concreto. En esta sección mostraremos ejemplos reales de Subversion en la práctica.
Ya ha leído acerca de las copias de trabajo; ahora demostraremos cómo las crea y las usa el cliente de Subversion.
Una copia de trabajo de Subversion es un árbol de directorios corriente de su sistema de archivos local, conteniendo una colección de archivos. Usted puede editar estos archivos del modo que prefiera y si se trata de archivos de código fuente, podrá compilar su programa a partir de ellos de la manera habitual. Su copia de trabajo es su área de trabajo privada: Subversion nunca incorporará los cambios de otra gente o pondrá a disposición de otros sus cambios hasta que usted le indique explícitamente que lo haga.
Tras hacer algunos cambios a los archivos en su copia de trabajo y verificar que funcionan correctamente, Subversion le proporciona comandos para “publicar” sus cambios al resto de personas que trabajan con usted en su proyecto (escribiendo en el repositorio). Si las demás personas publican sus propios cambios, Subversion le proporciona comandos para mezclar estos cambios en su directorio de trabajo (leyendo del repositorio).
Una copia de trabajo también contiene algunos archivos extra,
creados y mantenidos por Subversion para ayudarle a ejecutar estos
comandos. En particular, cada directorio de su copia de trabajo
contiene un subdirectorio llamado .svn, también
conocido como el directorio administrativo de
la copia de trabajo. Los archivos en cada directorio administrativo
ayudan a Subversion a reconocer qué archivos contienen cambios no
publicados y qué archivos están desactualizados con respecto al
trabajo hecho por los demás.
Un repositorio típico de Subversion contiene a menudo los archivos (o el código fuente) de varios proyectos; normalmente, cada proyecto es un subdirectorio en el árbol del sistema de archivos del repositorio. En esta disposición, la copia de trabajo de un usuario se corresponde habitualmente con un subárbol particular del repositorio.
Por ejemplo, suponga que usted tiene un repositorio que contiene
dos proyectos de software, paint y
calc. Cada proyecto reside en su propio subdirectorio
dentro del directorio raíz, tal como se muestra en Figura 2.6, “El sistema de archivos del repositorio”.
Para conseguir una copia de trabajo, debe ejecutar primero
un check out de algún subárbol del
repositorio. (El término inglés “check out” puede sonar como
si tuviera algo que ver con bloquear o reservar recursos, pero no es así;
tan sólo crea una copia privada del proyecto para usted). Por ejemplo, si
usted hace un check out de /calc, obtendrá una copia de
trabajo como ésta:
$ svn checkout http://svn.example.com/repos/calc A calc A calc/Makefile A calc/integer.c A calc/button.c $ ls -A calc Makefile integer.c button.c .svn/
La lista de letras A indica que Subversion está añadiendo una
serie de elementos a su copia de trabajo. Usted ahora tiene una copia
personal del directorio /calc del repositorio,
con una entrada adicional—.svn—que
contiene la información extra que Subversion necesita, tal y como se
mencionó anteriormente.
Suponga que hace cambios a button.c. Puesto
que el directorio .svn recuerda la fecha de
modificación del archivo y su contenido original, Subversion es capaz de
darse cuenta de que el archivo ha cambiado. Sin embargo, Subversion no hará
públicos sus cambios hasta que usted no le diga explícitamente que lo haga.
El acto de publicar sus cambios es conocido comúnmente como
consignar (o registrar)
los cambios al repositorio.
Para publicar sus cambios a otros, usted puede utilizar el comando commit de Subversion:
$ svn commit button.c Sending button.c Transmitting file data . Committed revision 57.
Ahora sus cambios a button.c han sido
consignados al repositorio; si otro usuario obtiene una copia de trabajo
de /calc, podrá ver sus cambios en la última
versión del archivo.
Suponga que tiene un colaborador, Carmen, quien obtuvo una
copia de trabajo de /calc al mismo tiempo
que usted. Cuando usted envía sus cambios sobre
button.c, la copia de trabajo de Carmen se deja
sin cambios; Subversion solo modifica las copias de trabajo a
petición del usuario.
Para tener su proyecto actualizado, Carmen puede pedir a Subversion que proceda a actualizar su copia de trabajo, usando para ello el comando update de Subversion. Ésto incorporará los cambios hechos por usted en la copia de trabajo de Carmen, así como otros cambios consignados desde que ella hizo el check out.
$ pwd /home/sally/calc $ ls -A .svn/ Makefile integer.c button.c $ svn update U button.c
La salida del comando svn update
indica que Subversion actualizó el contenido de
button.c. Observe que Carmen no necesitó
especificar qué archivos actualizar; Subversion usa la información
del directorio .svn, junto con
información adicional del repositorio, para decidir qué archivos
necesitan una actualización.
Una operación svn commit puede publicar los cambios sobre cualquier número de ficheros y directorios como una única transacción atómica. En su copia privada, usted puede cambiar el contenido de los ficheros, crear, borrar, renombrar y copiar ficheros y directorios, y luego enviar el conjunto entero de cambios como si se tratara de una unidad.
En el repositorio, cada cambio es tratado como una transacción atómica: o bien se realizan todos los cambios, o no se realiza ninguno. Subversion trata de conservar esta atomicidad para hacer frente a posibles fallos del programa, fallos del sistema, problemas con la red, y otras acciones del usuario.
Cada vez que el repositorio acepta un envío, éste da lugar a un nuevo estado del árbol de ficheros llamado revisión. A cada revisión se le asigna un número natural único, una unidad mayor que el número de la revisión anterior. La revisión inicial de un repositorio recién creado se numera con el cero, y consiste únicamente en un directorio raíz vacío.
La Figura 2.7, “El repositorio” ilustra una manera interesante de ver el repositorio. Imagine un array de números de revisión, comenzando por el 0, que se extiende de izquierda a derecha. Cada número de revisión tiene un árbol de ficheros colgando debajo de él, y cada árbol es una “instantánea” del aspecto del repositorio tras cada envío.
Es importante observar que las copias de trabajo no siempre se corresponden con una revisión en particular del repositorio; pueden contener ficheros de varias revisiones diferentes. Por ejemplo, suponga que obtiene una copia de trabajo de un repositorio cuya revisión más reciente es la 4:
calc/Makefile:4
integer.c:4
button.c:4
Por el momento, esta copia de trabajo se corresponde
exactamente con la revisión 4 del repositorio. Sin embargo,
suponga que realiza un cambio a button.c
y lo publica. Suponiendo que no se han realizado otros envíos,
el suyo creará la revisión 5 del repositorio, y su copia
de trabajo aparecerá ahora así:
calc/Makefile:4
integer.c:4
button.c:5
Suponga que, en este punto, Carmen envía un cambio a
integer.c, creando la revisión 6. Si
usted usa svn update para actualizar
su copia de trabajo, ésta se verá ahora como:
calc/Makefile:6
integer.c:6
button.c:6
Los cambios de Carmen sobre