ver remotas ramas rama modificados cambiar archivos git git-status

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 / .