remotas - git ver archivos modificados
¿Cómo verificar si no hay nada comprometido en la rama actual? (9)
Desde el código fuente de git hay un script sh que incluye lo siguiente.
require_clean_work_tree () {
git rev-parse --verify HEAD >/dev/null || exit 1
git update-index -q --ignore-submodules --refresh
err=0
if ! git diff-files --quiet --ignore-submodules
then
echo >&2 "Cannot $1: You have unstaged changes."
err=1
fi
if ! git diff-index --cached --quiet --ignore-submodules HEAD --
then
if [ $err = 0 ]
then
echo >&2 "Cannot $1: Your index contains uncommitted changes."
else
echo >&2 "Additionally, your index contains uncommitted changes."
fi
err=1
fi
if [ $err = 1 ]
then
test -n "$2" && echo >&2 "$2"
exit 1
fi
}
Este sniplet muestra cómo es posible usar git diff-files
y git diff-index
para averiguar si hay algún cambio en los archivos previamente conocidos. Sin embargo, no le permite averiguar si se ha agregado un nuevo archivo desconocido al árbol de trabajo.
El objetivo es obtener un estado no ambiguo que pueda evaluarse en un comando de shell.
git status
pero siempre devuelve 0, incluso si hay elementos para confirmar.
git status
echo $? #this is always 0
Tengo una idea, pero creo que es una mala idea.
if [ git status | grep -i -c "[a-z]"> 2 ];
then
code for change...
else
code for nothing change...
fi
¿Cualquier otra manera?
actualizar, y ahora esta solución ver la publicación de Mark Longair
Intenté esto, pero causó un problema.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
cuando el
obtendrá algún error, [: ??: operador binario esperado
ahora, estoy mirando al hombre y pruebo el git diff.
=================== código para mi esperanza, y espero una mejor respuesta ======================
#if [ `git status | grep -i -c "$"` -lt 3 ];
# change to below code,although the above code is simple, but I think it is not strict logical
if [ `git diff --cached --exit-code HEAD^ > /dev/null && (git ls-files --other --exclude-standard --directory | grep -c -v ''/$'')` ];
then
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
exit 1
else
exit 0
fi
El valor de retorno del git status
de git status
solo le indica el código de salida del git status
de git status
, no si hay modificaciones que se comprometerán.
Si quieres una versión más legible por computadora de la salida de git status
, prueba
git status --porcelain
Consulte la descripción del git status
de git status
para obtener más información al respecto.
Uso de la muestra (la secuencia de comandos simplemente prueba si el git status --porcelain
da algún resultado, no es necesario un análisis):
if [ -n "$(git status --porcelain)" ]; then
echo "there are changes";
else
echo "no changes";
fi
Tenga en cuenta que debe citar la cadena para probar, es decir, la salida del git status --porcelain
de git status --porcelain
. Para obtener más sugerencias sobre las construcciones de prueba, consulte la guía avanzada de scripts Bash (sección de comparación de cadenas ).
Es posible combinar el git status --porcelain
con un simple grep
para realizar la prueba.
if git status --porcelain | grep .; then
echo Repo is dirty
else
echo Repo is clean
fi
Yo uso esto como un simple trazador de líneas a veces:
# pull from origin if our repo is clean
git status --porcelain | grep . || git pull origin master
Agregue -qs
a su comando grep para hacerlo silencioso.
Estoy un poco tarde en la discusión, pero si solo necesitas tener un código de salida de 0 si el git status --porcelain
no devuelve nada y! = 0 más, prueba esto:
exit $( git status --porcelain | wc -l )
Esto hará que el número de líneas sea el código de salida ...
Estoy usando esto en un script para tener:
- 0 cuando todo está limpio
1 cuando hay un archivo diff o untracked
[-z "$ (estado de git --porcelain)"]
Haría una prueba sobre esto:
git diff --quiet --cached
o esto para ser explícito:
git diff --quiet --exit-code --cached
dónde:
--exit-code
Haga que el programa salga con códigos similares a diff (1). Es decir, sale con 1 si hubo diferencias y 0 significa que no hay diferencias.
--tranquilo
Desactivar todo el resultado del programa. Implica - código de salida
No es lindo, pero funciona:
git status | grep -qF ''working directory clean'' || echo "DIRTY"
No estoy seguro de si el mensaje depende de la configuración regional, por lo que quizás coloque un LANG=C
en el frente.
Si eres como yo, quieres saber si hay:
1) cambios en los archivos existentes 2) archivos recién agregados 3) archivos eliminados
y específicamente, no quiero saber acerca de 4) archivos sin seguimiento.
Esto debería hacerlo:
git status --untracked-files=no --porcelain
Aquí está mi código bash para salir del script si el repositorio está limpio. Utiliza la versión corta de la opción de archivos sin seguimiento:
[[ -z $(git status -uno --porcelain) ]] && echo "this branch is clean, no need to push..." && kill -SIGINT $$;
Una alternativa para probar si el resultado del git status --porcelain
de git status --porcelain
está vacío es probar cada condición que le interese por separado. A uno no siempre le importa, por ejemplo, si hay archivos sin seguimiento en el resultado del git status
de git status
.
Por ejemplo, para ver si hay cambios locales sin escena, puede ver el código de retorno de:
git diff --exit-code
Para verificar si hay cambios en etapas pero no confirmados, puede usar el código de retorno de:
git diff --cached --exit-code
Finalmente, si desea saber si hay archivos sin seguimiento en su árbol de trabajo que no se ignoran, puede probar si el resultado del siguiente comando está vacío:
git ls-files --other --exclude-standard --directory
Actualización: Usted pregunta a continuación si puede cambiar ese comando para excluir los directorios en la salida. Puede excluir directorios vacíos agregando --no-empty-directory
, pero para excluir todos los directorios en ese resultado, creo que tendrá que filtrar el resultado, como con:
git ls-files --other --exclude-standard --directory | egrep -v ''/$''
La egrep
-v
a egrep
significa solo las líneas de salida que no coinciden con el patrón, y el patrón coincide con cualquier línea que termine con un /
.