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