Hay algunos scripts que no funcionan correctamente si verifican los cambios.
Lo intenté así:
VN=$(git describe --abbrev=7 HEAD 2>/dev/null)
git update-index -q --refresh
CHANGED=$(git diff-index --name-only HEAD --)
if [ ! -z $CHANGED ];
then VN="$VN-mod"
fi
¿Hay algún tipo de verificación booleana si ha habido cambios desde la última confirmación, o cómo puedo probar realmente si hay nuevos cambios en mi repositorio local?
Estoy haciendo todo esto para un script de creación de versión (que encontré en algún lugar aquí).
git status
?Respuestas:
Lo que estás haciendo casi funcionará: deberías citar
$CHANGED
en caso de que esté vacío y realizar-z
pruebas de vacío, lo que significa que no hay cambios. Lo que quisiste decir fue:Una cita de Git's
GIT-VERSION-GEN
:Parece que estaba copiando eso, pero acaba de olvidar ese detalle de la cita.
Por supuesto, también podrías hacer esto:
O si solo le importa el caso "algo ha cambiado":
El uso
--quiet
tiene el beneficio de que Git puede detener el procesamiento tan pronto como encuentre un único diferencial, por lo que es posible que no tenga que verificar todo su árbol de trabajo.fuente
git diff --no-ext-diff --quiet --exit-code
para determinar el estado sucio.--no-ext-diff
opción es buena para la seguridad (en caso de que alguien haya configurado un controlador externo diff), aunque--exit-code
no debería ser necesario, ya que está implícito en--quiet
.git diff-index
informa los cambios incluso si solo han cambiado los tiempos de modificación del archivo (y no su contenido). Si tienetouch
un archivo, informará la modificación quegit status
se reiniciará en ejecución . Usargit status
como a continuación es mejor.Utilizando
git status
:fuente
git status --porcelain --untracked-files=no
]]; entoncesif [[ $(git status --porcelain | wc -l) -gt 0 ]]; then echo CHANGED else echo NOT CHANGED locally fi
git status --porcelain
ver si la salida no está vacía. Si es así, eso significa que hay cambios presentes.Aunque la respuesta de Jefromi es buena, estoy publicando esto solo como referencia.
Desde el código fuente de Git hay un
sh
script que incluye lo siguiente.fuente
$1
es una cadena que nombra una tarea que desea ejecutar y$2
es una cadena que opcionalmente contiene un mensaje de error personalizado en caso de falla. Por ejemplo, llámalo comorequire_clean_work_tree deploy "Skipping deploy, clean up your work tree or run dev-push"
Tuve un problema similar, pero también tuve que buscar archivos agregados. Entonces hice lo siguiente:
fuente
git status
es tu amigoCambie al directorio Git para
git status
trabajar:Establezca una variable para establecer el árbol de trabajo para que no obtenga el error 'Esta operación debe ejecutarse en un árbol de trabajo':
Capture la
git status
salida en una variable BashUso
--porcelain
que garantiza estar en un formato estándar y analizable:Si -n (no es nulo), tenemos cambios.
fuente
Esto también funciona:
fuente
Esto funciona muy bien. También enumerará los archivos afectados:
fuente
git diff --no-ext-diff --quiet --exit-code
también hace el trabajo.Aquí hay un buen conjunto de funciones de script Bash que verifican si hay una diferencia, la imprime al usuario y le pregunta si desea confirmar los cambios antes de la implementación. Está construido para una aplicación Heroku y Python, pero necesita pocos cambios para cualquier otra aplicación.
Puede copiar desde Gists en: https://gist.github.com/sshadmand/f33afe7c9071bb725105
fuente
La pregunta del OP tiene más de 9 años. No sé lo que
man git-status
dijo entonces, pero esto es lo que dice ahora:Esto sugiere que el
--porcelain
argumento es muy adecuado para probar el estado de un repositorio de cambios.Wrt la pregunta del OP, "¿Hay algún tipo de verificación booleana si ha habido cambios desde la última confirmación, o cómo puedo realmente probar si hay nuevos cambios en mi repositorio local?"
No creo que
bash
tenga tipos de datos booleanos per se , pero esto puede estar lo suficientemente cerca:Esto se puede volver a emitir como un
if-then-else
formulario para una secuencia de comandos, o ejecutar como está desde la CLI mientras está en la carpeta git repo . De lo contrario, use la-C
opción con una especificación de ruta al repositorio de interés:Apéndice:
-u, --untracked-file
opción para evitar informar el estado de los archivos que uno desea ignorar. Tenga en cuenta que esto tiene un efecto secundario desafortunado : los archivos que se agregan recientemente tampoco tienen estado. La opción es útil en algunas situaciones , pero considérela cuidadosamente antes de usarla.fuente
Así es como lo hago ...
fuente
pegar esto
correr
sh checker_git.sh gitpath
fuente
Basado en el comentario de @ storm_m2138 a la respuesta de @ RyanMoon ( enlace ) Estoy usando lo siguiente en
Powershell
.fuente