Может ли git работать в «тихом режиме»?

106

Можно ли выполнить любую команду git в "тихом" режиме? Например, могу ли я сказать " git push origin" и ничего не увидеть на экране?

Я полагаю, я могу перенаправить ввод-вывод на /dev/null(работает нормально), но .. позволяет ли git что-то подобное естественно?

Ниже приведен быстрый сценарий, который выполняет автоматическую фиксацию EOD, используемый, когда мне нужно сесть на поезд и не хочу оставлять код на моем локальном компьютере.

  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

Пожалуйста, дайте мне знать.

Джеймс Райцев
источник
1
Несвязано: вместо того, чтобы оборачивать cmds в cd $ i, cd .., вы можете: for i in *; сделать (cd $ i; ...;); готово и запустите компакт-диск в подоболочке. Это менее хрупко.
Уильям Перселл
Хотите переместить отметку "правильный" в ответ ThomasEdwards? Он действительно отвечает "естественным" способом.
Christian
1
Интересно, что имел в виду Линус, когда разрабатывал git, потому что он явно нарушает одно из основных правил UNIX, согласно которому тишина - это золото. На что здесь не ответили, так это на то, можно ли включить некоторые настройки в конфигурацию git, чтобы раз и навсегда сделать его хорошим гражданином UNIX.
Johan

Ответы:

19

Перенаправление вывода на / dev / null кажется мне естественным способом сделать это. Хотя в прошлом я определил такую ​​функцию оболочки quiet_git для использования в заданиях 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
}

Это подавит stdout и stderr, если команда git не завершится ошибкой. Это некрасиво; на самом деле файл stdout игнорируется, и он должен просто перенаправить его на / dev / null. Хотя работает. А потом вы можете просто выполнить "quiet_git push" и т. Д. Позже в скрипте.

аракнид
источник
10
См. Ответ @ThomasEdwards, гораздо лучше
Робин Уинслоу
240

Вы можете использовать --quietили -q, что также можно использовать для других команд Git:

git commit --quiet
git push --quiet
Томас Эдвардс
источник
2
Кажется, я не могу заставить замолчать git commit таким образом. Он игнорирует любой флаг.
GaryBishop
8
Его нужно добавить после команды. git pull -qили git push origin master --quiet. Я нахожусь на git 1.8.x
Мендхак 01
7
@Mendhak, не работает (по крайней мере, не молчит). Например, результат git pull -q origin master > /dev/null«Всего 4 (дельта 3), повторно использовано 4 (дельта 3)». Это с git 2.0.1.
Мэтью Флашен
3
Даже при использовании --queit (или -q) он все равно выводит некоторые выходные данные. Например, при использовании git checkout -q (branch_name), если это первый раз, когда ветка проверяется, он напечатает сообщение о том, что новая ветка была настроена. Есть ли какой-нибудь способ (какой-то флаг), с помощью которого можно отключить весь такой вывод?
Ankur
6
Если вы на самом деле хотите НЕТ выхода, использование git command >/dev/null 2>&1. Это перенаправляет как stdout, так и stderr в / dev / null. Эти --quietопции для генерации сжатого вывода, а не для подавления вывода полностью @Ankur
Brandon
17

Использование &> /dev/nullв конце дает вам полностью тихий вывод команды git.

git fetch origin master &> /dev/null
Ганс Кристиан
источник
1
Только в csh большинство из них рекомендуют выполнять сценарии оболочки с использованием оболочки bourne.
hd1
@ hd1 no, &>это оператор перенаправления ввода-вывода bash. Посмотрите на 3.6 здесь tldp.org/HOWTO/Bash-Prog-Intro-HOWTO-3.html
Hans Kristian
@HansKrisian: да, bash объединил интерактивные функции из csh и сценарии из sh. Цитата из того же руководства: «Bash - это sh-совместимая оболочка, которая включает в себя полезные функции оболочки Korn (ksh) и оболочки C (csh)».
hd1
1
Цель состоит в том, чтобы удалить информационные сообщения, но по-прежнему отображать ошибки. Я не изучал, насколько хорошо git ведет себя в отношении того, что идет в stdout, а что - в stderr, но перенаправление обоих пахнет очень плохой идеей.
Johan
6

Обратите внимание, что даже с --quiet , a git fetch(который запускает a git gc) будет генерировать некоторый вывод.
Это из-за того, что git gcчасть git fetch.

Больше нет, начиная с git 2.1.1 (сентябрь 2014 г.): см. Commit 6fceed3bea59d747c160972c67663e8b8c281229 от Nguyễn Thái Ngọc Duy ( pclouds)

выборка: тишина, git-gcесли --quietдано

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
источник