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

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

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

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

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

20 ответов

Решение

--no-pager мерзавец скажет это не использовать пейджер. Передача опции -F меньше скажет это не страница, если выход помещается на одном экране.

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

git --no-pager diff

Другие варианты из комментариев включают в себя:

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

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

Как упоминалось в предыдущем ответе, прохождение -F Если выбрано значение less, содержимое будет закрыто, если содержимое меньше одного экрана, однако после этого экран будет перезагружен, и вы в конечном итоге не увидите содержимое, -X вариант покончил с этим поведением. Итак, я использую следующее для включения условного подкачки на основе объема контента:

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

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

git config --global core.pager cat

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

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

Увидеть man git-config и искать pager.<cmd> для деталей.

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

git config --global pager.diff false

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

git config --global core.pager ''

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

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

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

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

Например, Dirk Bester предлагает в комментариях:

export LESS="$LESS -FRXK" 

так что я получаю цветные различия с Ctrl-C выйти из less,

Wilson F. упоминает в комментариях и в своем вопросе, что:

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


См. Commit 97d01f2a по причине новой редакции документации:

конфиг: переписать core.pager документация

Текст упоминает core.pager а также GIT_PAGER без предоставления общей картины приоритета. Взять лучшее описание из git var (1) документация.

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

Перепишите часть, которая объясняет, как переменная окружения LESS установлено значение Git по умолчанию, и как его выборочно настроить.


Примечание: коммит b327583 ( Матье Мой moy, Апрель 2014 г., для git 2.0.x/2.1, Q3 2014) по умолчанию удалит S:

пейджер: по умолчанию убрать 'S' из $LESS

По умолчанию Git используется для установки $LESS в -FRSX если $LESS не был установлен пользователем.
FRX флаги на самом деле имеют смысл для Git (F а также X потому что иногда на выходе Git трубы меньше, а R потому что мерзкие трубы цветные по выходным).
S flag (chop long lines), с другой стороны, не относится к Git и зависит от предпочтений пользователя. Git не должен решать для пользователя, чтобы изменить LESS по умолчанию.

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

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

будет выглядеть идентично:

-old code;
+new good code;

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

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

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

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

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

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

Относительно отключенного цвета при обвязке:

использование --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

Я люблю отключать пейджинг время от времени, когда знаю, что вывод не очень длинный. Для этого я нашел хитрый трюк с использованием псевдонимов 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 3 commits without pager
git n show v1.1 # Show information about a tag

Вы можете добавить псевдоним 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 dir верхнего уровня, поэтому любые ссылки на локальный файл не будут работать, если вы уже находитесь в подкаталоге вашего Сделки рЕПО.

Как говорится на man git, вы можете использовать --no-pager по любой команде.

Я использую это на:

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

Затем используйте псевдоним, чтобы избежать использования (и запоминания) длинных команд.

У меня есть этот кусок в моем .gitconfig и, кажется, работает нормально (отключено для diff и show):

[pager]
    diff = false
    show = false

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

По умолчанию git использует less как пейджер. Обычно я предпочитаю больше, так как он напечатает первую страницу, а затем позволит вам прокручивать содержимое.

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

Если вы затем захотите передать контент по конвейеру, было бы неудобно прокручивать, чтобы распечатать все. Плюс в том, что вы сможете объединить его с конвейером, и он будет проходить через все, например.

# 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'

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

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

Для Windows это:

git config --global core.pager ""

Это отключит пейджинг для всего в git, в том числе очень надоедливый в git branch.

Я удивлен, что еще не видел этого ответа, но просто:

      PAGER= git diff ...

Приложение A. Я работаю в macOS и используюzsh, не уверен, что это что-то меняет.
Приложение B. Как уже отмечалось, это не лучшее решение, если вы хотите использовать его как часть скрипта или неконтролируемой среды, где$GIT_PAGERможет быть установлено.

ЛУЧШАЯ пагинацияless -R -F -X

      # Global - all projects (if has no custom local pager)
git config --global core.pager '/usr/bin/less -R -F -X'

# Local - Only on project
git config core.pager '/usr/bin/less -R -F -X'

Для быстрого и грязного сценария, который я написал, я сделал это так:

PAGER=cat git diff ...

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

Например, у меня в качестве пейджера git по умолчанию настроена дельта , но я могу создать lessdiff такой псевдоним, для случаев, когда я хочу использовать less вместо.

      [alias]
    lessdiff = -c core.pager=less diff
git -P diff

Или --no-pager.

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

git diff --color=always | cat
Другие вопросы по тегам