2011-07-15 5 views
9

En mi organización, nos gustaría cambiar de usar CVS a Mercurial por una variedad de razones. Hemos investigado mucho al tratar de determinar cómo debemos organizar nuestros repositorios de Hg en función de lo que tenemos en nuestra base de código y cómo trabajamos. Hemos obtenido respuestas satisfactorias para la mayoría de nuestras preguntas, pero hay un punto que nos está afectando un poco, y me está volviendo loco porque la forma más conveniente de organizar el repositorio para nuestro flujo de trabajo parece ser la forma incorrecta de hacerlo. un punto de vista conceptual. Estoy tratando de averiguar si nuestra percepción de cómo se supone que "se supone" funciona es incorrecta, o si estamos simplemente tropezando con una brecha de características legítima en las herramientas disponibles.Recuperaciones monolíticas frente a múltiples Mercurial para módulos dentro de un conjunto de aplicaciones relacionadas

Principalmente mantenemos una base de código de tamaño mediano que consiste en un conjunto de aplicaciones que obtienen todo liberado en el mismo paquete. Conceptualmente se puede dividir nuestro código en tres categorías:

  1. de código compartido
  2. código
  3. Solicitud de nuestra suite principal (utiliza el código compartido)
  4. pequeñas utilidades Varios que se mantienen con poca frecuencia (utiliza el código compartido)

Esto no me parece inusual, pero quiero enfatizar el hecho de que mantenemos el código de la aplicación y el código compartido al mismo tiempo y siempre queremos que estén a la última. Es decir, queremos que todas nuestras compilaciones de aplicaciones utilicen siempre la última versión y la misma versión del código compartido. Con frecuencia agregamos o modificamos el código de la aplicación y el código compartido al mismo tiempo. Actualmente, el código compartido está en un módulo CVS, y las aplicaciones están todas en sus propios módulos separados. El código compartido y los módulos de la aplicación están desprotegidos de manera que el código compartido se genera una vez y luego se vincula a cada aplicación. Frecuentemente hacemos cvs commits que incluyen cambios a través de módulos compartidos y de aplicaciones a la vez. Realmente nos gustaría mantener esa habilidad.

Entiendo que los commits en Hg son atómicos dentro de los repositorios, está bien, pero me gustaría ser capaz de diferenciar y comprometerme con una aplicación y una biblioteca compartida al mismo tiempo (es decir, no me importa) si es realmente atómico, pero no quiero tener que hacer manualmente dos diffs separados y dos acciones de commit separadas).

Conceptualmente, parece que sería correcto tener uno o unos repositorios para el código compartido, y un repositorio por separado para cada aplicación y cada pequeño programa de utilidad. Esto significa que deberías verificar múltiples repositorios para cada compilación, pero eso no es un problema para nosotros. El problema es que no parece haber ninguna herramienta que le permita ver las actualizaciones o los cambios en varios repositorios a la vez, o diferir varios repositorios a la vez y luego enviarlos secuencialmente por usted. Esto sería fácil de realizar, pero eso no ayudaría a los desarrolladores que desean usar varias interfaces GUI para complementar la línea de comando.

Parece que con el fin de ser capaz de comprometerse a través de múltiples bases de código a la vez (desde la perspectiva del usuario) y mantener todo en la punta de lanza en conjunto, las dos únicas soluciones son:

  1. Usar un acuerdo de recompra monolítica con TODO en ella.
  2. Crea algunos subrepos pero accede/confirma todo a través de un gran repositorio "principal" monolítico que contiene todos los subrepos para mantener todo en las últimas revisiones (que no me parece mejor que (1)).

No puede ser tan inusual querer trabajar con múltiples repositorios "pares" al mismo tiempo, incluso si las acciones no son realmente atómicas en todos ellos, y sin embargo, no estoy encontrando toneladas de artículos o publicaciones clamando por esta habilidad.

En resumen:

  1. Nos gustaría organizar nuestro código de tal manera que podemos ver diferencias y comprometerse código de la aplicación y el código compartido al mismo tiempo, desde la perspectiva del usuario (que no necesitan realmente ser atómica).
  2. Parece que deberíamos poner código de aplicación y código compartido en repositorios separados.
  3. Subrepositorios vinculan repositorios principales a revisiones específicas, que no queremos.

¿Qué es lo que falta aquí?

+0

¿Cuál es su argumento en contra de tener un gran repositorio con todo lo que contiene? Si todo el código está relacionado y debe mantenerse sincronizado entre sí, ¿por qué no hacer eso? – jwd

+0

¿Puede darnos una idea de "mediano"? ¿Tal vez un tamaño total aproximado de todos los archivos fuente en la suite? Además, el n. ° 3 en su resumen no me es claro: ¿qué quiere decir con "empate" y por qué no lo quiere? –

+0

Mi argumento más convincente en contra de tener un gran repositorio con todo lo que contiene es que si quisiéramos compartir el código con otros departamentos a través del repositorio, tendríamos que darles acceso a todo el código. No necesariamente es un factor decisivo, pero no excelente. – rationull

Respuesta

1

En mi tienda, tenemos muchos proyectos que están simplemente en repositorios separados, pero el repositorio de la aplicación principal tiene otros 2 proyectos en él. Uno es un módulo que comparte una cantidad significativa de código con la aplicación principal, y el otro es para migraciones de bases de datos para la aplicación (incluso en un idioma diferente). Quería que los cambios relacionados tanto en la aplicación como en el migrador se cometieran juntos, de forma inseparable. En total, todos los archivos fuente en este repositorio tienen entre 10 y 11 MB.

Así que si poner todo en un repositorio es realmente lo que tiene sentido porque no quiere tratar con subrepositorios, entonces no hay nada de malo en poner todo en un repositorio. El mío es del lado pequeño del medio, en mi opinión. La fuente de TortoiseHg es de alrededor de 20 MB, OGRE tiene más de 100 MB.

Sin saber más acerca de sus proyectos y sus relaciones, la impresión que tengo es que un único repositorio funcionaría bien y que no está mirando esto incorrectamente.

Si cambia de opinión, hg convert puede ayudarlo a extraer proyectos en su propio repositorio, manteniendo el historial de esos archivos.

Si el enfoque de un solo repositorio no es para usted, entonces creo subrepos se debe dar una oportunidad, ya que es el único otro método que conozco para el tratamiento de múltiples repositorios cohesiva que se apoya en TortoiseHg (véase la sección Recommendations)

Sin embargo, no estoy seguro de cómo se manejaría el acceso entre departamentos, dado que no parece que exista un subconjunto ya establecido compartido con otros.

+0

Gracias. Para ser claros, el problema de acceso entre departamentos es más teórico que práctico para nosotros en este punto, así que podemos cruzar ese puente cuando lleguemos a él. – rationull

+0

El tema general que estoy extrayendo de esta respuesta es que si una organización desea que un grupo de código evolucione conjuntamente (no en varios grupos independientes), ese grupo de código debe estar junto en un repositorio. O, como corolario, si desea separar proyectos en múltiples repositorios, entonces su flujo de trabajo debería permitirles evolucionar independientemente o controlar esa evolución. ¿Esto suena correcto? ¿Otros están de acuerdo con esta respuesta? – rationull

+0

Sí, eso me parece correcto, dadas las herramientas conocidas (los subrepos son una especie de híbrido). En cuanto al acuerdo, considere el estado de toda esta sesión de preguntas y respuestas: 5 votos positivos y 5 favoritos a su pregunta; 0 upvotes a mi respuesta; 0 otras respuestas. Interpreto que esto significa que estoy jugando al Capitán Obvio, indicando lo que está disponible (nada perspicaz o nuevo), mientras que algunos quieren mejores herramientas para poder hacer lo que describes, pero nadie parece tener esas herramientas. –

Cuestiones relacionadas