Команда гілки Git поводиться як "менше"


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

Відповіді:


737

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

Ви можете вимкнути підключенний вихідний сигнал для git branchвідключення за замовчуванням за допомогою параметра pager.branchconfig :

git config --global pager.branch false

127
Це дивне, дивне рішення зробити дефолт. Я очікую, що мої інструменти unix-y cli поводяться як німі прості програми, які ви можете зав'язати, якщо хочете, але я думаю, що це обговорення для іншого сайту.
Страгул

7
@Stragulus Зауважте, що новий за замовчуванням не заважає вам зв’язати git branchщось інше. Використовуючи виявлення труби , Git виведе список гілок для stdout в межах команд git branch > branches.txtабо git branch | wc -l.
Rory O'Kane

3
@ RoryO'Kane, але з пейджером, я маю додатковий тип ESC/qпісля простої git branchперевірки.
mitnk

23
@mitnk Не обов'язково. Якщо ваш пейджер є less, ви можете додати --no-init --quit-if-one-screenдо LESSзмінної середовища, що призведе lessдо простого запису в stdout, якщо текст можна переглядати без прокрутки. Дивіться man lessдокладнішу інформацію.
Rory O'Kane

13
Якщо ви хочете додати його у свій конфігураційний файл вручну, це [pager] branch = false(у двох рядках).
Сем

56

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

Однак важливим моментом є те, що коли змінну середовища LESS не встановлено, Git встановлює її на FRX , а наслідком є ​​те, що видима для користувача поведінка така сама, як якщо б пейджер не використовувався, коли вихід команди короткий (тобто якщо у вас є лише кілька гілок). Чоловік менше бачити :

-F або --quit-if-one-screen
Викликає менше автоматичного виходу, якщо весь файл можна відобразити на першому екрані.

-R або --RAW-CONTROL-CHARS
[...] Послідовності введення кольорів ANSI "кольором" виводяться у "сирому" вигляді.

-X або --no-init
Вимикає надсилання рядків ініціалізації та деініціалізації термінара в термінал. Іноді це бажано, якщо рядок деініціалізації робить щось непотрібне, наприклад очищення екрана.

Якщо ви отримаєте описану вами поведінку, ви, швидше за все, $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

25

Ця поведінка Гіта все більше дратувала і мене. Я отримав свій список тегів, lessколи просто хотів перелічити теги, наприклад.

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

Тому:

git config --global core.pager cat

1
Так, це має бути
Тура

2
спасибі за голову. Зізнаюсь, через пару місяців використання я все ще використовую кота, але, наприклад, коли git logце роблю, це дратує. Я просто сумую за оригінальною поведінкою, але не встиг покращити свій щоденний робочий процес у цій перспективі.
ionescu77

Ви виграєте! ... Ідеально!
sdlins

2
Зауважте, що це застосовуватиметься також і до git log...
bagerard

10

Для тих, хто хоче оновити їх, ~/.gitconfigщоб виправити це, це виглядатиме так:

[pager]
   branch = false

тут дивна річ: ця настройка працювала, і оскільки кілька днів її вже не було, чи щось змінилося або мою конфігурацію просто не застосовують?
Завойовники

7

Команда гілки Git поводиться як "менше"

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

Я рекомендую замінити пейджер на less, щоб він не "прокручував" виходи менше висоти терміналу.

git config --global --replace-all core.pager "less -F -X"


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
Відключений PAGER( GIT_PAGERбув відключеним) проблема все ще існує. Чи є в мене місце, щоб перевірити цю околицю?
DenniJensen

@DenniJensen Ви можете встановити пейджер на команду типу PAGER= git branch(з одним пробілом після і жодним перед знаком рівності точно так, як написано). Не знаю, чи є це краще , ніж , наприклад, git branch | cat.
maaartinus

-1

У мене була така ж проблема git statusі git config --global pager.status falseвирішується і ця проблема .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.