domingo, abril 06, 2014

Subversión versus Mercurial

5 años atrás usaba Subversion, aún lo hago, es la herramienta oficial en la oficina, pero, desde entonces me he vuelto un fan de otra herramienta, Mercurial, en que el control de las versiones es distribuido y no centralizado como en Svn.

No es Git, bastante más famoso, pero todos los reviews que he leído (no he usado Git, así que me debo conformar con los reviews) apuntan a que con funcionalidades similares Mercurial es una herramienta más "amigable" frente a una solución más de múltiples herramientas que permiten hacer casi cualquier cosa... Incluido el modificar la historia (quizás por ese punto en particular es que no me atrae, tengo un tema más bien filosófico al respecto).... 
Ahora, para qué cambiar de uno a otro.... subversion no es malo, de hecho es una excelente herramienta, sólida y con una base de desarrollo sólida... Pero tiene algunos problemas, y son esos problemas los que me acercaron a Mercurial.

  1. Subversión es un gran repositorio, con múltiples proyectos, que crece y crece, y del cual uno sólo ve las ramas específicas que baja. Eso supone cada vez más esfuerzos de mantención, por el otro lado, Mercurial es un repositorio un proyecto, bastante más auto contenido.
  2. En Subversión uno hace commit o demasiado pronto o demasiado tarde, me explico, sí uno está desarrollando algo, digamos que tome algunos días, o hace commits intermedios, "contaminado" el repositorio central con código incompleto, que puede que hagan que la aplicación falle, o uno se espera hasta el último minuto, después de terminar y probar bien lo que hizo, y recién hace el commit (por ende, durante todo el tiempo en que uno desarrolló lo hizo SIN control de versiones). En Mercurial, al tener repositorios distribuidos, uno puede realizar el desarrollo, hacer commits en el repositorio local (y por lo tanto tener la flexibilidad de regresar a un punto intermedio, o el analizar los cambios que se hicieron en forma más específica), y una vez que está listo puede sincronizarse con el servidor principal, e incluso, si durante el desarrollo, algo que uno hizo puede ser utilizado por otra persona (sin esperar que esté terminado el total), sincronizando los repositorios personales, sin pasar por el servidor central.
  3. En Subversión la conexión al servidor central es un requisito al hacer commit, el poder trabajar off-line, haciendo commits, no es factible. En Mercurial, el repositorio local está en el mismo disco, por lo cual no es necesaria una conexión, sólo cuando se debe hacer sincronización con el servidor central.
  4. Subversion tiene un modelo relativamente inflexible para trabajar, mientras que Mercurial permite armar el modelo que más le acomode, por ejemplo, un servidor local y repositorios locales (igual que en Subversion pero con capacidad de aplicar control de versiones al trabajo intermedio), o por ejemplo, un servidor central de desarrollo, uno de paso a producción y uno de código en producción, o en realidad el modelo que a uno le parezca más apropiado.
Ahora, Mercurial no es puras rosas, el modelo distribuido es más complejo de explicar, y requiere de mayor esfuerzo por quienes lo utilizan (es fácil olvidarse de pasos)... en ese sentido, dos artículos son buenos para poder entender mejor como funciona Mercurial versus Subversion, el primero, un tutorial (Hg Init, de Joel Spolsky), con un capítulo especial de "re-educación" para usuarios de Subversion, y un libro on-line de Eric Sink que en una forma bastante didáctica explica la forma de hacer las tareas en una herramienta u otra.

De hecho, una de las ventajas que suelen indicar respecto a Mercurial es su capacidad para manejar exitosamente ramas, pero no es tan simple la verdad, y es materia para otro post el comentar un poco más de ese punto....

No hay comentarios.: