Як я можу запобігти використанню пейджера "git diff"?


638

Чи є перемикач командного рядка для переходу на git diffінші команди, які використовують lessпейджер за замовчуванням?

Я знаю, що можу передати це коту, але це видаляє всі виділення синтаксису.

Я знаю, що можу встановити пейджер у глобальній .gitconfig до кота GITPAGER=cat(або щось подібне); але іноді я хочу мати пейджер (залежно від розміру різниці).

Але я вважаю за краще комутатор командного рядка, якщо такий є; і я не в змозі знайти його, переглядаючи сторінки чоловіка.


16
Примітка. Це core.pager 'less -+F -+X'був би останній спосіб видалити ці параметри. Дивіться мою відповідь нижче .
VonC

"менше - + F - + X" - це магічне налаштування для видалення дратівливих маркерів "... пропускання ..." у довгих журналах. Дякую за ці варіанти, ти врятував мені день!
Гійом Перро


Див споріднений питання про використання lessз мерзотником (вона варіюється в залежності від lessверсії): unix.stackexchange.com/questions/107315 / ...
Пірз

Відповіді:


688

--no-pagerGit скаже йому не використовувати пейджер. Передача параметра -Fв lessбуде сказати йому , щоб не сторінка , якщо вихідні уміщається в одному екрані.

Використання:

git --no-pager diff

Інші варіанти коментарів включають:

# Set an evaporating environment variable to use 'cat' for your pager
GIT_PAGER=cat git diff

# Tells 'less' not to paginate if less than a page
export LESS="-F -X $LESS"
# ...then Git as usual
git diff

3
Дякую, я думаю, я можу псевдонім git --no-пейджер gitc в .bashrc, правда?
Лакшман Прасад

42
Або використовувати змінні середовища GIT_PAGER або PAGER, або core.pagerзмінну git config.
Якуб Нарубський

74
Майте на увазі, що перед командою потрібно додати --add-пейджер , як у "git --no-pager log --format = blah"
Ана Беттс

6
Крім того, якщо ваш термінал очистить екран після виходу менше, ви захочете додати -Eдо своїх lessваріантів, щоб зробити його -Fкорисним.
mgalgs

9
Зверніть увагу , що якщо ви хочете включити --no-pagerв якості псевдоніма, тобто префікс команди з ним, і , щоб уникнути помилок, ви повинні зробити псевдонім , як це: git config alias.foo '!git --no-pager foo'. Дещо заплутано. Просто згладжування не '--no-pager foo'буде працювати.
Джим Стюарт

271

Як згадувалася попередня відповідь, передаючи -Fваріант наless змушує його вийти, якщо вміст менше одного екрана. Однак після цього екран скидається, і ви не бачите вмісту.

Цей -Xваріант усуває таку поведінку. Отже, я використовую наступне, щоб увімкнути умовне пейджінг на основі кількості вмісту:

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

46
Примітка: мені довелося використовувати git config --global --add core.pager "less -F -X"в git 1.8.0.2, той, що вище, не працював.
Догберт

7
Чудово! Крім того, щоб змусити його поводитися так не тільки з мерзотником , але всі програми додати що - щось на зразок export LESS="-RFX"на свій .bashrcабо.zshrc
defhlt

Дякую за це; Мене наштовхнув варіант, у якому git повинен би відрізати перший рядок від виводу, а потім вийти з синхронізації таким чином, що спускання вниз по одній лінії, а потім вгору по одній лінії призведе до того, що 1-й рядок правильного займе верх, Далі слід 3-й рядок з правильного виводу. У будь-якому разі, вказавши цю опцію, цю проблему вирішено. Так химерно.
Тім Харпер

Якщо ви використовуєте Git для Windows (для якого використовується менш побудований Greenwood Software), потрібний вам параметр -E (джерело: greenwoodsoftware.com/less/faq.html#dashe )
Gavin Ward

1
Так, як я пояснив у своїй відповіді, я вважаю за краще, щоб екран не був перезавантажений до та після запуску та виходу пейджера, особливо якщо все це відповідає одному екрану, саме це -Xі є. Не використовуйте його, якщо вам це не подобається. Мені це подобається, тому що таким чином я можу звертатися до таких речей, як git SHA, переглядаючи результат попередніх git-команд в моїй історії, не потребуючи введення команди знову. Кожен по-своєму.
ishaaq

169

Використовуйте

git config --global core.pager cat

щоб позбутися пейджера для всіх команд для всіх сховищ.

Ви також можете відключити підказка для однієї підкоманди Git, використовуючи pager.<cmd>налаштування замість core.pager, і ви можете змінити свої налаштування на сховище Git (опустити --global).

Перегляньте man git-configта шукайте pager.<cmd>деталі.


Питання полягало не в тому, як взагалі відключити пейджер, а як відключити його для підкоманди grep. Відповідь mtahmed ідеальна.
TilmanBaumann

9
Це може бути те, що розширене пояснення попросили, але це те, що я шукав, і це був один з найкращих результатів Google, тож дякую @geekQ
Brian F Leighty

70

Останні зміни в документації згадують інший спосіб видалення параметра за замовчуванням для less("параметри за замовчуванням" FRSX).

Для цього питання це було б (git 1.8+)

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

Наприклад, Дірк Бестер пропонує у коментарях :

export LESS="$LESS -FRXK" 

так що я отримав кольоровий розріз із Ctrl-Cкинутим з less.

У коментарі та своєму питанні Вілсон F зазначає, що:

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


Ці зміни вже були помітні в git 1.8.x, як показано в " Завжди використовуйте пейджер дляgit diff " (див. Коментарі). Але документація щойно перероблена ( для git 1.8.5 або 1.9, Q4 2013 ).

Переглядач тексту для використання командами Git (наприклад, "менше").
Значення означає інтерпретувати оболонкою.

Порядок уподобань:

  • $GIT_PAGERзмінна середовища,
  • потім core.pagerконфігурація,
  • тоді $PAGER,
  • а потім вибраний за замовчуванням час компіляції (зазвичай 'менше').

Коли LESSзмінна середовища не встановлена, Git встановлює її FRSX
(якщо LESSвстановлена ​​змінна середовище, Git взагалі не змінює її).

Якщо ви хочете вибірково замінити налаштування за замовчуванням Git для LESS, ви можете встановити core.pagerнаприклад, наприкладless -+S .
Це передасть у оболонку Git, який переведе остаточну команду на LESS=FRSX less -+S. Середовище вказує команді встановити Sпараметр для відсікання довгих рядків, але командний рядок скидає його за замовчуванням для складання довгих рядків.


Див. Документ 97d01f2a з причини нової редакції документації:

config: переписати core.pagerдокументацію

У тексті згадується core.pagerі GIT_PAGERбез надання загальної картини переваги. Позичіть кращий опис з git var(1) документації.

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

Перепишіть частину, яка пояснює, як змінна середовища LESSвстановлюється за замовчуванням Git та як вибірково налаштовувати її.


Примітка: commit b327583 ( Matthieu Moymoy , квітень 2014, для git 2.0.x / 2.1, Q3 2014) видалить S за замовчуванням:

пейджер: видаліть "S" з $ LESS за замовчуванням

За замовчуванням Git використовується для установки $LESSв -FRSXразі $LESSні встановлено користувачем.
Ці FRXпрапори на насправді мають сенс для Git ( Fі Xтому , що іноді вихідні Git труби на менш короткий, і Rтому , що Git труби кольоровий вихід). Прапор (подрібнити довгі лінії), з іншого боку, не має відношення до Git і є предметом переваг користувача. Git не повинен вирішувати, що користувач може змінити типовий режим .
SLESS

Більш конкретно, Sпрапор шкодить користувачам, які переглядають ненадійний код у пейджері, оскільки патч виглядає так:

-old code;
+new good code; [... lots of tabs ...] malicious code;

видається ідентичним:

-old code;
+new good code;

Користувачі, які віддають перевагу старій поведінці, можуть все-таки встановити змінну середовища $ LESS -FRSXявно або встановити ' less -S'.

Документація буде читати:

Навколишнє середовище не встановлює Sпараметр, але командний рядок робить, вказуючи менше скорочувати довгі рядки.
Аналогічно, встановлення core.pagerдля less -+Fвимикає Fпараметр, визначений середовищем, з командного рядка, деактивуючи quit if one screenповедінку " " less.
Можна спеціально активувати деякі прапори для певних команд: наприклад, встановити так, pager.blameщоб less -Sувімкнути обрізання рядків лише для git blame.


2
Дякую дякую! Я шукав спосіб змусити Git перестати рубати довгі рядки на МЕСЯТИ!
coredumperror

@CoreDumpError Примітка: наступний Git (2.0.X або 2.1) не буде рубати рядки за замовчуванням ! Дивіться мою відредаговану відповідь вище.
VonC

2
Дякую. Це дозволить мені зрозуміти, що я хочу експортувати LESS = "$ LESS -FRXK", щоб отримати кольоровий розріз із ctrl-c кинути менше.
Дірк Бестер

@DirkBester Цікава пропозиція. Я включив його у відповідь для більшої наочності.
VonC

1
@WilsonF Я не знаю, але це звучить як гарне запитання: чому б не поставити це питання замість того, щоб залишити його тут, закопаним у коментарях?
VonC

58

Ви також можете відключити / включити пейджери для конкретних виходів у глобальній конфігурації:

git config --global pager.diff false

Або встановити параметр core.pager, просто введіть порожню рядок:

git config --global core.pager ''

На мій погляд, це краще, ніж налаштовувати так, catяк ви говорите.


Це те, що працювало для мене на Git 1.9 ... все інше не працювало.
Джордон Бедвелл

Це той, хто працював на менеgit version 2.5.4 (Apple Git-61)
Ешлі Coolman

Це те, чого я хотів, тому що інші команди повністю вимикають пейджер, але це єдина відповідь, яка вимикається лише для того git diff, щоб залишити його працювати над іншими командами
SingleNegationElimination

станом на це написання ... у Windows / PowerShell мені довелося вручну редагувати code "$($env:UserProfile)\.gitconfig"та додавати pager = в [core]налаштуваннях. Відповідь спрацювала на моєму поточному сеансі повноважень, але, схоже, не зберегла цю налаштування ніде, тому вона була ефективною при наступному запуску.
Повернення коштів не повернено

12

Що стосується відключеного кольору при трубопроводі:

Використовуйте, --colorщоб уникнути забарвлення забарвлення.

git diff --color | less -R

Або налаштувати його примусово (наприклад, .gitconfig):

[color]
        ui = on

git diff | less -R

Для кольорових інструментів використовуйте:

git diff --no-color | some-primitive-tool

Експорт змінної середовища LESS=-R(наприклад, .bashrc) увімкнює підтримку кольорів за замовчуванням у "менше":

git diff | less


2
Зауважте, що git встановить LESSзмінну середовища для FRSXвиклику пейджера, якщо він не встановлений.
tobbez

10

Це працювало для мене з Git версії 2.1.4 в Linux:

git config --global --replace-all core.pager cat

Це робить Git використовувати catзамість less. catпросто скидає вихід diffна екран без будь-яких підказок.


Як правило, відповіді набагато корисніші, якщо вони включають пояснення того, що призначений для виконання коду та чому це вирішує проблему, не вводячи інших. (Ця публікація позначена принаймні одним користувачем, імовірно, тому, що вони вважали, що відповідь без пояснень слід видалити.)
Nathan Tuggy

3
@NathanTuggy Я подумав, що це досить ясно, що я відповідаю на поставлене запитання. Схоже, деякі користувачі люблять бігати навколо позначення коротких відповідей для задоволення. Я додам трохи тексту.
jcoffland

7

Ви можете додати псевдонім до diff для власного пейджера з pager.alias, наприклад:

[alias]
  dc = diff
  dsc = diff --staged
[pager]
  dc = cat
  dsc = cat

Це дозволить зберегти колір і використовувати "cat" як пейджер, коли він викликається на "git dc".

Крім того, речі, які не потрібно робити:

  • використовувати --no-pagerу своєму псевдонімі. Git (1.8.5.2, Apple Git-48) поскаржиться, що ви намагаєтесь змінити середовище.
  • використовувати оболонку з !shабо !git. Це буде обходити помилку навколишнього середовища вище, але вона скидає ваш робочий каталог (для цілей цієї команди) до каталогу Git верхнього рівня, тому будь-які посилання на локальний файл не працюватимуть, якщо ви вже знаходитесь у підкаталозі ваше сховище.

+1 Цей прийом корисний, коли ви хочете переходити по команді після, git logале ні git log --oneline. Використовуйте pager.log = less -FXR +/^commit.*при цьому спеціальний кожух на --onelineопції з alias.l1 = log --onelineі pager.l1 = less -FXR.
Клаудіо

6

У мене є ця штука в моєму, .gitconfigі вона, здається, працює нормально (вимкнено і для розгляду, і для показу):

[pager]
    diff = false
    show = false

5

Мені подобається час від часу відключати пейджинг, коли я знаю, що вихід не дуже довгий. Для цього я знайшов акуратний трюк за допомогою псевдонімів Git:

git config --global --add alias.n '!git --no-pager'

Або додайте в [alias]розділ ~ / .gitconfig наступне:

n = !git --no-pager

Це означає, що ви можете використовувати префікс nдля вимкнення підкачки для будь-якої команди Git, тобто:

git n diff # Show the diff without pager
git n log -n 3 # Show the last three commits without pager
git n show v1.1 # Show information about a tag

2

Для написаного мною швидкого та брудного сценарію я зробив це так:

PAGER=cat git diff ...

Якщо $GIT_PAGERце встановлено, це не працює . git --no-pagerробить те саме, але надійніше.
Матьє Мой

2

Як мовиться про man git , ви можете використовувати --no-pagerбудь-яку команду.

Я використовую його:

git --no-pager diff
git --no-pager log --oneline --graph --decorate --all -n 10

Потім використовуйте псевдонім, щоб уникнути використання (і запам'ятовування) довгих команд.


2

Для Windows це:

git config --global core.pager ""

Це дозволить вимкнути пейджинг для всього git, що входить, у тому числі супер дратівливого git branch.


Працює і з Linux!
rustysys-dev

2

Якщо ви використовуєте oh-my-zsh у ~/.oh-my-zsh/lib/misc.zshфайлі, коментуйте цей рядок:

env_default 'LESS' '-R'

Гей, я думаю, що ОП хотів мати комутатор командного рядка, щоб використовувати один раз з git diff, а не постійне глобальне рішення. Крім того, я не знаю, наскільки добре було б змінити вихідний код oh-my-zsh, оскільки згодом буде важко оновити oh-my-zsh. Краще встановіть це значення за замовчуванням у вашому файлі .zshrc.
Karri Rasinmäki

1
Спасибі, ви праві. Якщо ви користуєтеся oh-my-zsh і потребуєте постійного глобального рішення, можете додати unset LESSв кінці .zshrc.
повільний дощ

1

За замовчуванням git використовує менше як пейджер. Зазвичай я віддаю перевагу більше, оскільки вона надрукує першу сторінку, а потім дозволить прокручувати вміст.

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

Якщо ви хочете передавати вміст, було б незручно прокручувати, щоб надрукувати все. Хороша справа з тим, що ви зможете поєднати його з трубопроводом, і він пропустить все, наприклад.

# Find the commit abcdef123 in the full commit history and read author and commit message
git log |grep -C 5 'abcdef123'

В основному більше - це все, що вам коли-небудь знадобиться, якщо ви не хочете, щоб вміст залишався в консолі після завершення. Щоб використовувати більше замість цього, виконайте наступні дії.

git config --global core.pager 'more'


0

Просто дотримуйтесь інструкцій нижче.

  1. Просто введіть vi ~/.gitconfigсвій термінал.
  2. Вставити LESS="-F -X $LESS"лінію.
  3. Натисніть :wqта введіть.
  4. Перезавантажте свій термінал.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.