Submodule de actualización automática

Me gustaría actualizar automáticamente un submodule de git como parte de nuestro sistema de compilation siempre que no esté sincronizado, es decir, si la versión desprotegida no es la misma que la versión registrada en el tree.

Actualmente hago git submodule status ‹path› y verifico si el primer caracter del resultado resultante es un espacio (en synchronization) o algo más ( - para no inicializado, + para confirmación fuera de synchronization, o U para conflictos de fusión) .

¿Hay algún command más barato (en términos de time de ejecución) para get esta información? ¿Puedo quizás comparar las marcas de time de dos files elegidos adecuadamente para determinar si el submodule necesita una actualización?

No estoy seguro de que esto responda su (s) pregunta (s), pero podría servir para get su objective final:

 git submodule update --checkout [<submodule>] 

Esto revisará la versión del submodule que está almacenada en el tree, a less que el submodule ya desprotegido tenga modificaciones que entren en conflicto, en cuyo caso se cancelará.

Puede agregar esto como un gancho post-checkout para hacerlo automáticamente.

Y si le gusta vivir peligrosamente, puede usar lo siguiente para reiniciar el (los) submodule (s) antes de finalizar la compra, a fin de evitar conflictos al momento de pagar la nueva versión.

 git submodule foreach git reset --hard HEAD git submodule foreach git clean -f 

Por supuesto, eso borrará cualquier cambio que tengas en tus submodules, así que úsalo con precaución.

El command del git submodule se implementa como un script de shell, aunque requiere alguna ayuda del git submodule--helper . La línea relevante para el tema en cuestión es esta:

 git diff-files --ignore-submodules=dirty --quiet -- "$sm_path" 

Esto distingue una confirmación de coincidencia (espacio en el git submodule status ) de una diferente ( + en estado). Hay otras piezas de código que vienen antes y sirven para detectar conflictos en U (con la ayuda del git submodule--helper ) o - submodules no inicializados .

En mis experimentos, el caso de conflictos (es decir, una fusión en el repository padre tenía inputs conflictivas sobre qué compromiso utilizar para el submodule) también condujo a un estado de salida distinto de cero para el command diff-files . Sin embargo, no se informó de un repository no inicializado. Así que sugeriría los siguientes commands para verificar si un submodule está actualizado:

 test -f "$sm_path/.git" -o -d "$sm_path/.git" && \ git diff-files --ignore-submodules=dirty --quiet -- "$sm_path"