¿Puede git operar en "modo silencioso"?

106

¿Es posible ejecutar cualquier comando de git en modo "silencioso"? Por ejemplo, ¿puedo decir " git push origin" y no veo nada en la pantalla?

Supongo que puedo redirigir IO a /dev/null(funciona bien), pero ... ¿git permite algo como esto de forma natural?

A continuación se muestra un script rápido que se compromete automáticamente con EOD, que se usa cuando necesito tomar el tren y no quiero dejar código en mi computadora local

  1 clear
  2
  3 cd
  4 cd repo/active
  5
  6 for i in *
  7 do
  8   cd $i
  9   echo "Pushing " $i
 10   git add . -A >> /dev/null 
 11   git commit -a -m "EOD automatic commit" >> /dev/null 
 12   git push origin >> /dev/null 
 13   echo
 14   cd ..
 15 done

Por favor hagamelo saber.

James Raitsev
fuente
1
No relacionado: en lugar de envolver cmds en cd $ i, cd .., puede hacer: for i in *; hacer (cd $ i; ...;); done y ejecute el cd en una subshell. Esto es menos frágil.
William Pursell
¿Quiere mover la marca "correcta" a la respuesta de ThomasEdwards? Realmente responde con la forma "natural".
Christian
1
Me pregunto qué tenía Linus en mente cuando desarrolló git, porque claramente está rompiendo una de las reglas básicas de UNIX que dice que el silencio es oro. Lo que no se respondió aquí es si es posible poner alguna configuración en la configuración de git para que sea un buen ciudadano de UNIX de una vez por todas.
Johan Boulé

Respuestas:

19

Redirigir la salida a / dev / null me parece una forma natural de hacerlo. Aunque en el pasado definí una función de shell quiet_git como esta para usar en trabajos cron:

quiet_git() {
    stdout=$(tempfile)
    stderr=$(tempfile)

    if ! git "$@" </dev/null >$stdout 2>$stderr; then
        cat $stderr >&2
        rm -f $stdout $stderr
        exit 1
    fi

    rm -f $stdout $stderr
}

Esto suprimirá stdout y stderr, a menos que falle el comando git. No es lindo; de hecho, el archivo stdout se ignora y debería redirigirlo a / dev / null. Aunque funciona. Y luego puede hacer "quiet_git push", etc. más adelante en el script.

arácnido
fuente
10
Vea la respuesta de @ThomasEdwards, mucho mejor
Robin Winslow
240

Puede usar --quieto -q, que también se puede usar para otros comandos de Git:

git commit --quiet
git push --quiet
Thomas Edwards
fuente
2
Parece que no puedo silenciar a git commit de esta manera. Ignora cualquiera de las dos banderas.
GaryBishop
8
Debe agregarlo después del comando. git pull -qo git push origin master --quiet. Estoy en git 1.8.x
Mendhak
7
@Mendhak, no funciona (al menos no es silencioso). Por ejemplo, git pull -q origin master > /dev/nullproduce "Total 4 (delta 3), reutilizado 4 (delta 3)". Eso es con git 2.0.1.
Matthew Flaschen
3
Incluso cuando se usa --queit (o -q), todavía imprime algo de salida. Por ejemplo, al usar git checkout -q (branch_name), si es la primera vez que se desprotege la rama, se imprimirá un mensaje diciendo que la nueva rama ha sido configurada. ¿Hay alguna forma (alguna bandera) con la que se pueda silenciar toda esa salida?
Ankur
6
Si realmente desea NO salida, use git command >/dev/null 2>&1. Esto redirige tanto stdout como stderr a / dev / null. Las --quietopciones son para generar una salida sucinta, no para suprimir la salida por completo @Ankur
Brandon
17

El uso &> /dev/nullal final le da una salida de comando git completamente silenciosa.

git fetch origin master &> /dev/null
Hans Kristian
fuente
1
Solo en csh, la mayoría recomienda hacer scripts de shell utilizando shells de Bourne.
hd1
@ hd1 no, &>es un operador de redireccionamiento de E / S de bash. Mire 3.6 aquí tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Hans Kristian
@HansKrisian sí, bash reunió las funciones interactivas de csh y las secuencias de comandos de sh. Citando del mismo cómo: "Bash es un shell compatible con sh que incorpora características útiles del shell Korn (ksh) y del shell C (csh)".
hd1
1
El propósito es eliminar los mensajes informativos, pero aún mostrar errores. No he estudiado qué tan bien se comporta git con respecto a lo que va a stdout y lo que va a stderr, pero redireccionar ambos huele a una muy mala idea.
Johan Boulé
6

Tenga en cuenta que incluso con --quiet , a git fetch(que desencadena a git gc) generaría algún resultado.
Eso se debe a la git gcparte del git fetch.

Ya no, a partir de git 2.1.1 (septiembre de 2014): consulte la confirmación 6fceed3bea59d747c160972c67663e8b8c281229 de Nguyễn Thái Ngọc Duy ( pclouds)

buscar: silencio git-gcsi --quietse da

builtin/fetch.c:

argv_array_pushl(&argv_gc_auto, "gc", "--auto", NULL);
if (verbosity < 0)
argv_array_push(&argv_gc_auto, "--quiet");
run_command_v_opt(argv_gc_auto.argv, RUN_GIT_CMD);
VonC
fuente