O git pode operar no “modo silencioso”?

106

É possível executar qualquer comando git no modo "silencioso"? Por exemplo, posso dizer " git push origin" e não ver nada na tela?

Acho que posso redirecionar IO para /dev/null(funciona bem), mas ... o git permite algo assim naturalmente?

Abaixo está um script rápido que faz commit automático de EOD, usado quando eu preciso pegar o trem e não quero deixar código no meu computador 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 deixe-me saber.

James Raitsev
fonte
1
Não relacionado: em vez de envolver cmds em cd $ i, cd .., você pode fazer: for i em *; do (cd $ i; ...;); feito e execute o cd em um subshell. Isso é menos frágil.
William Pursell de
Importa-se de mover a marca "correta" para a resposta ThomasEdwards? Realmente responde da maneira "natural".
Christian
1
Eu me pergunto o que Linus tinha em mente quando desenvolveu o git, porque ele está claramente quebrando uma das regras básicas do UNIX que diz que o silêncio vale ouro. O que não foi respondido aqui é se é possível colocar alguma configuração na configuração do git para torná-lo um bom cidadão UNIX de uma vez por todas.
Johan Boulé de

Respostas:

19

Redirecionar a saída para / dev / null parece uma maneira natural de fazer isso para mim. Embora eu tenha definido anteriormente uma função de shell quiet_git como esta para uso em tarefas 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
}

Isso suprimirá stdout e stderr, a menos que o comando git falhe. Não é bonito; na verdade, o arquivo stdout é ignorado e deve apenas redirecioná-lo para / dev / null. Funciona, no entanto. E então você pode simplesmente fazer "quiet_git push" etc. mais tarde no script.

araqnid
fonte
10
Veja a resposta de @ThomasEdwards, muito melhor
Robin Winslow
240

Você pode usar --quietou -q, que também pode ser usado para outros comandos Git:

git commit --quiet
git push --quiet
Thomas Edwards
fonte
2
Não consigo silenciar o git commit dessa maneira. Ele ignora qualquer um dos sinalizadores.
GaryBishop
8
Você precisa adicioná-lo após o comando. git pull -qou git push origin master --quiet. Estou no git 1.8.x
Mendhak de
7
@Mendhak, não funciona (pelo menos não é silencioso). Por exemplo, git pull -q origin master > /dev/nullrende "Total 4 (delta 3), reutilizado 4 (delta 3)". Isso é com git 2.0.1.
Matthew Flaschen de
3
Mesmo ao usar --queit (ou -q), ele ainda imprime alguma saída. Por exemplo, ao usar git checkout -q (branch_name), se for a primeira vez que o branch está sendo verificado, ele imprimirá uma mensagem dizendo que o novo branch foi configurado. Existe alguma forma (algum sinalizador) usando a qual todas essas saídas podem ser silenciadas?
Ankur
6
Se você realmente deseja NENHUMA saída, use git command >/dev/null 2>&1. Isso redireciona stdout e stderr para / dev / null. As --quietopções são para gerar saída sucinta, não para suprimir a saída inteiramente @Ankur
Brandon
17

Usar &> /dev/nullno final fornece uma saída de comando git completamente silenciosa.

git fetch origin master &> /dev/null
Hans Kristian
fonte
1
Apenas no csh, a maioria recomenda fazer scripts de shell usando shells bourne.
hd1
@ hd1 não, &>é um operador de redirecionamento IO bash. Veja 3.6 aqui tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Hans Kristian
@HansKrisian sim, o bash trouxe recursos interativos do csh e o script do sh juntos. Citando o mesmo howto: "Bash é um shell compatível com sh que incorpora recursos úteis do shell Korn (ksh) e do shell C (csh)".
hd1
1
O objetivo é remover mensagens informativas, mas ainda exibir erros. Eu não estudei o quão bem-comportado é o git em relação ao que vai para stdout e o que vai para stderr, mas redirecionar os dois cheira a uma ideia muito ruim.
Johan Boulé de
6

Observe que mesmo com --quiet , a git fetch(que dispara a git gc) geraria alguma saída.
Isso é por causa da git gcparte do git fetch.

Não mais, a partir do git 2.1.1 (setembro de 2014): veja commit 6fceed3bea59d747c160972c67663e8b8c281229 de Nguyễn Thái Ngọc Duy ( pclouds)

buscar: silêncio git-gcse --quietfor dado

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
fonte