hgbook

annotate es/intro.tex @ 479:5236357a00b2

finished hook.tex
author Javier Rojas <jerojasro@devnull.li>
date Sun Jan 04 21:51:51 2009 -0500 (2009-01-04)
parents 04ba1c7785ae
children e98a8c3afcef
rev   line source
igor@403 1 \chapter{Introducción}
igor@402 2 \label{chap:intro}
igor@402 3
igor@403 4 \section{Acerca del control de revisiones}
igor@403 5
igor@403 6 El control de revisiones es el proceso de administrar diferentes
igor@403 7 versiones de una pieza de información. En su forma más simple es algo
igor@403 8 que la mayoría de gente hace a mano: cada vez que usted modifica un
igor@403 9 fichero, lo graba con un nuevo nombre que contiene un número, el
igor@403 10 siguiente mayor que el anterior.
igor@403 11
igor@403 12 Administrar manualmente muchas versiones de un fichero es una tarea
igor@403 13 propensa a errores, a pesar de que hace bastante tiempo hay
igor@403 14 herramientas que ayudan en este proceso. Las primeras herramientas
igor@403 15 para automatizar el control de revisiones fueron pensadas para que un
igor@403 16 usuario administrara un solo fichero. En las décadas pasadas, el
igor@403 17 alcance de las herramientas de control de revisiones ha ido aumentando
igor@408 18 considerablemente; ahora manejan muchos ficheros y facilitan el
igor@403 19 trabajo en conjunto de varias personas. Las mejores herramientas de
igor@403 20 control de revisiones de la actualidad no tienen problema con miles de
igor@403 21 personas trabajando en proyectos que consisten de decenas de miles de
igor@403 22 ficheros.
igor@403 23
igor@403 24 \subsection{¿Por qué usar control de revisiones?}
igor@403 25
igor@403 26 Hay muchas razones por las cuales usted o su equipo desearía usar una
igor@403 27 herramienta automática de control de revisiones para un proyecto.
igor@402 28 \begin{itemize}
igor@403 29 \item Contar con la historia y la evolución de su proyecto, para
igor@403 30 evitar hacer la tarea manualmente. Por cada cambio tendrá una
igor@403 31 bitácora de \emph{quién} lo hizo; \emph{por qué} se hizo;
igor@403 32 \emph{cuándo} se hizo; y de \emph{qué} se trataba el cambio.
igor@403 33 \item Cuando trabaja con más personas, los programas de control de
igor@403 34 revisiones facilitan la colaboración. Por ejemplo, cuando varias
igor@403 35 personas de forma casi simultanea pueden hacer cambios
igor@403 36 incompatibles, el programa le ayudará a identificar y resolver tales
igor@403 37 conflictos.
igor@403 38 \item Puede ayudarle a recuperarse de equivocaciones. Si aplica un
igor@403 39 cambio que posteriormente se evidencia como un error, puede
igor@403 40 revertirlo a una versión previa a uno o muchos ficheros. De hecho,
igor@403 41 una herramienta \emph{realmente} buena, incluso puede ayudarle
igor@403 42 efectivamente a darse cuenta exactamente cuándo se introdujo el
igor@403 43 error( para más detalles ver la sección~\ref{sec:undo:bisect}).
igor@403 44 \item Le permitirá trabajar simultáneamente, y manejar las diferencias
igor@403 45 entre múltiples versiones de su proyecto.
igor@402 46 \end{itemize}
jerojasro@476 47 La mayoría de estas razones son igualmente válidas ---por lo menos en
igor@403 48 teoría--- así esté trabajando en un proyecto solo, o con mucha gente.
igor@403 49
igor@403 50 Algo fundamental acerca de lo práctico de un sistema de control de
igor@403 51 revisiones en estas dos escalas (``un hacker solo'' y ``un equipo
igor@403 52 gigantesco'') es cómo se comparan los \emph{beneficios} con los
igor@403 53 \emph{costos}. Una herramienta de control de revisiones que sea
igor@403 54 difícil de entender o usar impondrá un costo alto.
igor@403 55
igor@403 56 Un proyecto de quinientas personas es muy propenso a colapsar
igor@403 57 solamente con su peso inmediatamente sin una herramienta de control de
igor@403 58 versiones y un proceso. En este caso, el costo de usar control de
jerojasro@476 59 revisiones ni siquiera se tiene en cuenta, puesto que \emph{sin} él,
igor@403 60 el fracaso está casi garantizado.
igor@403 61
igor@403 62 Por otra parte, un ``arreglo rápido'' de una sola persona, excluiría
igor@403 63 la necesidad de usar una herramienta de control de revisiones, porque
igor@403 64 casi seguramente, el costo de usar una estaría cerca del costo del
igor@403 65 proyecto. ¿No es así?
igor@403 66
jerojasro@476 67 %TODO el sentido de uniquely va más a decir que hace ambas cosas sin problema,
jerojasro@476 68 % no a que ``apenas''las soporta, no?
igor@403 69 Mercurial solamente soporta \emph{ambas} escalas de de
igor@403 70 desarrollo. Puede aprender lo básico en pocos minutos, y dado su bajo
igor@403 71 sobrecosto, puede aplicar el control de revisiones al proyecto más
igor@403 72 pequeño con facilidad. Su simplicidad significa que no tendrá que
igor@403 73 preocuparse por conceptos obtusos o secuencias de órdenes compitiendo
igor@403 74 por espacio mental con lo que sea que \emph{realmente} esté tratando
igor@403 75 de hacer. Al mismo tiempo, Mercurial tiene alto desempeño y su
igor@403 76 naturaleza peer-to-peer le permite escalar indoloramente para manejar
igor@403 77 grandes proyectos.
igor@403 78
igor@403 79 Ninguna herramienta de control de revisiones puede salvar un
igor@403 80 proyecto mal administrado, pero la elección de herramientas puede
igor@403 81 hacer una gran diferencia en la fluidez con la cual puede trabajar en
igor@403 82 el proyecto.
igor@403 83
igor@403 84 \subsection{La cantidad de nombres del control de revisiones}
igor@403 85
igor@403 86 El control de revisiones es un campo amplio, tan ampli que no hay un
igor@403 87 acrónimo o nombre único. A continuación presentamos un listado de
igor@403 88 nombres comunes y acrónimos que se podrían encontrar:
igor@402 89 \begin{itemize}
igor@403 90 \item Control de revisiones (RCS)
igor@403 91 \item Manejo de Configuraciones de Programas(SCM), o administracón de
igor@403 92 configuraciones
igor@403 93 \item Administración de código fuente
igor@403 94 \item Control de Código Fuente, o Control de Fuentes
igor@403 95 \item Control de Versiones(VCS)
igor@402 96 \end{itemize}
igor@403 97 Algunas personas aducen que estos términos tienen significados
igor@403 98 diversos, pero en la práctica se sobrelapan tanto que no hay un
igor@403 99 acuerdo o una forma adecuada de separarlos.
igor@403 100
igor@403 101 \section{Historia resumida del control de revisiones}
igor@403 102
igor@403 103 La herramienta de control de revisiones más antigua conocida es SCCS
igor@403 104 (Sistema de Control de Código), escrito por Marc Rochkind en Bell
igor@408 105 Labs, a comienzos de los setentas(1970s). SCCS operaba sobre ficheros
igor@403 106 individuales, y requería que cada persona que trabajara en el proyecto
igor@403 107 tuviera acceso a un espacio compartido en un solo sistema. Solamente
igor@408 108 una persona podía modificar un fichero en un momento dado; el
igor@403 109 arbitramiento del acceso a los ficheros se hacía con candados. Era
igor@403 110 común que la gente pusiera los candados a los ficheros, y que
igor@403 111 posteriormente olvidara quitarlos, impidiendo que otro pudiera
igor@403 112 modificar los ficheros en cuestión sin la intervención del
igor@403 113 administrador.
igor@403 114
igor@403 115 Walter Tichy desarrolló una alternativa gratutita a SCCS a comienzos
igor@403 116 de los ochentas(1980s), llamó a su programa RCS(Sistema de Control de
igor@403 117 Revisiones). Al igual que SCCS, RCS requería que los desarrolladores
igor@403 118 trabajaran en un único espacio compartido y colocaran candados a los
igor@403 119 ficheros para evitar que varias personas los estuvieran modificando
igor@403 120 simultáneamente.
igor@403 121
igor@403 122 Después en los ochenta, Dick Grune usó RCS como un bloque de
igor@403 123 construcción para un conjunto de guiones de línea de comando, que
igor@403 124 inicialmente llamó cmt, pero que renombró a CVS(Sistema Concurrente de
igor@403 125 Versiones). La gran innovación de CVS era que permitía a los
igor@403 126 desarrolladores trabajar simultáneamente de una forma más o menos
igor@403 127 independiente en sus propios espacios de trabajo. Los espacios de
igor@403 128 trabajo personales impedian que los desarrolladores se pisaran las
igor@403 129 mangueras todo el tiempo, situación común con SCCS y RCS. Cada
igor@403 130 desarrollador tenía una copia de todo el fichero del proyecto y podía
igor@403 131 modificar su copia independientemente, Tenían que fusionar sus
igor@403 132 ediciones antes de consignar los cambios al repositorio central.
igor@403 133
igor@403 134 Brian Berliner tomó los scripts originales de Grune y los reescribió
igor@403 135 en~C, haciéndolos públicos en 1989, código sobre el cual se ha
igor@403 136 desarrollado la versión moderna de CVS. CVS posteriormente adquirió
igor@403 137 la habilidad de operar sobre una conexión de red, dotándolo de una
igor@403 138 arquitectura, cliente/servidor. La arquitectura de CVS es
igor@403 139 centralizada; La historia del proyecto está únicamente en el
igor@403 140 repositorio central. Los espacios de trabajo de los clientes
igor@403 141 contienen únicamente copias recientes de las versiones de los
igor@403 142 ficheros, y pocos metadatos para indicar dónde está el servidor. CVS
igor@403 143 ha tenido un éxito enorme; Es probablemente el sistema de control de
igor@403 144 revisiones más extendido del planeta.
igor@402 145
igor@404 146 A comienzos de los noventa(1990s), Sun MicroSystems desarrollo un
igor@404 147 temprano sistema distribuido de revisión de controles llamado TeamWare
igor@404 148 Un espacio de trabajo TeamWare contiene una copia completa de la
igor@404 149 historia del proyecto. TeamWare no tiene la noción de repositorio
igor@404 150 central. (CVS se basaba en RCS para el almacenamiento de su historia;
igor@404 151 TeamWare usaba SCCS.)
igor@404 152
igor@404 153 A medida que avanzaba la decada de los noventa, se empezño a
igor@404 154 evidenciar los problemas de CVS. Alacena cambios simultáneos a muchos
igor@408 155 ficheros de forma individual, en lugar de agruparlos como una
igor@404 156 operación única y atómica lógicamente. No maneja bien su jerarquía de
igor@404 157 ficheros bien; es fácil desordenar un repositorio renombrando ficheros
igor@404 158 y directorios. Peor aún, su código fuente es difícil de leer y
igor@404 159 mantener, lo que hace que su ``umbral de dolor'' para arreglar sus
igor@404 160 problemas arquitecturales algo prohibitivo.
igor@404 161
igor@404 162 En 2001, Jim Blandy y Karl Fogel, dos desarrolladores que habían
igor@404 163 trabajado en CVS, comenzaron un proyecto para reemplazarlo con una
igor@404 164 herramienta con mejor arquitectura y código más limpio. El resultado,
igor@404 165 Subversion, no se separó del modelo centralizado cliente/servidor de
igor@404 166 CVS, pero añadió consignaciones atómicas de varios ficheros, mejor
igor@404 167 manejo de nombres de espacios, y otras características que lo hacen
igor@404 168 mejor que CVS. Desde su versión inicial, ha ido creciendo en
igor@404 169 popularidad.
igor@404 170
igor@404 171 Más o menos en forma simultánea Graydon Hoare comenzó a trabajar en un
igor@404 172 sistema distribuido de control de versiones ambicioso que llamó
igor@404 173 Monotone. Mientras que Monotone se enfocaba a evitar algunas fallas de
igor@404 174 diseño de CVS con una arquitectura peer-to-peer, fue mucho más
igor@404 175 allá(junto con otros proyectos subsecuentes) que unas herramientas de
igor@404 176 control de revisiones en varios aspectos innovadores. Usa hashes
igor@404 177 criptográficos como identificadores, y tiene una noción integral de
igor@404 178 ``confianza'' para código de diversas fuentes.
igor@404 179
igor@404 180 Mercurial nació en el 2005. Algunos de sus aspectos de de diseño
igor@404 181 fueron influenciados por Monotone, pero Mercurial se enfoca en la
igor@404 182 facilidad de uso, gran rendimiento y escalabilidad para proyectos muy
igor@404 183 grandes.
igor@404 184
igor@404 185 \section{Tendencias en el control de revisiones}
igor@404 186
igor@404 187 Ha habido varias tendencias en el desarrollo y uso de las herramientas
igor@404 188 de control de revisiones en las pasadas cuatro décadas, mientras la
igor@404 189 gente se ha vuelto familiar con las capacidades de sus herramientas
igor@404 190 así mismo con sus limitaciones.
igor@404 191
igor@408 192 La primera generación comenzó administrando ficheros individuales en
igor@404 193 computadores por persona. A pesar de que tales herramientas
igor@404 194 representaron un avance importante frente al control de revisiones
igor@404 195 manual, su modelo de candados y la limitación a un sólo computador,
igor@404 196 determinó equipos de trabajo pequeños y acoplados.
igor@404 197
igor@404 198 La segunda generación dejó atrás esas limitaciones moviéndose a
igor@404 199 arquitecturas centradas en redes, y administrando proyectos completos
igor@404 200 uno a la vez. A medida que los proyectos crecían, nacieron nuevos
igor@404 201 problemas. Con la necesidad de comunicación frecuente con los
igor@404 202 servidores, escalar estas máquinas se convirtió en un problema en
igor@404 203 proyectos realmente grandes. Las redes con poca estabilidad impidieron
igor@404 204 que usuarios remotos se conectaran al servidor. A medida que los
igor@404 205 proyecos de código abierto comenzaron a ofrecer acceso de sólo lectura
igor@404 206 de forma anónima a cualquiera, la gente sin permiso para consignar,
igor@404 207 vio que no podían usar tales herramientas para interactuar en un
igor@404 208 proyecto de forma natural, puesto que no podían guardar sus cambios.
igor@404 209
igor@404 210 La generación actual de herramientas de control de revisiones es de
igor@404 211 forma natural peer-to-peer. Todos estos sistemas han eliminado la
igor@404 212 dependencia de un único servidor central, y han permitido que la
igor@404 213 gente distribuya sus datos de control de revisiones donde realmente se
igor@404 214 necesita. La colaboración a través de Internet ha cambiado las
igor@404 215 limitantes tecnológicas a la cuestión de elección y consenso. Las
igor@404 216 herramientas modernas pueden operar sin conexión indefinidamenta y
igor@404 217 autónomamente, necesitando una conexión de red solamente para
igor@404 218 sincronizar los cambios con otro repositorio.
igor@404 219
igor@404 220 \section{Algunas ventajas del control distribuido de revisiones}
igor@404 221
igor@404 222 A pesar de que las herramientas para el control distribuido de
igor@404 223 revisiones lleva varios años siendo tan robusto y usable como la
igor@404 224 generación previa de su contraparte, personas que usan herramientas
igor@404 225 más antiguas no se han percatado de sus ventajas. Hay gran cantidad
igor@404 226 de situaciones en las cuales las herramientas distribuidas brillan
igor@404 227 frente a las centralizadas.
igor@404 228
igor@404 229 Para un desarrollador individual, las herramientas distribuidas casi
igor@404 230 siempre son más rápidas que las centralizadas. Por una razón sencilla:
igor@404 231 Una herramienta centralizada necesita comunicarse por red para las
igor@404 232 operaciones más usuales, debido a que los metadatos se almacenan en
igor@404 233 una sola copia en el servidor central. Una herramienta distribuida
igor@404 234 almacena todos sus metadatos localmente. Con todo lo demás de la
igor@404 235 misma forma, comunicarse por red tiene un sobrecosto en una
igor@404 236 herramienta centralizada. No subestime el valor de una herramienta de
igor@404 237 respuesta rápida: Usted empleará mucho tiempo interactuando con su
igor@404 238 programa de control de revisiones.
igor@404 239
igor@404 240 Las herramientas distribuidas son indiferentes a los caprichos de su
igor@404 241 infraestructura de servidores, de nuevo, debido a la replicación de
igor@404 242 metadatos en tantos lugares. Si usa un sistema centralizado y su
igor@404 243 servidor explota, ojalá los medios físicos de su copia de seguridad
igor@404 244 sean confiables, y que su última copia sea reciente y además
igor@404 245 funcione. Con una herramienta distribuida tiene tantas copias de
igor@404 246 seguridad disponibles como computadores de contribuidores.
igor@404 247
igor@404 248 La confiabilidad de su red afectará las herramientas distribuidas de
igor@404 249 una forma mucho menor que las herramientas centralizadas No puede
igor@404 250 siquiera usar una herramienta centralizada sin conexión de red,
igor@404 251 excepto con algunas órdenes muy limitadas. Con herramientas
igor@404 252 distribuidas, si sus conexión cae mientras usted está trabajando,
igor@404 253 podría nisiquiera darse cuenta. Lo único que que no podrá hacer es
igor@404 254 comunicarse con repositorios en otros computadores, algo que es
igor@404 255 relativamente raro comparado con las operaciones locales. Si tiene
igor@404 256 colaboradores remotos en su equipo, puede ser significante.
igor@404 257
igor@404 258 \subsection{Ventajas para proyectos de código abierto}
igor@404 259
igor@404 260 Si descubre un proyecto de código abierto y decide que desea comenzar
igor@404 261 a trabajar en él, y ese proyecto usa una herramienta de control
igor@404 262 distribuido de revisiones, usted es un par con la gente que se
igor@404 263 considera el ``alma'' del proyecto. Si ellos publican los
igor@404 264 repositorios, se puede copiar inmediatamente la historia del proyecto,
igor@404 265 hacer cambios y guardar su trabajo, usando las mismas herramientas de
igor@404 266 la misma forma que ellos. En contraste, con una herramienta
igor@404 267 centralizada, debe usar el programa en un modo ``sólo lectura'' a
igor@404 268 menos que alguien le otorgue permisos para consignar cambios en el
igor@404 269 repositorio central. Hasta entonces, no podrá almacenar sus cambios y
igor@404 270 sus modificaciones locales correrán el riesgo de dañarse cuando trate
igor@404 271 de actualizar su vista del repositorio.
igor@404 272
igor@404 273 \subsubsection{Las bifurcaciones(forks) no son un problema}
igor@404 274
igor@404 275 Se ha mencionado que las herramientas de control distribuido de
igor@404 276 versiones albergan un riesgo a los proyectos de código abierto, puesto
jerojasro@405 277 que se vuelve muy sencillo hacer una ``bifurcanción''\ndt{fork.} del
igor@404 278 desarrollo del proyecto. Una bifurcación pasa cuando hay diferencias
igor@404 279 de opinión o actitud entre grupos de desarrolladores que desenvoca en
igor@404 280 la decisión de la imposibilidad de continuar trabajando juntos. Cada
igor@404 281 parte toma una copia más o menos completa del código fuente del
igor@404 282 proyecto y toma su propio rumbo.
igor@404 283
igor@404 284 En algunas ocasiones los líderes de las bifurcaciones reconcilian sus
igor@404 285 diferencias. Con un sistema centralizado de control de revisiones, el
igor@404 286 proceso \emph{técnico} de reconciliarse es doloroso, y se hace de
igor@404 287 forma muy manual. Tiene que decidir qué historia de revisiones va a
igor@404 288 ``win'', e injertar los cambios del otro equipo en el árbol de alguna
igor@404 289 manera. Con esto usualmente se pierde algo o todo del historial de la
igor@404 290 revisión de alguna de las partes.
igor@404 291
igor@404 292 Lo que las herramientas distribuidas hacen con respecto a las
igor@404 293 bifurcaciones, es que las bifurcaciones son la \emph{única} forma de
igor@404 294 desarrollar un proyecto. Cada cambio que usted hace es potencialmente
igor@404 295 un punto de bifurcación. La gran fortaleza de esta aproximación es que
igor@404 296 las herramientas distribuidas de control de revisiones tiene que ser
igor@404 297 bueno al \emph{fusionar} las bifurcaciones, porque las bifurcaciones
igor@404 298 son absolutamente fundamentales: pasan todo el tiempo.
igor@404 299
igor@404 300 Si todas las porciones de trabajo que todos hacen todo el tiempo, se
igor@404 301 enmarca en términos de bifurcaciones y fusiones, entonces a aquello a
igor@404 302 lo que se refiere en el mundo del código abierto a una ``bifurcación''
igor@404 303 se convierte \emph{puramente} en una cuestión social. Lo que hacen las
igor@404 304 herramientas distribuidas es \emph{disminuir} la posibilidad de una
igor@404 305 bifurcación porque:
igor@402 306 \begin{itemize}
igor@404 307 \item Eliminan la distinción social que las herramientas centralizadas
igor@404 308 imponen: esto entre los miembros (personas con permiso de consignar)
igor@404 309 y forasteros(los que no tienen el permiso).
igor@404 310 \item Facilitan la reconciliación después de una bifurcación social,
igor@404 311 porque todo lo que concierne al programa de control de revisiones es
igor@404 312 una fusión.
igor@402 313 \end{itemize}
igor@402 314
igor@404 315 Algunas personas se resisten a las herramientas distribuidas porque
igor@404 316 desean mantener control completo sobre sus proyectos, y creen que las
igor@407 317 herramientas centralizadas les da tal control. En todo caso, si este
igor@404 318 es su parecer, y publica sus repositorios de CVS o Subversion, hay
igor@404 319 muchas herramientas disponibles que pueden obtener la historia
igor@404 320 completa(A pesar de lo lento) y recrearla en otro sitio que usted no
igor@407 321 controla. Siendo así un control ilusorio, puesto que está impidiendo
igor@407 322 la fluidez de colaboración en lugar de prevenir que alguien se sienta
igor@407 323 impulsado a obtener una copia y hacer una bifurcación con su historia.
igor@407 324
igor@407 325 \subsection{Ventajas para proyectos comerciales}
igor@407 326
igor@407 327 Muchos proyectos comerciales tienen grupos de trabajo distribuidos
igor@407 328 alrededor del globo. Quienes contribuyen y están lejos de un
igor@407 329 repositorio central verán una ejecución más lenta de las órdenes y tal
igor@407 330 vez menos confiabilidad. Los sistemas de control de revisión
igor@407 331 comerciales intentan amortiguar estos problemas con adiciones de
igor@407 332 replicación remota que usualmente son muy costosos y complicados de
igor@407 333 administradr. Un sistema distribuido no padece estos problemas. Mejor
igor@407 334 aún, puede colocar varios servidores autorizados, por ejemplo, uno por
igor@407 335 sitio, de tal forma que no haya comunicación redundante entre
igor@407 336 repositorios sobre enlaces de conexión costosos.
igor@407 337
igor@407 338 Los sistemas de control de revisiones distribuidos tienden a ser poco
igor@407 339 escalables. No es inusual quw costosos sistemas centralizados caigan
igor@407 340 ante la carga combinada de unas cuantas docenas de usuarios
igor@407 341 concurrentes. De nuevo, las respuestas típicas de replibcación tienden
igor@407 342 a ser costosas y complejas de instalar y administrar. Dado que la
igor@407 343 carga en un servidor central---si es que tiene uno---es muchas veces
igor@407 344 menor con una herramienta distribuida(debido a que los datos están
igor@407 345 replicados en todas partes), un sólo servidor económico puede tratar
igor@407 346 las necesidades de equipos mucho más grandes, y la replicación para
igor@407 347 balancear la carga se vuelve cosa de scripts.
igor@407 348
igor@407 349 Si tiene un empleado en el campo, se beneficiará grandemente de un
igor@407 350 sistema distribuido de control de versiones al resolver problemas en
igor@407 351 el sitio del cliente. La herramienta le permitirá generar
igor@407 352 construcciones a la medida, probar diferentes arreglos de forma
igor@407 353 independiente y buscar de forma eficiente las fuentes de fallos en la
igor@407 354 historia y regresiones en los ambientes de los clientes, todo, sin
igor@407 355 necesidad de conectarse al servidor de su compañía.
igor@407 356
igor@407 357 \section{¿Por qué elegir Mercurial?}
igor@407 358
igor@407 359 Mercurial cuenta con un conjunto único de propiedades que lo hacen
igor@407 360 particularmente una buena elección como un sistema de control de
igor@407 361 revisiones, puesto que:
igor@402 362 \begin{itemize}
igor@407 363 \item Es fácil de aprender y usar.
igor@407 364 \item Es liviano.
igor@407 365 \item Escala de forma excelente.
igor@407 366 \item Es fácil de acondicionar.
igor@402 367 \end{itemize}
igor@402 368
igor@407 369 Si los sistemas de control de revisiones le son familiares, debería
igor@407 370 estar listo para usar Mercurial en menos de cinco minutos. Si no, va a
igor@407 371 tomar unos pocos minutos más. Las órdenes de Mercurial y su conjunto
igor@407 372 de características son uniformes y consistentes generalmente, y basta
igor@407 373 con que siga unas pocas reglas generales en lugar de un montón de
igor@407 374 excepciones.
igor@407 375
igor@407 376 En un proyecto pequeño, puede comenzar a trabajar con Mercurial poco a
igor@407 377 poco. Creando nuevos cambios y ramas, transfiriendo cambios(localmente
igor@407 378 o por la red); y las operaciones relacionadas con el estado y la
igor@407 379 historia son rápidas. Mercurial buscar ser ligero y no incomodar en su
igor@407 380 camino combinando poca sobrecarga cognitiva con operaciones
igor@407 381 asombrosamente rápidas.
igor@407 382
igor@407 383 La utilidad de Mercurial no se limita a proyectos pequeños: está
igor@407 384 siendo usado por proyectos con centenas de miles de contribuyentes,
igor@407 385 cada uno conteniendo decenas de miles de ficheros y centenas de
igor@407 386 megabytes de código fuente
igor@407 387
igor@407 388 Si la funcionalidad básica de Mercurial no es suficiente para usted,
igor@407 389 es muy fácil extenderlo. Mercurial se comporta muy bien con tareas de
igor@407 390 scripting y su limpieza interna junto con su implementación en Python
igor@407 391 permiten añadir características fácilmente en forma de extensiones.
igor@407 392 Hay un buen número de extensiones útiles y populares en este momento,
igor@407 393 desde ayudar a identificar fallos hasta el mejoramiento de su
igor@407 394 desempeño.
igor@407 395
igor@407 396 \section{Comparación de Mercurial con otras herramientas}
igor@407 397
igor@407 398 Antes de leer, por favor tenga en cuenta que esta sección
igor@407 399 necesariamente refleja mis propias experiencias, intereses y(tengo que
igor@407 400 decirlo) mis preferencias. He usado cada una de las herramientas de
igor@407 401 control de versiones listadas a continuación, y en muchos casos por
igor@407 402 varios años.
igor@402 403
igor@402 404
igor@402 405 \subsection{Subversion}
igor@402 406
igor@407 407 Subversion es una herramienta de control de revisiones muy popular,
igor@407 408 desarrollada para reemplazar a CVS. Su arquitectura es centralizada
igor@407 409 en cliente/servidor.
igor@407 410
igor@407 411 Subversion y Mercurial tienen órdenes con nombres similares para hacer
igor@407 412 las mismas operaciones, por lo que si le son familiares en una, será
igor@407 413 sencillo aprender a usar la otra. Ambas herramientas son portables en
igor@407 414 todos los sistemas operativos populares.
igor@407 415
igor@407 416 Antes de la versión 1.5, Subversion no tenía soporte para fusiones. En
igor@407 417 el momento de la escritura, sus capcidades para llevar cuenta de las
igor@407 418 funciones son nuevas,
igor@407 419 \href{http://svnbook.red-bean.com/nightly/en/svn.branchmerge.advanced.html#svn.branchmerge.advanced.finalword}{complicadas
igor@409 420 y poco estables\ndt{buggy}}.
igor@407 421
igor@407 422 Mercurial tiene una ventaja considerable en el desempeño sobre
igor@407 423 Subversion en cualquier operación de control de revisiones que yo haya
igor@407 424 medido. He medido sus ventajas con factores desde dos hasta seis veces
igor@408 425 comparando con almacenamiento de ficheros \emph{ra\_local}
igor@407 426 Subversion~1.4.3, el cual es el método de acceso más rápido. En los
igor@407 427 escenarios más sencillos incluyendo almacenamiento con la red de por
igor@407 428 medio, Subversion se encuentra en desventaja aún mayor. Dado que casi
igor@407 429 todas las órdenes de Subversion deben tratar con el servidor y
igor@407 430 Subversion no tiene utilidades de replicación sencillas, la capacidad
igor@407 431 del servidor y el ancho de banda se convierten en cuellos de botella
igor@407 432 para proyectos modestamente grandes.
igor@407 433
igor@407 434 Adicionalmente, Subversion tiene un sobrecosto en almacentamiento
igor@407 435 considerable para evitar transacciones por red en algunas operaciones,
igor@407 436 tales como encontrar ficheros modificados(\texttt{status}) y desplegar
igor@407 437 información frente a la revisión actual(\texttt{diff}). Como
igor@407 438 resultado, la copia de trabajo de Subversion termina siendo del mismo
igor@407 439 tamaño o más grande que un repositorio de Mercurial y el directorio de
igor@407 440 trabajo, a pesar de que el repositorio de Mercurial contiene la
igor@407 441 historia completa del proyecto.
igor@407 442
igor@407 443 Subversion tiene soporte amplio de otras herramientas. Mercurial por
igor@407 444 ahora está bastante atrás en este aspecto. Esta diferencia está
igor@409 445 disminuyendo, y algunas de las herramientas GUI\ndt{Interfaz de
igor@407 446 Usuario Gráfica}, eclipsan sus equivalentes de Subversion. Al igual
igor@407 447 que Mercurial, Subversion tiene un excelente manual de usuario.
igor@402 448
igor@408 449 Dado que Subversion no almacena la historia de revisiones en el
igor@408 450 cliente, es muy bueno para administrar proyectos que tienen muchos
igor@408 451 ficheros binarios grandes y opacos. Si consigna cincuenta revisiones
igor@408 452 de un fichero de 10MB que no es comprimible, el esapacio en el cliente
igor@408 453 de Subversion se mantendrá constante mientras que el espacio usado por
igor@408 454 cualquier Sistema Distribuido de Control de Revisiones crecerá
igor@408 455 rápidamente en proporción con el número de revisiones, debido a que
igor@408 456 las diferencias entre cada revisión es grande.
igor@408 457
igor@408 458 Adicionalmente, generalmente es difícil o más bien, imposible mezclar
igor@408 459 diferentes versiones de un fichero binario. La habilidad de Subversion
igor@408 460 para permitirle al usuario poner una cerradura a un fichero, de modo
igor@408 461 que tenga un permiso exclusivo para consignar cambios, puede ser una
igor@408 462 ventaja significativa en un proyecto donde los ficheros binarios sean
igor@408 463 usados ampliamente.
igor@408 464
igor@408 465 Mercurial puede importar la historia de revisiones de un repositorio
igor@408 466 de Subversion. También puede exportar historia de revisiones a un
igor@408 467 repositorio de Subversion. De esta forma es sencillo ``dar un
igor@408 468 vistazo'' y usar Mercurial y Subversion en paralelo antes de decidirse
igor@408 469 a dar el paso. La conversión de la historia es incremental, de modo
igor@408 470 que puede aplicar una conversión inicial, y después conversiones
igor@408 471 pequeñas y adicionales posteriormente para traer nuevos cambios.
igor@402 472
igor@402 473 \subsection{Git}
igor@402 474
igor@408 475 Git es una herramienta distribuida de control de revisiones
igor@408 476 desarrollada para administrar el arbol del Kernel de Linux. Al igual
igor@408 477 que Mercurial los principios de su diseño fueron influenciados por
igor@408 478 Monotone.
igor@408 479
igor@408 480 Git tiene un conjunto de órdenes muy grande en la versión~1.5.0
igor@408 481 ofrece~139 órdenes individuales. Tiene cierta reputación de ser
igor@408 482 difícil de aprender. Comparado con Git, Mercurial tiene un fuerte
igor@408 483 enfoque hacia la facilidad.
igor@408 484
igor@408 485 En términos de rendimiento, Git es extremadamente rápido. En muchos
igor@408 486 casos, es más rápido que Mercurial, por lo menos en Linux, mientras
igor@408 487 que Mercurial se comporta mejor en otras operaciones. De todas
igor@408 488 maneras en Windows, el desempeño y el nivel general de soporte que
igor@408 489 ofrece Git, al momento de la escritura, está lejos detrás de
igor@408 490 Mercurial.
igor@408 491
igor@408 492 Mientras que el repositorio de Mercurial no requiere mantenimiento, el
igor@408 493 repositorio de Git requiere frecuentes ``repacks'' a sus metadatos.
igor@408 494 Sin estos, el desempeño se degrada y el espacio crece rápidamente. Un
igor@408 495 servidor que contenga repositorios de Git que no sean reempacados
igor@408 496 rigurosa y frecuentemente requerirá trabajo-intenso de disco durante
igor@408 497 las copias de seguridad, y ha habido situaciones en copias de
igor@408 498 seguridad diaria que toman más de 24 horas como resultado. Un
igor@408 499 repositorio recién reempacado de Git es un poco más pequeño que un
igor@408 500 repositorio de Mercurial, pero un repositorio sin reempacar es varios
igor@408 501 órdenes de magnitud más grande.
igor@408 502
igor@408 503 El corazón de Git está escrito en C. Muchas órdenes de Git están
igor@408 504 implementadas como scripts de shell o Perl y la calidad de esos
igor@408 505 scripts varía ampliamente. He encontrado muchas situaciones en las
igor@408 506 cuales los scripts no tuvieron en cuenta la presencia de errores que
igor@408 507 podrían haber sido fatales.
igor@408 508
igor@408 509 Mercurial puede importar el historial de revisiones de un repositorio
igor@408 510 de Git.
igor@402 511
igor@402 512 \subsection{CVS}
igor@402 513
igor@408 514 CVS es probablemente la herramienta de control de revisiones más
igor@408 515 ampliamente usada en el planeta. Debido a su edad y su poca pulcritud
igor@408 516 nterna, ha sido ligeramente mantenido en muchos años.
igor@408 517
igor@408 518 Tiene una arquitectura centralizada cliente/servidor. No agrupa
igor@408 519 cambios relacionadso en consignaciones atómicas, pemitiendo que con
igor@408 520 facilidad la gente ``rompa la construcción'': una persona puede
igor@408 521 consignar exitósamente parte del cambio y estar bloqueada por la
igor@408 522 necesidad de una mezcla, forzando a otras personas a ver solamente una
igor@408 523 porción del trabajo que estaban buscando hacer. Esto afecta también
igor@408 524 la forma como usted trabaja con la historia del proyecto. Si quiere
igor@408 525 ver todas las modificaciones que alguien hizo como parte de una tarea,
igor@408 526 necesitará inspeccionar manualmente las descripciones y las marcas de
igor@408 527 tiempo de cambio de cada fichero involucrado(esto, si usted saber
igor@408 528 cuáles eran tales ficheros).
igor@408 529
igor@408 530 CVS tiene una noción confusa de etiquetas y ramas que yo no trataría
igor@408 531 incluso de describir. No soporta renombramiento de ficheros o
igor@408 532 directorios de buena forma, facilitando el corromper un
igor@408 533 repositorio. Casi no tiene chequeo de consistencia interna, por lo
igor@408 534 tanto es casi imposible identificar por que o cómo se corrompió un
igor@408 535 repositorio. Yo no recomendaría un repositorio de CVS para proyecto
igor@408 536 alguno, ni existente ni nuevo.
igor@408 537
igor@408 538 Mercurial puede importar la historia de revisiones de CVS. De todas
igor@408 539 maneras hay ciertos trucos para aplicar; los cuales también son
igor@408 540 necesarios para cualquier herramienta importadora de historial de
igor@408 541 CVS. Debido a la falta de atomicidad de cambios y el no versionamiento
igor@408 542 de la jerarquía del sistema de archivos, es imposible reconstruir la
igor@408 543 completamente la historia de CVS acertadamente; hay cierto trabajo de
igor@408 544 conjetura involucrado y los renombramientos tampoco se
igor@408 545 mostrarán. Debido a que gran parte de la administración avanzada de
igor@408 546 CVS tiene que hacerse manualmente y por lo tanto es proclive al error,
igor@408 547 es común que los importadores de CVS encuentren muchos problemas con
igor@408 548 repositorios corruptos( marcas de tiempo totalmente desubicadas y
igor@408 549 archivos que han permanecido con candados por más de una década son
igor@408 550 dos de los problemas más interesantes de los que puedo retomar de mi
igor@408 551 experiencia personal).
igor@408 552
igor@408 553 Mercurial puede importar la historia de revisiones de un repositorio
igor@408 554 CVS.
igor@408 555
igor@408 556 \subsection{Herramientas comerciales}
igor@408 557
igor@408 558 Perforce tiene una arquitectura centralizada cliente/servidor sin
igor@408 559 almacenamiento de dato alguno en el lado del cliente. A diferencia de
igor@408 560 las herramientas modernas de control de revisiones, Perforce requiere
igor@408 561 que un usuario ejecute una orden para informar al servidor acerca de
igor@408 562 todo fichero que se vaya a editar.
igor@408 563
igor@408 564 El rendimiento de Perforce es muy bueno para equipos pequeños, pero se
igor@408 565 degrada rápidamente cuando el número de usuarios va más allá de pocas
igor@408 566 docenas. Instalaciones modestamente grandes de Perforce requiere la
igor@408 567 organización de proxies para soportar la carga que sus usuarios generan.
igor@408 568
igor@408 569 \subsection{Elegir una herramienta de control de revisiones}
igor@408 570
igor@408 571 Con la excepción de CVS, toda las herramientas que se han listado
igor@408 572 anteriormente tienen fortalezas que los hacen valiosos de acuerdo al
igor@408 573 tipo de trabajo. No hay una única herramienta de control de revisiones
igor@408 574 que sea la mejor en todas las situaciones.
igor@408 575
igor@408 576 Por ejemplo, Subversion es una buena elección para trabajar con
igor@408 577 edición frecuente de ficheros binarios, debido a su naturaleza
igor@408 578 centralizada y soporte para poner candados a ficheros.
igor@408 579
igor@408 580 Personalmente encuentro las propiedades de simplicidad, desempeño, y
igor@408 581 buen soporte de fusiones de Mercurial una combinación llamativa que ha
igor@408 582 dado buenos frutos por varios años.
igor@408 583
igor@408 584
igor@408 585 \section{Migrar de otra herramienta hacia Mercurial}
igor@408 586
igor@408 587 Mercurial viene con una extensión llamada \hgext{convert}, que puede
igor@408 588 importar historiales de revisiones de forma incremental desde varias
igor@408 589 herramientas de control de revisiones. Por ``incremental'', quiero
igor@408 590 decir que puede migrar toda la historia de un proyecto en una primera
igor@408 591 instancia y después volver a ejecutar la migración posteriormente para
igor@408 592 obtener los nuevos cambios que han sucedido después de la migración
igor@408 593 inicial.
igor@408 594
igor@408 595 A continuación presentamos las herramientas de revisiones que la
igor@408 596 orden\hgext{convert} soporta:
igor@402 597 \begin{itemize}
igor@402 598 \item Subversion
igor@402 599 \item CVS
igor@402 600 \item Git
igor@402 601 \item Darcs
igor@402 602 \end{itemize}
igor@402 603
igor@408 604 Adicionalmente, \hgext{convert} puede exportar cambios de Mercurial
igor@408 605 hacia Subversion. Lo que hace posible probar Subversion y Mercurial
igor@408 606 en paralelo antes de lanzarse a un migración total, sin arriesgarse a
igor@408 607 perder trabajo alguno.
igor@408 608
igor@408 609 La orden \hgxcmd{conver}{convert} es sencilla de usar. Basta con
igor@408 610 apuntarla hacia la ruta o el URL del repositorio fuente, opcionalmente
igor@408 611 darle el nombre del nombre del repositorio destino y comenzará a hacer
igor@408 612 su trabajo. Después de la conversión inicial, basta con invocar de
igor@408 613 nuevo la orden para importar nuevos cambios.
igor@402 614
igor@402 615
igor@402 616 %%% Local Variables:
igor@402 617 %%% mode: latex
igor@402 618 %%% TeX-master: "00book"
igor@402 619 %%% End: