tag - tipos de etiquetas en git
¿Cómo determino programáticamente si hay cambios no confirmados? (7)
En un Makefile, me gustaría realizar ciertas acciones si hay cambios no confirmados (en el árbol de trabajo o en el índice). ¿Cuál es la forma más limpia y más eficiente de hacer eso? Un comando que sale con un valor de retorno de cero en un caso y distinto de cero en el otro se adecuaría a mis propósitos.
Puedo ejecutar el git status
y canalizar la salida a través de grep
, pero siento que debe haber una mejor manera.
Ampliando la respuesta de @ Nepthar:
if [[ -z $(git status -s) ]]
then
echo "tree is clean"
else
echo "tree is dirty, please commit changes before running this"
exit
fi
Como se señaló en otra respuesta, tan simple como dicho comando es suficiente:
git diff-index --quiet HEAD --
Si omite los dos últimos guiones, el comando fallará si tiene un archivo llamado HEAD
.
Ejemplo:
#!/bin/bash
set -e
echo -n "Checking if there are uncommited changes... "
trap ''echo -e "/033[0;31mFAILED/033[0m"'' ERR
git diff-index --quiet HEAD --
trap - ERR
echo -e "/033[0;32mAll set!/033[0m"
# continue as planned...
Palabra de advertencia: este comando ignora los archivos sin seguimiento.
Con Python y GitPython:
git.Repo(path).is_dirty(untracked_files=True)
Devuelve True si el repositorio no está limpio
Esta es la mejor y más limpia manera.
function git_dirty {
text=$(git status)
changed_text="Changes to be committed"
untracked_files="Untracked files"
dirty=false
if [[ ${text} = *"$changed_text"* ]];then
dirty=true
fi
if [[ ${text} = *"$untracked_files"* ]];then
dirty=true
fi
echo $dirty
}
Mientras que las otras soluciones son muy completas, si quieres algo realmente rápido y sucio, prueba algo como esto:
[[ -z $(git status -s) ]]
Solo comprueba si hay algún resultado en el resumen de estado.
git diff --exit-code
devolverá distinto de cero si hay algún cambio; git diff --quiet
es lo mismo sin salida. Como quiera verificar el árbol de trabajo y el índice, use
git diff --quiet && git diff --cached --quiet
O
git diff --quiet HEAD
Cualquiera de los dos le dirá si hay cambios no confirmados que están organizados o no.
ACTUALIZACIÓN : el OP señala en los comentarios que este comando simple git diff-index
funcionó para él:
git diff-index --quiet HEAD --
A continuación, puede ver " Cómo verificar si un comando fue exitoso " si lo está usando en un script bash:
git diff-index --quiet HEAD -- || echo "untracked"; // do something about it
Nota: como commented Anthony Sottile
git diff-index HEAD ...
fallará en una rama que no tenga commits (como un repositorio recién inicializado).
Una solución que he encontrado esgit diff-index $(git write-tree) ...
"Programáticamente" significa que nunca confíes en los comandos de porcelana .
Siempre confíe en los comandos de plomería .
Consulte también " Buscar un índice sucio o archivos sin seguimiento con Git " para ver las alternativas (como git status --porcelain
)
Puede inspirarse en la nueva " función require_clean_work_tree
" que se escribe mientras hablamos ;) (principios de octubre de 2010)
require_clean_work_tree () {
# Update the index
git update-index -q --ignore-submodules --refresh
err=0
# Disallow unstaged changes in the working tree
if ! git diff-files --quiet --ignore-submodules --
then
echo >&2 "cannot $1: you have unstaged changes."
git diff-files --name-status -r --ignore-submodules -- >&2
err=1
fi
# Disallow uncommitted changes in the index
if ! git diff-index --cached --quiet HEAD --ignore-submodules --
then
echo >&2 "cannot $1: your index contains uncommitted changes."
git diff-index --cached --name-status -r --ignore-submodules HEAD -- >&2
err=1
fi
if [ $err = 1 ]
then
echo >&2 "Please commit or stash them."
exit 1
fi
}