Parece como 2 escenarios diferentes se mezclan en esta discusión:
Escenario 1
El uso de mi padre repo de punteros a submódulos, quiero ver la confirmación en cada submódulo, que el padre repo que apunta, posiblemente después de la primera iteración a través de todos los submódulos y la actualización y/o extracción de estos remoto.
Este es, como se ha señalado, hecho con
git submodule foreach git pull origin BRANCH
git submodule update
El escenario 2, que creo que es lo que OP es el objetivo en
Lo nuevo que ha sucedido en 1 o más submódulos, y quiero 1) tire de estos cambios, y 2) la actualización de los padres de repo para que apunte a la HEAD (el más reciente) confirmación de este/estos submódulos.
Esto se haría por
git submodule foreach git pull origin BRANCH
git add module_1_name
git add module_2_name
......
git add module_n_name
git push origin BRANCH
No es muy práctico, ya que tendría que codificar n rutas a todos los n submódulos en, por ejemplo, un script de actualización de los padres de repos a comprometer a los punteros.
Lo que estaría bien sería para un sistema automatizado de iteración a través de cada submódulo, la actualización de los padres de los repos de puntero (usando git add) para que apunte a la cabeza de la submódulo(s).
Para esto, he hecho esta pequeña bash-script:
git-update-submodules.sh
#!/bin/bash
APP_PATH=$1
shift
if [ -z $APP_PATH ]; then
echo "Missing 1st argument: should be path to folder of a git repo";
exit 1;
fi
BRANCH=$1
shift
if [ -z $BRANCH ]; then
echo "Missing 2nd argument (branch name)";
exit 1;
fi
echo "Working in: $APP_PATH"
cd $APP_PATH
git checkout $BRANCH && git pull --ff origin $BRANCH
git submodule sync
git submodule init
git submodule update
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"
for i in $(git submodule foreach --quiet 'echo $path')
do
echo "Adding $i to root repo"
git add "$i"
done
git commit -m "Updated $BRANCH branch of deployment repo to point to latest head of submodules"
git push origin $BRANCH
Para ejecutarlo, ejecutar
git-update-submodules.sh /path/to/base/repo BRANCH_NAME
Elaboración
Primero de todo, supongo que la rama con el nombre $RAMA (2ª argumento) existe en todos los repos. Siéntase libre de hacer esto aún más complejo.
Primero un par de secciones es la de algunos, la comprobación de que los argumentos están ahí. Luego me tire el padre de repo del material más reciente (yo prefiero usar --ff (avance rápido) cuando solo estoy haciendo tira. He de reajuste fuera, por cierto).
git checkout $BRANCH && git pull --ff origin $BRANCH
A continuación, algunos submódulo inicialización, puede ser necesario, si la nueva submódulos se han añadido o no se inicializó aún:
git submodule sync
git submodule init
git submodule update
Entonces puedo actualizar/tirar todos los submódulos:
git submodule foreach "(git checkout $BRANCH && git pull --ff origin $BRANCH && git push origin $BRANCH) || true"
Aviso un par de cosas: Primero de todo, yo soy el encadenamiento de algunos comandos usando git &&
- significado comando anterior debe ejecutar w/o error.
Después de un posible éxito de la extracción (si el nuevo material fue encontrado en el mando a distancia), tengo que hacer un esfuerzo para garantizar que una combinación posible de confirmación no se queda atrás en el cliente. De nuevo, sólo sucede si un tirón en realidad trajo cosas nuevas.
Por último, el final || true
está asegurando que el guión sigue en errores. Para realizar este trabajo, todo en la iteración debe ser envuelto en las comillas dobles y el git-comandos están envueltos en parantheses (precedencia de operadores).
Mi parte favorita:
for i in $(git submodule foreach --quiet 'echo $path')
do
echo "Adding $i to root repo"
git add "$i"
done
Recorrer todos los submódulos - con --quiet
, lo que elimina los 'Entrar MODULE_PATH' de salida. Utilizando 'echo $path'
(debe ser en una sola cita), la ruta de acceso al submódulo se presenta por escrito a la salida.
Esta lista de relativa submódulo de los caminos es capturado en una matriz ($(...)
) - finalmente recorrer en esto y git add $i
para la actualización de los padres de repos.
Finalmente, una confirmación con un mensaje explicando que el padre de repos fue actualizado. Este commit será ignorado por defecto, si no se ha hecho nada. Pulse este origen, y listo.
Tengo un script que se ejecuta esta en una jenkins-trabajo, que se encadena a una automática programada después de la implementación, y funciona como un encanto.
Espero que esto le sea de ayuda a alguien.