2012-01-12 13 views
6

Tengo un script de shell donde quiero verificar uno de mis repositorios de git. Quiero saber si ese repos tiene todo comprometido y si es empujado a master. Antes de esta prueba, hago git fetch para asegurarme de tener los últimos cambios.Comprueba que el repositorio de git local tenga todo comprometido y lo haya enviado al dominio

he encontrado la manera de comprobar si el repositorio 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 las confirmaciones locales de se envíen al dominio.

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

Respuesta

-1

De la gran respuesta de Mark Longair entendí que es posible verificar que el repositorio de git local tiene todo comprometido y presionado, pero necesita ejecutar varios comandos para hacerlo.

He escrito una pequeña secuencia de comandos que hace todo eso y escribe de una manera frién lo que ha sucedido.

$ 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 se puede utilizar código de salida para averiguar si todo está comprometida y empujado o no.

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

+0

La solución de Mark Longair y la tuya parece perder archivos no rastreados. Entonces, dependiendo de su propósito, el directorio aún puede considerarse sucio. –

+0

@ vlad-didenko tal vez no lo entiendo, pero mi solución muestra archivos sin seguimiento. Captura de pantalla: http://upload.bessarabov.ru/bessarabov/LbYgP0Daba-oJ5vCDa8Wag8a5H8.png Y el código que lo hace: https://metacpan.org/source/BESSARABV/App-IsGitSynced-1.0.0/bin/is_git_synced# L84 – bessarabov

+0

Sí, creo que soy yo no lo suficientemente claro. Los comandos "git diff --exit-code && git diff --cached --exit-code" no capturan archivos sin seguimiento. Su solución es una secuencia de comandos grande (relativamente) que difícilmente es una respuesta a la pregunta "más fácil de hacer" anterior, una pregunta que claramente requiere unos pocos comandos simples. Como alguien que vino aquí desde la búsqueda, no veo una respuesta, ya que pasar por una secuencia de comandos considerable de perl no es una (buena) respuesta. Puede ser que esté allí, pero no aquí :) –

5

Puede comprobar que todo está comprometida con:

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

En una configuración típica, en un impulso con éxito a un master en origin, la rama de seguimiento remoto origin/master se actualizará. Por lo tanto, para comprobar si se ha empujado todos los cambios, puede probar si:

git rev-parse --verify master 

... es lo mismo que:

git rev-parse --verify origin/master 
8

Una manera muy fácil de hacerlo sería simplemente llaman

git push -n

(la "-n" es la abreviatura de "--dry-run", lo que significa que en vez de hacer el push, en su lugar, le dirá lo que habría empujado)

Si dice "Todo actualizado", entonces ya ha llevado todo al origen.

O bien, le dará una lista 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 podría quejarse de fusiones potenciales que podrían ser causadas al presionar (esto duplica la comprobación "tiene algunos cambios" que ya está haciendo)

+1

Si está en una sucursal local, esto le da 'Todo al día'. Incluso si no se empuja nada en esta rama. – BetaRide

1

Después de un git fetch, para comprobar si hay commits locales en su rama que no han sido empujados a un mando a distancia, 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 cuenta que esto solo está comprobando los cambios, por lo que si hubiera diferentes commits con cambios idénticos en el control remoto y la rama local, es posible que este comando no lo detecte. En una secuencia de comandos, suelo canalizar esto a /dev/null y simplemente verifico el estado de retorno. Por lo tanto, asumiendo el mando a distancia es origin y su rama es master, el comando sería el siguiente:

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

Como otros han sugerido, también utilizar git diff --exit-code y git diff --cached --exit-code para comprobar si hay cambios no confirmados locales.

Cuestiones relacionadas