2011-01-15 12 views
7

Soy nuevo en los submódulos de git, y veo que siempre se refieren a confirmaciones específicas.Submódulos de Git en el maestro

Hay una forma de que los submódulos de un superproyecto siempre hagan referencia al encabezado de la rama maestra, por lo que "git submodule update" o "git pull" en el superproyecto simplemente "git pull" en todos los submódulos.

Gracias.

+0

http://gitref.org/ la página de referencia de Git es una buena manera de comenzar si eres nuevo en git. –

+1

@Saher: Esta es una pregunta muy específica, no solo una general "Soy nuevo en git". – Cascabel

+0

Creo que la respuesta es no. Git almacena el nombre de confirmación cuando registra la información del submódulo, y en mi caso he escrito un conjunto de scripts para extraer, agregar, comprometer y enviar que hace exactamente lo que quiero que haga con los submódulos. – sinelaw

Respuesta

11

La respuesta corta es no. La idea es que usted esté seguro de que un compromiso específico del submódulo funcionará con su proyecto, y no querrá ningún comportamiento indefinido o inesperado al obtener actualizaciones sobre la marcha. Un submódulo se representa directamente por dos cosas: una entrada en .gitmodules y un gitlink, que es una referencia al SHA1 de la confirmación deseada del submódulo. SHA1, no refname

Lo que estás preguntando es realmente para que el superproyecto tenga no idea que hay en el submódulo. Piénselo: diferentes clones de su proyecto podrían haber actualizado el submódulo en diferentes momentos, y terminar allí con diferentes versiones de él, y luego, si se hicieron commits en su proyecto, tendrían que registrar diferentes commits en el submódulo. Cuando te fusionaste, tendrías que simplemente ignorar lo que ambos dicen y tirar de nuevo, probablemente. El resultado es que su solicitud evita la idea completa de los submódulos: saber lo que tiene. Si dices que estás usando "maestro", ¡volverías dentro de dos meses y no tienes idea de lo que eso significaba!

Si desea obtener siempre la rama principal actual, será mejor que lo haga usted mismo. Escriba una secuencia de comandos para extraer todos los submódulos y ejecútelo de vez en cuando, confirmando las versiones actualizadas. (¡Sin embargo, prueba primero!) El punto aquí es que con los submódulos, por cada compromiso de superproyectos, debes saber exactamente qué versión del subproyecto estás usando. Es su elección la frecuencia con la que desea actualizar la versión del submódulo; puede ser diariamente si lo desea.

La alternativa sería agregar el directorio (s) para los submódulo (s) a su gitignore, y escribir un pequeño script rápido para actualizarlos (y probablemente uno para clonarlos también). Esto le costaría la capacidad de saber qué versión tenía en algún momento del pasado.

+0

Aptly put, como siempre. +1 – VonC

+0

Gracias muy claro - es hora de sacar las habilidades de scripting ... – Sam

+1

@Jefromi: Tal vez podrías actualizar tu respuesta ya que es posible en git ahora? Ver la respuesta de VonC – Onur

10

actualización de 2013, ya que Git 1.8.2, un submódulo puede seguir una rama (y no sólo hacer referencia a un fijo cometer)

Ver "git submodule tracking latest".


(Respuesta original enero de 2011)

Esa es una de las differences between git submodules and (for instance) svn:externals.

Se supone que un submódulo es un conjunto de archivos con un ciclo de vida diferente, desde el que selecciona una confirmación específica para trabajar en su propio proyecto (el repositorio principal).
Si ese submódulo publica una nueva confirmación, no debería necesitar interrumpirlo todo, porque de repente su proyecto ya no compila debido a las últimas evoluciones de dicho submódulo.

Si, por otro lado, los dos conjuntos de archivos están tan estrechamente relacionados que modificar algo en uno significa actualizar el otro, entonces deberían ser realmente parte de * un repositorio.

Cuestiones relacionadas