Как я могу запретить git diff использовать пейджер?

642

Есть ли переключатель командной строки для передачи git diffи другие команды, которые используютless пейджер по умолчанию?

Я знаю, что могу передать это коту, но это удаляет всю подсветку синтаксиса.

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

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

Лакшман Прасад
источник
16
Примечание: core.pager 'less -+F -+X'будет более поздний способ удалить эти параметры. Смотрите мой ответ ниже .
VonC
"less - + F - + X" - магическая настройка для удаления надоедливых маркеров "... skipping ..." в длинных журналах. Большое спасибо за эти варианты, вы спасли мой день!
Гийом Перро,
связанные: stackoverflow.com/questions/12352049/…
Тревор Бойд Смит
См родственный вопрос об использовании lessс мерзавцем (она варьируется в зависимости от lessверсии): unix.stackexchange.com/questions/107315/...
Пирз

Ответы:

692

--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-pager для gitc в .bashrc, верно?
Лакшман Прасад
42
Или используйте переменные окружения GIT_PAGER или PAGER, или core.pagerпеременную git config.
Якуб Наребски
74
Помните, что вы должны добавить --add-pager перед вашей командой, как в «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'не сработало.
Джим Стюарт
272

Как упоминалось в предыдущем ответе, передавая -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
Большой! Также, чтобы заставить его вести себя так, не только с git, но и со всеми программами, добавляющими что-то вроде export LESS="-RFX"вашего .bashrcили.zshrc
defhlt
Спасибо тебе за это; Меня мучает опция, в которой git обрезает первую строку из выходных данных, а затем теряет синхронизацию, так что при переходе вниз на одну строку, а затем вверх на одну строку 1-я строка правильного занимает верхнюю часть, с последующей 3-й строкой из правильного вывода. В любом случае, указание этой опции решило эту проблему. Так странно.
Тим Харпер
Если вы используете Git For Windows (который использует меньше встроенного программного обеспечения Greenwood), вам нужен параметр -E (источник: greenwoodsoftware.com/less/faq.html#dashe )
Гэвин Уорд
1
Да, как я объяснил в своем ответе, я предпочитаю, чтобы экран не перезагружался до и после запуска и выхода пейджера, особенно если он умещается на одном экране, что и есть -X. Не используйте его, если вам это не нравится. Мне это нравится, потому что таким образом я могу ссылаться на такие вещи, как git SHA, просматривая результаты предыдущих команд git в моей истории, без необходимости повторного ввода команды. Каждому свое.
Ишак
169

использование

git config --global core.pager cat

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

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

Смотрите man git-configи ищите pager.<cmd>для деталей.

geekQ
источник
Вопрос был не в том, как вообще отключить пейджер, а в том, как его отключить для подкоманды grep. Ответ Мтахмеда идеален.
TilmanBaumann
9
Это может быть то, о чем просило расширенное объяснение, но это то, что я искал, и это был один из лучших результатов Google, так что спасибо @geekQ
Брайан Ф. Лейти
70

В последних изменениях в документации упоминается другой способ удаления опции по умолчанию для less(«опции по умолчанию»FRSX ).

По этому вопросу это будет (git 1.8+)

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

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

export LESS="$LESS -FRXK" 

так что я получаю цветные различия с Ctrl-Cвыходом из less.

Уилсон Ф. упоминает в комментариях и в своем вопросе, что:

less поддерживает горизонтальную прокрутку, поэтому, когда строки обрезаются, less отключает quit-if-one-screen, чтобы пользователь мог по-прежнему прокручивать текст влево, чтобы увидеть, что было обрезано.


Эти изменения были уже видны в git 1.8.x, как показано в « Всегда использовать пейджер дляgit diff » (см. Комментарии). Но документация была переписана ( для git 1.8.5 или 1.9, четвертый квартал 2013 года ).

Просмотрщик текста для использования командами Git (например, 'less').
Значение предназначено для интерпретации оболочкой.

Порядок предпочтений:

  • $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 по умолчанию, и как ее выборочно настроить.


Примечание: коммит 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;

Пользователи, которые предпочитают старое поведение, могут все еще установить -FRSXявное значение переменной среды $ LESS или установить для core.pager значение ' less -S'.

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

Среда не устанавливает Sпараметр, но командная строка делает, меньше инструктирует обрезать длинные строки.
Точно так же, установка core.pagerна less -+Fдеактивирует Fопцию, указанную средой из командной строки, деактивируя quit if one screenповедение «» less.
Можно специально активировать некоторые флаги для определенных команд: например, настройка pager.blameдля включения less -Sусечения строки только для git blame.

VonC
источник
2
Спасибо Спасибо! Я искал способ сделать так, чтобы git прекратил прерывать длинные строки в течение МЕСЯЦЕВ!
coredumperror
Примечание @CoreDumpError: следующий Git (2.0.X или 2.1) по умолчанию не прерывает строку ! Смотрите мой отредактированный ответ выше.
VonC
2
Спасибо. Это позволило мне понять, что я хочу экспортировать LESS = "$ LESS -FRXK", так что я получаю цветной diff с помощью ctrl-c quit from less.
Дирк Бестер
@DirkBester Интересное предложение. Я включил его в ответ для большей наглядности.
VonC
1
@WilsonF Не знаю, но это звучит как хороший вопрос: почему бы не задать вопрос, а не оставлять его здесь, закопанным в комментариях?
VonC
58

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

git config --global pager.diff false

Или, чтобы установить параметр core.pager, просто предоставьте пустую строку:

git config --global core.pager ''

На мой взгляд, это лучше, чем установить, catкак вы говорите.

mtahmed
источник
Это то, что у меня работало на Git 1.9 ... все остальное не работало.
Джордон Бедвелл
Это тот, который работал для меняgit version 2.5.4 (Apple Git-61)
Эшли Кулман
Это то, что я хотел, потому что другие команды полностью отключают пейджер, но это единственный ответ, который отключается только на git diffвремя, оставляя его работающим для других команд
SingleNegationElimination
на момент написания этой статьи ... на Windows / PowerShell мне пришлось вручную редактировать code "$($env:UserProfile)\.gitconfig"и добавлять pager = в [core]настройках. Ответ сработал для моего текущего сеанса PowerShell, но, похоже, нигде не сохранил настройки, поэтому он был эффективен при следующем запуске.
Нет возврата нет возврата
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) включает поддержку цвета по умолчанию в "less":

git diff | less

StellarVortex
источник
2
Обратите внимание, что git будет устанавливать LESSпеременную окружения FRSXпри вызове пейджера, если он не установлен.
Тоббез
10

Это работало для меня с Git версии 2.1.4 в Linux:

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

Это делает использование Git catвместо less. catпросто выводит вывод diffна экран без подкачки.

jcoffland
источник
Как правило, ответы гораздо полезнее, если они включают в себя объяснение того, для чего предназначен код, и почему это решает проблему, не представляя других. (Это сообщение было помечено по крайней мере одним пользователем, предположительно потому, что они думали, что ответ без объяснения следует удалить.)
Натан Тагги,
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и, кажется, работает нормально (отключено для diff и show):

[pager]
    diff = false
    show = false
sekmo
источник
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.

Jaredcheeda
источник
Работает и с Linux тоже!
rustysys-dev
2

Если вы используете oh-my-zsh в ~/.oh-my-zsh/lib/misc.zshфайле, прокомментируйте эту строку:

env_default 'LESS' '-R'
медленный дождь
источник
Эй, я думаю, что OP хотел иметь переключатель командной строки, чтобы использовать один раз с git diff, а не постоянное глобальное решение. Кроме того, я не знаю, насколько хорошо было бы изменить исходный код oh-my-zsh, так как позже будет сложно обновить oh-my-zsh. Лучше установите это значение по умолчанию в вашем файле .zshrc.
Карри Расинмяки
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'
Patrik
источник
0
git -P diff

Или --no-pager.

Кстати: чтобы сохранить цвет с кошкой

git diff --color=always | cat
hyperpallium
источник
0

Просто следуйте инструкциям ниже.

  1. Просто введите vi ~/.gitconfigсвой терминал.
  2. Вставить LESS="-F -X $LESS"строку.
  3. Нажмите :wqи введите.
  4. Перезапустите свой терминал.
Nitish
источник