Команда Git branch ведет себя как 'less'

415

Когда я использую git branchкоманду для вывода списка всех ветвей, я вижу вывод git branch | less.

Команда git branchдолжна показывать список ветвей, как это lsделается для файлов.

Это вывод, который я получаю:

Введите описание изображения здесь

Как мне получить поведение по умолчанию git branch? Что вызывает постраничный вывод?

Я использую ZSH с oh_my_zsh(ничего для Git там), и мой .gitconfigвыглядит так:

[user]
  email = myemail@mail.com
  name = Dennis Haegler
[push]
  default = simple
[merge]
   tool = vimdiff
[core]
  editor = nvim
  excludesfile = /Users/dennish/.gitignore_global
[color]
  ui = true
[alias]
  br = branch
  ci = commit -v
  cam = commit -am
  co = checkout
  df = diff
  st = status
  sa = stash
  mt = mergetool
  cp = cherry-pick
  pl = pull --rebase
[difftool "sourcetree"]
  cmd = opendiff \"$LOCAL\" \"$REMOTE\"
[mergetool "sourcetree"]
  cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh 
  \"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
  trustExitCode = true
DenniJensen
источник

Ответы:

739

Как упоминалось в комментариях к ответу Марка Адельсбергера , это было изменение поведения по умолчанию, введенное в Git 2.16 .

Вы можете отключить постраничный вывод git branchпо умолчанию с помощью pager.branchпараметра конфигурации :

git config --global pager.branch false
Зак Шнайдер
источник
128
Это странное, странное решение сделать дефолт. Я ожидаю, что мои инструменты unix-y cli будут вести себя как простые программы, которые вы можете объединить, если хотите, но я предполагаю, что обсуждение предназначено для другого сайта.
Страгул
7
@Stragulus Обратите внимание, что новое значение по умолчанию не останавливает вас от цепочки git branchс чем-то еще. Используя обнаружение канала , Git выведет список веток в стандартный вывод команд git branch > branches.txtили git branch | wc -l.
Рори О'Кейн
3
@ RoryO'Kane, но с пейджером у меня есть лишний тип ESC/qпосле простой git branchпроверки.
Mitnk
23
@mitnk Не обязательно. Если ваш пейджер есть less, вы можете добавить --no-init --quit-if-one-screenв свою LESSпеременную окружения, что приведет lessк тому , что вы просто будете писать в стандартный вывод, если текст можно просматривать без прокрутки. Смотрите man lessдля более подробной информации.
Рори О'Кейн
13
Если вы хотите добавить его в свой конфигурационный файл вручную, это [pager] branch = false(в две строки).
Сэм
56

Как указывалось в других ответах, Git по умолчанию передает себя в пейджер ( lessпо умолчанию) для большинства команд.

Важным моментом, однако, является то, что, когда переменная среды LESS не установлена, Git устанавливает ее в FRX , и следствием этого является то, что поведение, видимое пользователю, такое же, как если бы пейджер не использовался, когда вывод команды короткий (т.е. если у вас только несколько веток). См человека меньше :

-F или --quit-if-one-screen
Вызывает автоматическое завершение команды less, если весь файл может отображаться на первом экране.

-R или --RAW-CONTROL-CHARS
[...] escape-последовательности ANSI "color" выводятся в "сыром" виде.

-X или --no-init
Отключает отправку строк инициализации и деинициализации termcap на терминал. Это иногда желательно, если строка деинициализации делает что-то ненужное, например, очистку экрана.

Если вы получите описанное вами поведение, вы, скорее всего, $LESSустановили что-то другое, и его сброс ( unset LESS) избавит от проблемы, сохраняя при этом поведение «пейджер» для длительного вывода. Кроме того, вы можете активировать поведение, сохраняя его $LESSкак есть, добавив его в свой .gitconfigфайл:

[core]
    pager = less -FRX

Если вам действительно не нравится пейджер, вы можете деактивировать его глобально или для каждой команды (см. Другие ответы).

Матье Мой
источник
40

Не спорьте с семантикой, но поведение, которое вы получаете, используется по умолчанию. Вот почему вы получаете это, когда вы не просите что-то другое. По умолчанию branch(и многие другие команды Git) используют пейджер при отправке вывода на терминал.

Вы можете изменить это значение по умолчанию, используя --no-pagerопцию:

git --no-pager branch

Или, если вы перенаправляете вывод в файл, Git должен обнаружить, что он не пишет в терминал, и поэтому не должен использовать пейджер в любом случае. (С другой стороны, это предлагает сценарий использования сценариев, и в этом случае вам следует рассмотреть возможность использования сантехнической команды, как git for-each-refв предпочтении git branch.)

Марк Адельсбергер
источник
git --no-pager branchработает. Но как это установить? Только PAGERпеременная окружения установлена ​​в less. Это не поведение по умолчанию. У всех моих колледжей есть вывод в виде списка, распечатанного на терминал.
DenniJensen
Какую версию Git вы используете? А какой из них используют ваши коллеги?
Лассе В. Карлсен
2.16.0! Эта функция введена в git в этой версии?
DenniJensen
Да, это по умолчанию сейчас. github.com/git/git/blob/master/Documentation/RelNotes/… Мой колледж рядом со мной использует ту же версию и не имеет этой проблемы :) thx @mark
DenniJensen
1
Это самый лучший ответ здесь, грустно, что у него так мало голосов, потому что я довольно много прокручивал, чтобы найти этот шедевр.
Codepleb
26

Такое поведение Git меня все больше и больше раздражало. Я получил свой список тегов, lessкогда просто хочу перечислить теги, например.

Можно также управлять этим поведением, изменив Git PAGER по умолчанию catвместо less. Я бы лучше прокрутил в iTerm, чем в редакторе. Мне нравится использовать редактор, когда я хочу.

Так:

git config --global core.pager cat
ionescu77
источник
2
Да, это должен быть правильный ответ для меня
Тура
2
спасибо за хедз-ап. Я признаю, что после нескольких месяцев использования я все еще использую кошку, но, например, когда git logэто раздражает. Я просто скучаю по исходному поведению, но у меня не было времени, чтобы улучшить мой ежедневный рабочий процесс в этой перспективе.
ionescu77
Вы выиграли! ... Отлично!
Сдлинс
2
Обратите внимание, что это будет применяться и к git log...
Bagerard
10

Для тех, кто хочет обновить их, ~/.gitconfigчтобы исправить это, это будет выглядеть так:

[pager]
   branch = false
Ник
источник
Странная вещь: этот параметр работал и с тех пор, как он больше не работает, что-то изменилось или моя конфигурация просто не применяется?
ЗавоевателиХаки
@ConquerorsHaki Это решение работает для меня с git v2.17.1 Попробуйте git config --list --show-originотладить, какие настройки установлены / не установлены для вас / вашей системы и откуда ( stackoverflow.com/q/12254076/1590950 ).
неделимый
7

Команда Git branch ведет себя как 'less'

Потому что Git по умолчанию открывает вывод в пейджере (по крайней мере, в Ubuntu). Общепринятый ответ будет полностью заменить пейджер, который вы не можете , как если ваш выход очень долго.

Я бы порекомендовал заменить пейджер less, чтобы он не «прокручивал» выходные данные меньше, чем высота терминала.

git config --global --replace-all core.pager "less -F -X"
Имран Ахмад
источник
3

Сделайте следующее:

[alias]
  br = !git --no-pager branch
Жоао Тьяго
источник
2

Принятый ответ кажется неправильным. Есть две проблемы:

  1. Поведение фактически отличается между (настроено по умолчанию) bash и zsh. «Проблема» появляется только под Zsh.
  2. Предлагаемое решение git branchне всегда использует пейджер, что нежелательно при большом количестве выходных данных.

Настоящая причина в том, что bash и zsh имеют разные определения по умолчанию для LESS: bash ничего не определяет, а zsh определяет это для -R. Когда я делаю unset LESSв Zsh, все приходит в норму ....

-RПоведение может все еще быть желательным. В этом случае вы можете добавить следующую инструкцию в ваш .zshrc, чтобы все работало:

export LESS=-FRX

-F'вызывает меньше, чтобы автоматически завершиться, если весь файл может быть отображен на первом экране'. Однако -Xнеобходимо указывать одновременно, в противном случае выходные данные не будут отображаться, если выходных данных меньше, чем на экране.

Юнвэй Ву
источник
0

https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables

GIT_PAGER управляет программой, используемой для отображения многостраничного вывода в командной строке. Если это не установлено, PAGER будет использоваться как запасной вариант.

Чтобы решить вашу проблему, вы можете удалить PAGER и GIT_PAGER в своей оболочке.

С-Отто
источник
1
Unset PAGER( GIT_PAGERбыло неустановлено) проблема все еще там. Есть ли место, где я должен проверить этот env vars?
DenniJensen
@DenniJensen Вы можете установить пейджер на команду как PAGER= git branch(с одним пробелом после и ни один перед знаком равенства в точности как написано). Не знаю, является ли это лучше , чем , например, git branch | cat.
Маартин
-1

У меня была такая же проблема, git statusи я git config --global pager.status falseтоже ее решаю.

Адонис
источник