El objetivo es obtener un estado inequívoco que pueda evaluarse en un comando de shell.
Lo intenté 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 forma?
actualizar con la siguiente resolución, ver la publicación de Mark Longair
Intenté esto pero causa un problema.
if [ -z $(git status --porcelain) ];
then
echo "IT IS CLEAN"
else
echo "PLEASE COMMIT YOUR CHANGE FIRST!!!"
echo git status
fi
Obtuve el siguiente error [: ??: binary operator expected
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
git
git-status
9nix00
fuente
fuente
$(git status --porcelain)
. Además, si desea poner signos de exclamación en su mensaje, deberá usar comillas simples en lugar de comillas dobles, es decir, debería serecho 'PLEASE COMMIT YOUR CHANGE FIRST!!!'
en su lugar$(git status --porcelain)
, como te dije!Respuestas:
Una alternativa para probar si la salida de
git status --porcelain
está vacía es probar cada condición que le interesa por separado. Uno no siempre se preocupa, por ejemplo, si hay archivos sin seguimiento en la salida degit status
.Por ejemplo, para ver si hay cambios locales no organizados, puede consultar el código de retorno de:
Para verificar si hay cambios que se realizan pero no se confirman, puede usar el código de retorno de:
Finalmente, si desea saber si hay archivos no rastreados en su árbol de trabajo que no se ignoran, puede probar si la salida del siguiente comando está vacía:
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 esa salida, creo que tendrá que filtrar la salida, como con:El
-v
toegrep
significa solo generar líneas de salida que no coinciden con el patrón, y el patrón coincide con cualquier línea que termine con a/
.fuente
--quiet
(lo que implica--exit-code
) también silencia la salida, para aquellos que solo quieren el código de salida.El valor de retorno de
git status
simplemente le indica el código de salida degit status
, no si hay modificaciones para confirmar.Si desea una versión más legible por computadora de la
git status
salida, intenteConsulte la descripción de
git status
para obtener más información al respecto.Uso de muestra (el script simplemente prueba si
git status --porcelain
da algún resultado, no se necesita análisis):Tenga en cuenta que debe citar la cadena para probar, es decir, la salida de
git status --porcelain
. Para obtener más sugerencias sobre construcciones de prueba, consulte la Guía avanzada de secuencias de comandos Bash ( comparación de cadenas de sección ).fuente
|| echo no
a la sustitución de comandos para que el espacio de trabajo no se informe erróneamente limpio sigit status
falla fundamentalmente. Además, su código es (encomiable) compatible con POSIX, pero como se vincula a una guía de bash, permítame agregar que si usa bash en[[ ... ]]
lugar de compatible con POSIX[ ... ]
, no necesita citar dos veces la sustitución del comando (aunque no hace daño):[[ -z $(git status --porcelain) ]]
.Si eres como yo, quieres saber si hay:
1) cambios en 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:
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:
fuente
—untracked-files=no
; Creo que tu prueba se puede simplificar[[ -z $(git status --untracked-files=no --porcelain) ]]
.git status
no debe escribir en stderr, a menos que algo va mal fundamental - y entonces usted no quiere ver que la producción. (Si desea un comportamiento más robusto en ese caso, agregue|| echo no
la sustitución de comandos para que la prueba de limpieza aún falle). Comparaciones de cadenas / el-z
operador puede manejar cadenas de varias líneas, sin necesidad de hacerlotail
.[[ -z $(git status -u no --porcelain) ]]
[[ -z $(git status -uno --porcelain) ]]
Es posible combinar
git status --porcelain
con un simplegrep
para realizar la prueba.A veces lo uso como una frase simple:
Agregue
-qs
a su comando grep para hacerlo silencioso.fuente
git status
falla fatalmente (p. ej., un repositorio corrupto), su prueba informará por error de un espacio de trabajo limpio . Una opción es usargit status --porcelain 2>&1
, pero eso 'comería' el mensaje de error si usara grep con-q
. (Que trata de que iba a perder la elegancia:(git status --porcelain || echo err) | grep -q .
)test -z "$(git status --porcelain)" || git pull origin master
Desde el código fuente de git hay un script sh que incluye lo siguiente.
Este fragmento muestra cómo es posible usarlo
git diff-files
ygit diff-index
descubrir si hay algún cambio en los archivos conocidos previamente. Sin embargo, no le permite averiguar si se ha agregado un nuevo archivo desconocido al árbol de trabajo.fuente
if [ -n "$(git ls-files --others --exclude-standard)" ]
sin ninguna tubería adicional o greping debería ser suficiente para detectar archivos no rastreados.haría una prueba sobre esto:
o esto para ser explícito:
dónde:
- código de salida
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
Deshabilita todas las salidas del programa. Implica --código de salida
fuente
Llego un poco tarde en la discusión, pero si es solo que necesita tener un código de salida de 0 si
git status --porcelain
no devuelve nada y! = 0 más, intente esto:Esto hará que el número de líneas sea el código de salida, a riesgo de problemas cuando haya más de 255 líneas. Entonces
tendrá en cuenta eso;)
fuente
Estoy usando esto en un script para tener:
1 cuando hay un archivo diff o sin seguimiento
[-z "$ (estado de git - porcelana)"]
fuente
if ! git diff --quiet; then
es más limpio y más eficiente (creo). En otras palabras, use el código de salida, no el stdout.git diff --quiet
comporta de manera diferentegit status --porcelain
a los cambios en caché.No es bonito, pero funciona:
No estoy seguro de si el mensaje depende de la configuración regional, así que quizás ponga un
LANG=C
frente.fuente