Kann Git im "Silent Mode" arbeiten?

106

Ist es möglich, einen Git-Befehl im "stillen" Modus auszuführen? Zum Beispiel kann ich sagen , „ git push origin“ und sehe nichts auf dem Bildschirm angezeigt?

Ich nehme an, ich kann IO umleiten /dev/null(funktioniert gut), aber ... erlaubt Git so etwas natürlich?

Unten finden Sie ein schnelles Skript, das die automatische EOD-Festschreibung durchführt und verwendet wird, wenn ich den Zug erwischen muss und keinen Code auf meinem lokalen Computer hinterlassen möchte

  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

Lass es mich wissen, bitte.

James Raitsev
quelle
1
Unabhängig: Anstatt cmds in cd $ i, cd .. zu verpacken, können Sie Folgendes tun: for i in *; do (cd $ i; ...;); fertig und führen Sie die CD in einer Subshell aus. Das ist weniger zerbrechlich.
William Pursell
Möchten Sie die "richtige" Markierung auf die Antwort von ThomasEdwards verschieben? Es antwortet wirklich mit dem "natürlichen" Weg.
Christian
1
Ich frage mich, was Linus vorhatte, als er Git entwickelte, weil es eindeutig gegen eine der UNIX-Grundregeln verstößt, die besagt, dass Schweigen golden ist. Was hier nicht beantwortet wurde, ist, ob es möglich ist, eine Einstellung in die Konfiguration von git zu setzen, um es ein für alle Mal zu einem guten UNIX-Bürger zu machen.
Johan Boulé

Antworten:

19

Das Umleiten der Ausgabe nach / dev / null scheint mir eine natürliche Methode zu sein. Obwohl ich in der Vergangenheit eine solche quiet_git-Shell-Funktion für die Verwendung in Cron-Jobs definiert habe:

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
}

Dadurch werden stdout und stderr unterdrückt, es sei denn, der Befehl git schlägt fehl. Es ist nicht schön; Tatsächlich wird die stdout-Datei ignoriert und sollte nur nach / dev / null umgeleitet werden. Funktioniert aber. Und dann können Sie später im Skript einfach "quiet_git push" usw. ausführen.

araqnid
quelle
10
Siehe @ThomasEdwards Antwort, viel besser
Robin Winslow
239

Sie können --quietoder verwenden -q, was auch für andere Git-Befehle verwendet werden kann:

git commit --quiet
git push --quiet
Thomas Edwards
quelle
2
Ich kann nicht scheinen, Git Commit auf diese Weise zum Schweigen zu bringen. Beide Flaggen werden ignoriert.
Gary Bishop
8
Sie müssen es nach dem Befehl hinzufügen. git pull -qoder git push origin master --quiet. Ich bin auf Git 1.8.x
Mendhak
7
@ Mendhak, funktioniert nicht (zumindest ist es nicht still). ZB git pull -q origin master > /dev/nullergibt "Gesamt 4 (Delta 3), wiederverwendete 4 (Delta 3)". Das ist mit Git 2.0.1.
Matthew Flaschen
3
Selbst wenn --queit (oder -q) verwendet wird, wird immer noch eine Ausgabe ausgegeben. Wenn Sie beispielsweise git checkout -q (branch_name) verwenden und zum ersten Mal ausgecheckt werden, wird eine Meldung ausgegeben, die besagt, dass der neue Zweig eingerichtet wurde. Gibt es eine Möglichkeit (ein Flag), mit der alle diese Ausgaben stummgeschaltet werden können?
Ankur
6
Wenn Sie tatsächlich KEINE Ausgabe wünschen , verwenden Sie git command >/dev/null 2>&1. Dadurch werden sowohl stdout als auch stderr nach / dev / null umgeleitet. Die --quietOptionen sind für die Erzeugung einer prägnanten Ausgabe, nicht für die vollständige Unterdrückung der Ausgabe @Ankur
Brandon
17

Wenn Sie &> /dev/nullam Ende verwenden, erhalten Sie eine völlig stille Ausgabe des Git-Befehls.

git fetch origin master &> /dev/null
Hans Kristian
quelle
1
Nur in csh empfehlen die meisten, Shell-Skripte mit Bourne-Shells zu erstellen.
HD1
@ hd1 nein, &>ist ein Bash-IO-Umleitungsoperator. Schauen Sie sich 3.6 hier an tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Hans Kristian
@HansKrisian ja, bash hat interaktive Funktionen von csh und das Scripting von sh zusammengebracht. Zitat aus dem gleichen Howto: "Bash ist eine sh-kompatible Shell, die nützliche Funktionen aus der Korn-Shell (ksh) und der C-Shell (csh) enthält."
HD1
1
Der Zweck besteht darin, Informationsmeldungen zu entfernen, aber dennoch Fehler anzuzeigen. Ich habe nicht untersucht, wie gut sich git in Bezug auf stdout und stderr verhält, aber beide Gerüche umzuleiten, ist eine sehr schlechte Idee.
Johan Boulé
6

Beachten Sie, dass selbst mit --quiet a git fetch(das a auslöst git gc) eine Ausgabe erzeugt wird.
Das liegt an dem git gcTeil der git fetch.

Nicht mehr ab Git 2.1.1 (September 2014): siehe Commit 6fceed3bea59d747c160972c67663e8b8c281229 von Nguyễn Thái Ngọc Duy ( pclouds)

holen: Schweigen, git-gcwenn --quietgegeben wird

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
quelle