Analizar la salida de git status
es 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 status
no cambia cuando hay cambios no confirmados. Sin embargo, proporciona la --porcelain
opción, que hace que la salida git status --porcelain
se 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 --porcelain
como 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=no
opció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 status
fallas 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 status
no proporciona un código de salida significativo cuando el directorio de trabajo no está limpio, git diff
proporciona la --exit-code
opción, que hace que se comporte de manera similar a la utilidad diff , es decir, salir con el estado 1
cuando hubo diferencias y 0
cuando 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 diff
puede 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 --porcelain
es probablemente la mejor opción.