2009-06-15 12 views
20

¿Alguien está usando la nueva función git super/subproject en proyectos reales? ¿Qué tan bien funciona? Por ejemplo, entiendo que si presiono para un subproyecto tengo que llamar manualmente los ganchos de superproyectos (¿tal vez usando el gancho de los subproyectos, pero de todos modos)?¿Alguien realmente está usando git super/subprojects?

+4

¿Es un subproyecto lo mismo que un submódulo? Los he usado. – Apreche

Respuesta

11

Al usar un submódulo, está definiendo en su espacio de trabajo Git (es decir, su repositorio Git "superproyecto") una configuración .
Por "configuración", quiero decir "la lista de etiquetas o el nodo SHA-1 necesario para trabajar en su área de trabajo".
(y por trabajo, me refiero a cualquier "esfuerzo de desarrollo" que esté haciendo dentro de su espacio de trabajo: compilación clásica, o parche, o combinación, o implementación, o ...).
Ese es el caso cuando su están clonación de un super-proyecto y "git update" sus submódulos: usted está checkouting el SHA1 repos exacta que se ha comprometido previamente en la super-proyecto (registrado como gitlink en the index).

El otro modo es cuando está trabajando en su superproyecto y en uno o más submódulos.
Eso significa que, para un determinado submódulo, ha comprobado una rama específica (ya no está utilizando un HEAD separado para el contenido de esos submódulos, sino más bien un puntero a la punta de una rama).
Luego, "presionar un submódulo" significa actualizar un repositorio distante que contiene ese submódulo (y solo ese).

El truco real en ese último escenario (que podría merecer un gancho si lo desea) es cuando está impulsando el superproyecto: debe asegurarse de haber empujado primero todos sus submódulos.

Desde el submodule tutorial:

siempre publican el cambio submódulo antes de publicar el cambio en el SuperProject que hace referencia a ella. Si se olvida de publicar el cambio submódulo, otros no serán capaces de clonar el repositorio (de la super-proyecto)

no se le olvida can configure a submodule to follow a branch.

+5

Esto suena como una versión alfa de los submódulos, demasiadas complicaciones ...: S – inf3rno

3

Si quiere decir submódulos, entonces ciertamente.

Los submódulos no y no deben saber dónde se usan. Por ejemplo, tengo un submódulo que se usa en varios proyectos que conozco (y posiblemente varios que yo no conozco).

Al presionar un submódulo no afecta de ninguna manera la versión del código utilizado por el proyecto que contiene el submódulo, por lo que no estoy seguro de qué querría que hiciera un gancho de todos modos.

+0

Si, por ejemplo, el submódulo es solo parte de un sw más grande, podría querer compilar todo el paquete cuando alguien lo presione. – Makis

+0

Te faltan ambos puntos. 1) Cambiar el submódulo no cambia ningún proyecto que lo contenga. En absoluto. Una nueva construcción sería idéntica a la versión anterior. 2) Un determinado submódulo puede ser utilizado por miles de aplicaciones y no puede saber lo que son. – Dustin

+0

Por supuesto, el módulo podría ser utilizado por diferentes aplicaciones pero, por supuesto, el proyecto principal tendría el script de construcción que incluye el módulo. No entiendo esto "en absoluto": si tengo un proyecto con dos submódulos y alguien envía sus cambios a uno de los submódulos, ¿cómo es que el submódulo no cambia? Si cambia y tengo un script de compilación que incluye ese submódulo, entonces, por supuesto, la compilación es diferente. – Makis

11

FWIW, estamos tratando de dar el salto a git, y nuestro proyecto (bitweaver, un sistema de gestión de contenido) es un sistema altamente modular, con nearly 160 repositories). Una "compilación" generalmente contiene dos docenas o más sub-repositorios. Usamos 'módulos virtuales' en CVS, y esto funcionó fantásticamente para nosotros, sin embargo, CVS tiene sus propias limitaciones para las asignaciones de etapas.

Los submódulos de Git tienen algunas limitaciones severas, y definitivamente debe evaluar la implementación de mercurial ya que es ciertamente más amigable y flexible para proyectos externos/modulares (es decir, es compatible con otros sistemas VCS, incluso HgGit).

Éstos son los mayores retos:

  1. Cada submódulo es difícil vinculado a un en particular cuando se cometan "submódulo git add" en el super-repositorio. Esto es por diseño , y buscado como un beneficio por git mantenedores, por lo que no esperaría que cambie pronto. Esto es doloroso en un sistema como el nuestro donde commit's siempre están sucediendo en los submódulos . Debe actualizar el superproyecto para mantenerse al día, o actualizar sus sub-repos para master después de la actualización del submódulo inicial . (vea supergit abajo para nuestra solución).

  2. No se puede comprometer y presionar fácilmente a todos los sub-repositorios desde la raíz. Esto también es muy molesto, vea supergig abajo.

  3. Varios gotchas que pueden ser insoportables, especialmente cosas que "sobrescriben silenciosamente los cambios".

supergit

Hemos escrito un shell script call supergit que se ocupa de algunos de lo dolorosos. Hace el clon, el submódulo init, la actualización y el maestro de pago, todo de una sola vez. También realizará comandos git a todos los directorios en el superrepo de forma individual (tipo de procesamiento de git a granel).

HTH, buena suerte.

+0

+1 esta es una buena descripción de los pros y los contras. Para su información, para las confirmaciones codificadas, se espera que sea útil en los casos en que los submódulos rara vez (o manualmente) se actualizan a versiones conocidas y buenas (por ejemplo, etiquetas de producción), por lo que funciona muy bien en ese caso. – ashes999

Cuestiones relacionadas