Czy git może działać w „trybie cichym”?


106

Czy można wykonać dowolną komendę git w trybie „cichym”? Na przykład, czy mogę powiedzieć „ git push origin” i nic nie jest wyświetlane na ekranie?

Przypuszczam, że mogę przekierować IO do /dev/null(działa dobrze), ale .. czy git pozwala na coś takiego naturalnie?

Poniżej znajduje się szybki skrypt, który wykonuje automatyczne zatwierdzanie EOD, używany, gdy muszę złapać pociąg i nie chcę zostawiać kodu na moim komputerze lokalnym

  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

Proszę daj mi znać.


1
Niepowiązane: zamiast zawijać cmds w cd $ i, cd .., możesz zrobić: for i in *; do (cd $ i; ...;); gotowe i uruchom płytę CD w podpowłoce. To jest mniej delikatne.
William Pursell

Chcesz przesunąć „prawidłowy” znak na odpowiedź ThomasEdwards? To naprawdę odpowiada w „naturalny” sposób.
Christian

1
Zastanawiam się, co Linus miał na myśli, kiedy tworzył gita, ponieważ wyraźnie łamie on jedną z podstawowych zasad UNIX, która mówi, że cisza jest złotem. Nie znalazłem tutaj odpowiedzi, czy można wprowadzić pewne ustawienia w konfiguracji gita, aby raz na zawsze uczynić go dobrym obywatelem UNIX.
Johan Boulé

Odpowiedzi:


19

Przekierowanie wyjścia do / dev / null wydaje mi się naturalnym sposobem zrobienia tego. Chociaż w przeszłości zdefiniowałem funkcję powłoki quiet_git, taką jak ta do użytku w zadaniach 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
}

Spowoduje to wyłączenie stdout i stderr, chyba że polecenie git zawiedzie. To nie jest ładne; w rzeczywistości plik stdout jest ignorowany i powinien po prostu przekierować go do / dev / null. Ale działa. Następnie możesz po prostu wykonać polecenie „quiet_git push” itp. W dalszej części skryptu.


10
Zobacz odpowiedź @ThomasEdwards, znacznie lepszą
Robin Winslow

240

Możesz użyć --quietlub -q, który może być również używany dla innych poleceń Git:

git commit --quiet
git push --quiet

2
Wydaje się, że nie mogę uciszyć git w ten sposób. Ignoruje każdą flagę.
GaryBishop

8
Musisz go dodać po poleceniu. git pull -qlub git push origin master --quiet. Jestem na git 1.8.x
Mendhak

7
@Mendhak, nie działa (przynajmniej nie jest cichy). Np. git pull -q origin master > /dev/nullDaje „Razem 4 (delta 3), ponownie wykorzystane 4 (delta 3)”. To z git 2.0.1.
Matthew Flaschen,

3
Nawet jeśli użyjesz --queit (lub -q), nadal wypisuje część wyników. Na przykład, gdy używasz git checkout -q (nazwa_gałęzi), jeśli jest to pierwszy raz, kiedy gałąź jest wyewidencjonowywana, wyświetli komunikat informujący, że nowa gałąź została skonfigurowana. Czy jest jakiś sposób (jakaś flaga), za pomocą którego można wyciszyć wszystkie takie wyjścia?
Ankur

6
Jeśli rzeczywiście chcesz NO wyjścia, wykorzystania git command >/dev/null 2>&1. To przekierowuje zarówno stdout, jak i stderr do / dev / null. Te --quietopcje są do generowania wyjścia zwięzły, nie do tłumienia wyjścia całkowicie @Ankur
Brandon

17

Użycie &> /dev/nullna końcu daje całkowicie ciche wyjście polecenia git.

git fetch origin master &> /dev/null

1
Tylko w csh większość poleca wykonywanie skryptów powłoki przy użyciu powłok Bourne'a.
hd1

@ hd1 no, &>jest operatorem przekierowania IO bash. Spójrz na 3.6 tutaj tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Hans Kristian

@HansKrisian tak, bash połączył funkcje interaktywne z csh i skryptów z sh. Cytując z tego samego howto: „Bash to kompatybilna z sh powłoka, która zawiera przydatne funkcje powłoki Korna (ksh) i powłoki C (csh)”.
hd1

1
Celem jest usunięcie komunikatów informacyjnych, ale nadal wyświetla błędy. Nie badałem, jak grzeczny jest git, jeśli chodzi o to, co trafia na stdout, a co na stderr, ale przekierowanie obu śmierdzi jak bardzo zły pomysł.
Johan Boulé

6

Zauważ, że nawet z --quiet a git fetch(co wyzwala a git gc) wygeneruje jakieś wyjście.
Dzieje się tak z powodu git gcczęści git fetch.

Już nie, począwszy od git 2.1.1 (wrzesień 2014): zobacz commit 6fceed3bea59d747c160972c67663e8b8c281229 od Nguyễn Thái Ngọc Duy ( pclouds)

fetch: cisza, git-gcjeśli --quietpodano

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);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.