significado - mercurial vs git
Usando Mercurial en una gran organizaciĆ³n (3)
AFAICS la mayor parte de la resistencia a cualquiera de los DVCS proviene de personas que no comprenden cómo usarlas. La afirmación frecuentemente repetida de que "no hay un depósito central" es muy aterrador para las personas que han estado encerradas en el modelo CVS / SVN desde tiempos inmemoriales y no pueden imaginar nada más, especialmente para la gerencia y el personal directivo (con experiencia y / o cínicos) desarrolladores que desean un fuerte seguimiento y reproducibilidad del código fuente (y quizás también si tiene que cumplir ciertos estándares con respecto a sus procesos de desarrollo, como hicimos en el lugar donde trabajé alguna vez). Bueno, puedes tener un repos central "bendecido"; simplemente no estás encadenado a eso. Es fácil para un subteam establecer un repositorio interno de juegos en una de sus estaciones de trabajo por un tiempo, por ejemplo.
Hay tantas maneras de despellejar al gato proverbial que le pagará sentarse y pensar cuidadosamente sobre su flujo de trabajo. Piense en sus prácticas actuales y en el poder que la clonación y la ramificación casi gratuitas le brindan. Es probable que algo de lo que hace actualmente haya evolucionado para evitar las limitaciones del modelo tipo CVS; prepárate para romper el molde. Probablemente necesites nombrar un campeón o dos para facilitar a todos durante la transición; con un gran equipo, probablemente quieras pensar en restringir el acceso de commit a bendecido .
En mi trabajo (pequeña casa de software) pasamos de CVS a hg y no volveríamos. Lo estamos usando de una manera principalmente centralizada. La conversión de nuestro repos principal (antiguo y muy grande) fue doloroso, pero será de cualquier forma que vaya, y cuando haya terminado, será mucho más fácil cambiar el VCS más tarde. (Encontramos una serie de situaciones en las que las herramientas de conversión de CVS simplemente no pueden descifrar qué sucedió, donde el compromiso de alguien solo tuvo éxito parcialmente y no se dieron cuenta durante días; resolver las ramas de los proveedores; locura general y locura causada por el tiempo que parecía ir al revés, no ayudado por las marcas de tiempo de compromiso en la hora local desde diferentes zonas horarias ...)
El gran beneficio que he encontrado de un DVCS es la capacidad de comprometerse temprano y comprometerse a menudo y solo presionar cuando esté listo. A medida que alcanzo varios hitos de trabajo en curso, me gusta establecer una línea en la arena para tener un lugar donde pueda rebobinar si es necesario, pero estos no son compromisos que deberían exponerse al equipo, ya que son manifiestamente incompletos. de innumerables maneras. (Lo hago principalmente con colas mercuriales). Se trata del flujo de trabajo; Nunca podría haber hecho esto con CVS.
Supongo que ya sabes esto, pero si piensas alejarte de CVS, puedes hacerlo mucho mejor que SVN ...
Para monolito, o para el módulo? Cualquier cambio de paradigma va a ser complicado cualquiera sea el VCS con el que trabajes, distribuido o no; El modelo de CVS es bastante especial en cuanto a cómo te permite comprometer archivos por archivo sin verificar si el resto del repositorio está actualizado (y no menciones el dolor de cabeza que se sabe que causan los alias de módulos).
- Tratar con repositorios monolíticos puede ser bastante lento. Su cliente de vcs tiene que escanear su copia de todo el universo en busca de cambios, a diferencia de un solo módulo. (Si está trabajando en Linux, consulte la extensión hg inotify si aún no lo ha hecho).
- Un repositorio monolítico también causa condiciones de carrera innecesarias al cometer (empujar). Es como la verificación actualizada de CVS, pero se aplicó en todo el repositorio: si tienes muchos desarrolladores activos, comprometiéndote con frecuencia, este te morderá.
Sugeriría que vale la pena el esfuerzo de mantenerse alejado de lo monolítico, pero tenga en cuenta que impondrá sus propios gastos generales en términos de complejidad añadida en su sistema de compilación. (Nota al margen: si encuentra que algo es una tarea ardua, ¡automatícelo! Nosotros, los programadores, somos criaturas perezosas, después de todo.) La división de su repo en todos sus módulos componentes puede ser demasiado extrema; puede haber una casa intermedia con componentes relacionados agrupados entre un pequeño número de repositorios. También puede ser útil buscar en el soporte de submódulos de Mercurial: Repositorios anidados y Extensión forestal (los cuales debo probar y entender).
En un antiguo lugar de trabajo teníamos varias docenas de componentes que se conservaban como módulos de CVS independientes con una metaestructura bastante regimentada. Los componentes declararon de qué dependían y qué piezas construidas debían exportarse donde; el sistema de compilación escribió automáticamente fragmentos de forma que lo que estaba trabajando recogería lo que necesitaba. En general funcionó muy bien y fue bastante raro fallar el chequeo actualizado de CVS. (También había un robot de construcción diabólicamente complicado pero extremadamente poderoso con una actitud de menor esfuerzo hacia la resolución de dependencia: no reconstruiría un componente si ya había uno que cumpliera con sus requisitos. Agregue a eso metacomponentes que ensamblaron instaladores y todo Imágenes ISO, y usted tiene una buena receta para compilaciones sencillas de principio a fin y para cosas que van aprendiendo Sorcerers. Alguien debería escribir un libro sobre eso ...)
He estado usando Mercurial para mis proyectos personales por un tiempo, y me encanta. Mi empleador está considerando cambiar de CVS a SVN, pero me pregunto si debería presionar Mercurial (o algún otro DVCS) en su lugar.
Una arruga con Mercurial es que parece estar diseñada en torno a la idea de tener un único repositorio por "proyecto". En esta organización, hay docenas de ejecutables, DLL y otros componentes en el repositorio de CVS actual, organizados jerárquicamente. Hay muchos componentes genéricos reutilizables, pero también algunos componentes específicos del cliente y configuraciones específicas del cliente. Los procedimientos de compilación actuales generalmente obtienen algún conjunto de subárboles del repositorio de CVS.
Si pasamos de CVS a Mercurial, ¿cuál es la mejor forma de organizar el repositorio / repositorios? ¿Deberíamos tener un gran repositorio Mercurial que contenga todo? De lo contrario, ¿qué tan fino deberían ser los repositorios más pequeños? Creo que a las personas les resultará muy molesto si tienen que extraer y enviar actualizaciones de muchos lugares diferentes, pero también les resultará molesto si tienen que extraer / empujar toda la base de código de la compañía.
¿Alguien tiene experiencia con esto o un consejo?
Preguntas relacionadas:
Divulgación: Esta es una publicación cruzada de otro hilo que se centró en git, pero terminé recomendando mercurial de todos modos. Se trata de DVCS en un contexto empresarial en general, por lo que espero que la publicación cruzada sea correcta. Lo he modificado un poco para que se ajuste mejor a esta pregunta:
En contra de la opinión común, creo que usar un DVCS es una opción ideal en una configuración empresarial porque permite flujos de trabajo muy flexibles. Hablaré sobre el uso de DVCS vs. CVCS primero, mejores prácticas y luego sobre git en particular.
DVCS vs. CVCS en un contexto empresarial:
No hablaré sobre los pros / contras generales aquí, sino que me enfocaré en tu contexto. Es la concepción común, que usar un DVCS requiere un equipo más disciplinado que usar un sistema centralizado. Esto se debe a que un sistema centralizado le proporciona una forma fácil de aplicar su flujo de trabajo, usar un sistema descentralizado requiere más comunicación y disciplina para cumplir con las convenciones establecidas. Si bien esto puede parecer que induce una sobrecarga, veo beneficios en la mayor comunicación necesaria para que sea un buen proceso. Su equipo deberá comunicar el código, los cambios y el estado del proyecto en general.
Otra dimensión en el contexto de la disciplina es fomentar ramificaciones y experimentos. Aquí hay una cita de la reciente entrada de Bliki de Martin Fowlers en Version Control Tools , que ha encontrado una descripción muy concisa para este fenómeno.
DVCS fomenta la ramificación rápida para la experimentación. Puede hacer ramas en Subversion, pero el hecho de que sean visibles para todos desanima a las personas a abrir una sucursal para trabajos experimentales. De manera similar, un DVCS fomenta el chequeo del trabajo: la realización de cambios incompletos, que incluso pueden no compilar o pasar las pruebas, a su repositorio local. De nuevo, podría hacer esto en una sucursal de desarrolladores en Subversion, pero el hecho de que dichas sucursales estén en el espacio compartido hace que las personas tengan menos posibilidades de hacerlo.
Los DVCS permiten flujos de trabajo flexibles porque proporcionan un seguimiento del conjunto de cambios a través de identificadores únicos globales en un gráfico acíclico dirigido (DAG) en lugar de simples diferencias textuales. Esto les permite realizar un seguimiento transparente del origen y el historial de un conjunto de cambios, lo que puede ser bastante importante.
Flujos de trabajo:
Larry Osterman (un desarrollador de Microsoft que trabaja en el equipo de Windows) tiene una excelente publicación en el blog sobre el flujo de trabajo que emplean en el equipo de Windows. Lo más notable es que tienen:
- Un tronco limpio y de alta calidad con solo código (repositorio principal)
- Todo el desarrollo ocurre en las ramas de características
- Los equipos de características tienen repos de equipo
- Con frecuencia fusionan los últimos cambios de troncales en su rama de características ( Forward Integrate )
- Las características completas deben pasar por varias puertas de calidad, por ejemplo, revisión, cobertura de prueba, preguntas y respuestas (repos por su cuenta)
- Si una característica se completa y tiene una calidad aceptable, se fusiona en el tronco ( Invertir integración )
Como puede ver, tener cada uno de estos repositorios en vivo por su cuenta puede desacoplar diferentes equipos que avanzan a diferentes ritmos. Además, la posibilidad de implementar un sistema de puerta de calidad flexible distingue a DVCS de un CVCS. Puede resolver sus problemas de permisos en este nivel también. Solo un puñado de personas debería tener acceso al repositorio maestro. Para cada nivel de la jerarquía, tenga un repo separado con las políticas de acceso correspondientes. De hecho, este enfoque puede ser muy flexible a nivel de equipo. Debes dejar que cada equipo decida si quiere compartir el repositorio de su equipo entre ellos o si quieren un enfoque más jerárquico donde solo el líder del equipo puede comprometerse con el repositorio del equipo.
(La imagen es robada del hginit.com de Joel Spolsky).
Una cosa queda por decir en este punto, a pesar de que DVCS ofrece grandes capacidades de fusión, nunca es un reemplazo para usar Integración Continua. Incluso en ese momento tiene una gran flexibilidad: CI para el repositorio troncal, CI para repos de equipo, repositorios Q & A, etc.
Mercurial en un contexto empresarial:
No quiero comenzar aquí una llamarada de git contra hg, ya estás en el camino correcto considerando cambiar a DVCS. Aquí hay un par de razones para usar Mercurial en lugar de git:
- Todas las plataformas que ejecutan python son compatibles
- Excelentes herramientas de GUI en todas las plataformas principales (win / linux / OS X), integración de primera clase de fusión / herramienta vdiff
- Interfaz muy consistente, transición fácil para usuarios de svn
- Puede hacer la mayoría de las cosas que Git puede hacer también, pero proporciona una abstracción más limpia. Las operaciones peligrosas son siempre explícitas. Las funciones avanzadas se proporcionan a través de extensiones que deben habilitarse explícitamente.
- El soporte comercial está disponible de selenic.
En resumen, cuando uso DVCS en una empresa, creo que es importante elegir una herramienta que presente la menor fricción posible. Para que la transición sea exitosa, es especialmente importante considerar las diferentes habilidades entre los desarrolladores (en lo que respecta a VCS).
Hay un par de recursos que me gustaría señalarte al final. Joel Spolsky ha escrito recientemente un artículo que derrota una gran cantidad de argumentos traídos contra DVCS. Debe mencionarse que otros han descubierto estos contraargumentos mucho antes. Otro buen recurso es el blog Eric Sinks, donde escribió un artículo sobre Obstáculos a una empresa DVCS .
En primer lugar, una discusión reciente sobre el uso de un DVCS en grandes proyectos es relevante:
Control distribuido de versiones para proyectos ENORMES: ¿es factible?
Una arruga con Mercurial es que parece estar diseñada en torno a la idea de tener un único repositorio por "proyecto".
Sí, aunque la norma con Subversion es tener un repositorio monolítico que contenga múltiples proyectos, con un DVCS es preferible tener repositorios más granulares, con uno por componente. Subversion tiene la función svn:externals
para agregar múltiples árboles fuente en el momento de la salida (que tiene sus propios problemas logísticos y técnicos). Tanto Mercurial como Git tienen una característica similar, llamada subrepos en hg.
La idea con los subrepos es que tiene un repositorio por componente, y un producto liberable (que comprende múltiples componentes reutilizables) simplemente se referirá a sus repositorios dependientes. Cuando clona el repositorio de producto, trae consigo los componentes que necesita.
¿Deberíamos tener un gran repositorio Mercurial que contenga todo? De lo contrario, ¿qué tan fino deberían ser los repositorios más pequeños? Creo que a las personas les resultará muy molesto si tienen que extraer y enviar actualizaciones de muchos lugares diferentes, pero también les resultará molesto si tienen que extraer / empujar toda la base de código de la compañía.
Sin duda es posible tener un repositorio monolítico (e incluso puedes dividirlo en la pista si es necesario). Es más probable que los problemas con este enfoque bajen para liberar schedles y cómo administrar diferentes versiones de diferentes componentes. Si tiene varios productos con sus propios programas de lanzamiento que comparten componentes comunes, probablemente sería mejor con un enfoque más granular, para facilitar la administración de la configuración.
Una advertencia es que el soporte subrepo es una característica relativamente reciente, y no es tan completa como otras características. Específicamente, no todos los comandos de hg conocen los subrepos, aunque sí lo hacen los más importantes.
Le sugiero que realice una conversión de prueba y experimente con el soporte subrepo, organizando productos y componentes dependientes, etc. Estoy en el proceso de hacer lo mismo, y este parece ser el camino a seguir.