2011-06-24 9 views
35

me gusta mucho este comando para ir a buscar un acuerdo de recompra de cartuchos:¿Cómo git clone --recursive y checkout master en todos los submódulos en una sola línea?

git clone [email protected]:my_user/my_repo.git --recursive 

Sin embargo, los submódulos se ajustan a "ninguna rama" cuando llegan, y tengo que checkout master manualmente en todos y cada uno. ¿Hay alguna manera de extraer submódulos recursivamente y establecer automáticamente la rama en el maestro?

Respuesta

5

Quizás debería considerar gitslave como una alternativa a git-submodule, dependiendo de su flujo de trabajo de desarrollo puede ser mejor (o peor). Específicamente para su problema, gitslave mantiene a todos los miembros del superproyecto en la misma bifurcación (sin comandos específicos de git (no gitslave) para hacer lo contrario, e incluso entonces muchos comandos le advierten cuando se encuentra en ramas diferentes).

Gitslave es útil cuando controlas y desarrollas en los subproyectos más o menos al mismo tiempo que el superproyecto, y además cuando normalmente quieres etiquetar, ramificar, empujar, tirar, etc. todos los repositorios al mismo tiempo.

git-submodule es mejor cuando no se controlan los subproyectos o más específicamente se desea arreglar el subproyecto en una revisión específica incluso cuando el subproyecto cambia.

+0

es posible especificar qué módulos necesita ser sincronizado y el que no lo hace ? es decir, excluir algunos submódulos de este comportamiento? – Savageman

+0

@Savageman: con gitslave hay varias maneras de realizar la selección de subconjuntos cuando se ejecuta un comando sobre un conjunto de esclavos: expresiones regulares, un archivo que contiene el subconjunto, etc. Con git-submodule, parece que * podría * ser capaz de hacerlo al nombrar explícitamente cada submódulo en la línea de comando, pero no lo he intentado. –

+0

Perfecto, gracias por la respuesta. – Savageman

40

¿Qué tal:

git submodule update --init --recursive 

Para inicializar todos los submódulos y submódulos dentro de submódulos. Sin embargo, no estoy seguro de si esto será de pago maestro.

+0

Gracias. ¡No tiene el maestro de compras, solo todos los submódulos! (que es exactamente lo que yo quería) –

+0

use 'git submodule foreach --recursive git checkout master' para verificar el maestro de cada submódulo – lhe

22

La pregunta es por qué ha comprobado maestro. Sus submódulos están anclados a un sha específico; esa también es la razón por la que los clones del submódulo se fijan a esa confirmación específica. Al no señalar un sha específico, un repositorio externo podría romper fácilmente sus compilaciones. Definitivamente no es lo que quieres. Mejor actualizar conscientemente. Las compilaciones deben ser reproducibles y lo más correctas posible.

+1

Estoy de acuerdo con eso, pero esto es realmente molesto. Si las confirmaciones específicas pertenecen a una sucursal, ¿por qué no se puede extraer el submódulo en esta sucursal en este compromiso específico? – Savageman

+4

Porque una ID de confirmación se soluciona mientras una rama se puede mover. Son dos cosas diferentes y pueden señalar dos instantáneas diferentes del submódulo. – vocaro

+0

Como un ejemplo de por qué: mi equipo y yo utilizamos un repositorio central de submódulos como una especie de _super_ repo para recopilar todos los repositorios de módulos relacionados más pequeños para construir el proyecto completo localmente. Ahorra la molestia de tener que descargar manualmente más de 15 repositorios diferentes, especialmente si desea mover su entorno a una máquina diferente, vm, etc. – Streetfights

45

Después de clonar el repositorio que contiene sus submódulos, con el siguiente comando checkout de la rama principal en todos ellos de una sola vez:

git submodule foreach --recursive git checkout master 
+0

exactamente lo que estaba buscando para actualizar los submódulos en mi vim vundle dir –

Cuestiones relacionadas