Analizar la salida de git statuses una mala idea porque la salida está destinada a ser legible por humanos, no legible por máquina. No hay garantía de que la salida sea la misma en futuras versiones de Git o en entornos con configuraciones diferentes.
El comentario de UVV está en el camino correcto, pero desafortunadamente el código de retorno de git statusno cambia cuando hay cambios no confirmados. Sin embargo, proporciona la --porcelainopción, que hace que la salida git status --porcelainse formatee en un formato fácil de analizar para los scripts, y se mantendrá estable en todas las versiones de Git e independientemente de la configuración del usuario.
Podemos usar la salida vacía de git status --porcelaincomo un indicador de que no hay cambios que confirmar:
if [ -z "$(git status --porcelain)" ]; then
# Working directory clean
else
# Uncommitted changes
fi
Si no nos interesan los archivos no rastreados en el directorio de trabajo, podemos usar la --untracked-files=noopción para ignorarlos:
if [ -z "$(git status --untracked-files=no --porcelain)" ]; then
# Working directory clean excluding untracked files
else
# Uncommitted changes in tracked files
fi
Para hacer esto más robusto contra las condiciones que realmente causan git statusfallas sin salida stdout, podemos refinar la verificación para:
if output=$(git status --porcelain) && [ -z "$output" ]; then
# Working directory clean
else
# Uncommitted changes
fi
También vale la pena señalar que, aunque git statusno proporciona un código de salida significativo cuando el directorio de trabajo no está limpio, git diffproporciona la --exit-codeopción, que hace que se comporte de manera similar a la utilidad diff , es decir, salir con el estado 1cuando hubo diferencias y 0cuando no se encontraron ninguno.
Con esto, podemos verificar los cambios no organizados con:
git diff --exit-code
y escenificó, pero no cometió cambios con:
git diff --cached --exit-code
Aunque git diffpuede informar sobre archivos no rastreados en submódulos a través de argumentos apropiados --ignore-submodules, desafortunadamente parece que no hay forma de que informe sobre archivos no rastreados en el directorio de trabajo real. Si los archivos no rastreados en el directorio de trabajo son relevantes, git status --porcelaines probablemente la mejor opción.