Comtesting que el repository de git local tenga todo lo que se haya comprometido y se haya esforzado por dominar

Tengo un script de shell donde quiero verificar uno de mis repositorys git. Quiero saber si ese repos tiene todo comprometido y si es empujado a dominar. Antes de esta testing, hago git fetch para asegurarme de tener los últimos cambios.

He encontrado la manera de verificar si el repository tiene algunos cambios no confirmados:

if ! git --work-tree=$HOME/git/project --git-dir=$HOME/git/project/.git diff-index --quiet HEAD --; then echo "Has some changes"; fi 

Pero esto no es lo único que necesito. También quiero asegurarme de que todas mis confirmaciones locales sean empujadas a dominar.

¿Cuál es la forma más fácil de hacerlo?

Una forma muy sencilla de hacerlo sería simplemente llamar

git push -n

(la "-n" es la abreviatura de "–dry-run", lo que significa que en lugar de hacer el push, en cambio, te dirá lo que hubiera empujado)

Si dice "Todo actualizado", ya has empujado todo al origen.

Alternativamente, le dará una list de todas las confirmaciones que aún no se han enviado al origen.

O si hay cambios en el origen que aún no ha disminuido, entonces puede quejarse de potenciales fusiones que serían causadas por presionar (esto duplica la comprobación de "tiene algunos cambios" que ya está haciendo)

Puede verificar que todo esté comprometido con:

 git diff --exit-code && git diff --cached --exit-code 

En una configuration típica, en una inserción exitosa a un master en origin , se actualizará el origin/master twig de seguimiento remoto. Entonces, para verificar si ha presionado todos sus cambios, puede probar si:

 git rev-parse --verify master 

… es lo mismo que:

 git rev-parse --verify origin/master 

Después de una git fetch , para comprobar si hay confirmaciones locales en su sucursal que no han sido enviadas a un control remoto, intente esto:

 git diff --exit-code <remote>/<branch>..<branch> 

Esto también le dirá si hay confirmaciones en el control remoto que no tiene localmente. Tenga en count que esto solo está comprobando los cambios, por lo que si hubiera diferentes commits con cambios idénticos en el control remoto y la twig local, es posible que este command no lo detecte. En una secuencia de commands, suelo canalizar esto a /dev/null y simplemente verifico el estado de retorno. Entonces, suponiendo que su control remoto es de origin y su twig es master , el command se vería así:

 git diff --exit-code origin/master..master > /dev/null 

Como otros han sugerido, también uso git diff --exit-code y git diff --cached --exit-code para verificar cambios locales no confirmados.

A partir de la gran respuesta de Mark Longair, comprendí que es posible verificar que el repository de git local tenga todo comprometido y empujado, pero debe ejecutar varios commands para hacerlo.

He escrito un pequeño guión que hace todo eso y escribe de una manera amable lo que sucedió.

 $ is_git_synced ~/git/* --only_errors Error: path '/home/bessarabov/git/Dancer' has staged changes Error: path '/home/bessarabov/git/Ubic' has some divergences with remote 'origin' 

Y también puede usar el código de salida para averiguar si todo está comprometido y pulsado o no.

Está en Github: https://github.com/bessarabov/App-IsGitSynced y en CPAN: https://metacpan.org/module/App::IsGitSynced