¿Qué agregar al "estado de git –porcelain" para que se comporte como "estado de git"?

Una pregunta anterior dio como resultado algunas ideas sobre cómo verificar si su repo de Git contiene un índice sucio o files sin seguimiento. La respuesta que adopté de esa discusión fue la siguiente:

#!/bin/sh exit $(git status --porcelain | wc -l) 

La idea detrás de esa respuesta era emular lo que el progtwigdor haría: ejecutar el git status y luego examinar la salida.

Desafortunadamente, el git status --porcelain y git status no hacen exactamente lo mismo. En particular, el git status informará sobre cambios no realizados, mientras que el git status --porcelain no. Aquí hay un ejemplo

 [jarmo@localhost math-hl]$ git status --porcelain [jarmo@localhost math-hl]$ git status # On branch master # Your branch is ahead of 'origin/master' by 1 commit. # (use "git push" to publish your local commits) # nothing to commit, working directory clean 

Así que mi pregunta es: ¿qué debo agregar al guión original para identificar también cuándo el repository tiene cambios no utilizados? En particular, ¿sería este un enfoque correcto?

 #!/bin/bash if [ $(git status --porcelain | wc -l) != "0" \ -o $(git log @{u}.. | wc -l) != "0" ]; then echo "local repo is not clean" 

¿Estaría bien, a la larga, confiar en el git log , o debería usar un command de "fontanería" en su lugar?

La idea en los scripts de git es usar siempre:

  • commands de "plomería" de bajo nivel ,
  • o commands de porcelana con opciones de fontanería

Consulte " ¿Qué significa el término porcelana en Git? ".
Como explico, la opción --porcelain es, lamentablemente (porque su nomenclatura es confusa), la forma de "fontanería" para get un estado, que es la manera "confiable", lo que significa que su formatting no cambiará con el time, lo cual es por qué es el command recomendado para scripting.

Para git log , es mejor usar git rev-list :

 git rev-list HEAD@{upstream}..HEAD 

Consulte " ¿Cómo saber si el repository de git tiene cambios que no se han sincronizado con el server (origen)? "

Nota: git status --porcelain acaba de hacerse un poco más confiable con commit 7a76c28 , para git 1.9.2 (abril de 2014), por Matthieu Moy moy )

deshabilitar la traducción cuando se usa – porcelana

" git status --branch --porcelain " muestra el estado de la twig (adelante, atrás, fuera) y usa gettext para traducir la cadena.

Use cadenas codificadas cuando se usa --porcelain , pero conserve la traducción gettext para " git status --short ", que es esencialmente el mismo, pero para ser leído por un humano.

Eso significa git status --porcelain sigue mostrando un resultado diferente al git status , esta vez debido a la falta de traducción.
Pero ese resultado ahora es siempre el mismo (independientemente del LOCALE usado para la traducción, ya que dicha traducción ahora está desactivada por la opción --porcelain )


Y el git status --porcelain se mejora nuevamente en Git 2.13 (Q2 2017)

Se supone que el " git status --porcelain " da un resultado estable, pero algunas cadenas quedaron como traducibles por error.

Ver commit b9e2bc5 (14 Mar 2017) por Michael J Gruber ( mjg ) .
(Fusionada por Junio ​​C Hamano – gitster – en commit 58e9773 , 17 mar 2017)

Asegúrate de que las dos strings restantes (confirmación inicial, cabeza separada) también sean estables.