如何防止“git diff”使用寻呼机?

是否有命令行开关可以传递给git diff和其他默认使用less寻呼机的命令?我知道这些方法存在:

  • git diff | cat…删除所有语法突出显示
  • git config --global core.pager cat将全局. gitconfig中的寻呼机设置为cat
  • export GIT_PAGER=cat

但我更喜欢命令行开关。

186345 次浏览

--no-pager到Git会告诉它不要使用分页器。如果输出适合单个屏幕,传递选项-Fless会告诉它不要分页。

用法:

git --no-pager diff

评论中的其他选项包括:

# Set an evaporating environment variable to use 'cat' for your pagerGIT_PAGER=cat git diff
# Tells 'less' not to paginate if less than a pageexport LESS="-F -X $LESS"# ...then Git as usualgit diff

使用

git config --global core.pager cat

以摆脱所有存储库的所有命令的寻呼机。

您还可以通过使用pager.<cmd>设置而不是core.pager来禁用单个Git子命令的分页,并且您可以更改每个Git存储库的设置(省略--global)。

请参阅man git-config并搜索pager.<cmd>以获取详细信息。

关于管道时禁用的颜色:

使用--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

如前所述,如果内容少于一个屏幕,将-F选项传递给less会导致它退出。然而,这样做后,屏幕被重置,你最终看不到内容。

-X选项取消了这种行为。因此,我使用以下内容来启用基于内容量的条件分页:

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

最近在留档中的更改提到了删除less默认选项的不同方法(“默认选项”为FRSX)。

对于这个问题,这将是(git 1.8+)

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

例如,DirkBester表示在评论

export LESS="$LESS -FRXK"

所以我得到颜色差异与Ctrl-C退出less

Wilson F提到在评论,在他的问题中:

less支持水平滚动,因此当行被截断时,less禁用退出如果一个屏幕,以便用户仍然可以向左滚动文本以查看被截断的内容。


这些修改在git 1.8. x中已经可见,如“始终使用#0的寻呼机”所示(参见注释)。但留档刚刚重新措辞(对于git 1.8.5或1.9,2013年第四季度)。

Git命令使用的文本查看器(例如,'less')。
该值将由shell解释。

优先顺序为:

  • $GIT_PAGER环境变量,
  • 然后core.pager配置,
  • 然后$PAGER
  • 然后是在编译时选择的默认值(通常是“less”)。

LESS环境变量未设置时,Git将其设置为FRSX
(如果设置了LESS环境变量,Git根本不会改变它)。

如果您想选择性地覆盖Git对#0的默认设置,您可以将#1设置为例如#2
这将通过Git传递给shell,Git将最终命令转换为LESS=FRSX less -+S。环境告诉命令设置S选项以砍掉长行,但命令行将其重置为默认值以折叠长行。


请参阅提交97d01f2a了解新留档措辞背后的原因:

配置:重写core.pager留档

文中提到了core.pagerGIT_PAGER,但没有给出优先级的总体情况。从#2(1)留档中借用更好的描述。

使用该机制来允许系统范围、全局和每个存储库的配置文件不仅限于此特定变量。删除它以澄清段落。

重写解释环境变量LESS如何设置为Git的默认值以及如何有选择地自定义它的部分。


注意:提交b327583Matthieu Moy#0,2014年4月,对于git 2.0. x/2.1,2014年第三季度)将默认删除S:

pager:默认从$LESS中删除'S'

默认情况下,如果用户未设置$LESS,Git用于将$LESS设置为-FRSX
FRX标志实际上对Git有意义(FX是因为有时Git管道到less的输出很短,R是因为Git管道着色输出)。
另一方面,S标志(砍掉长行)与Git无关,是用户偏好的问题。Git不应该决定让用户更改#1的默认值.

更具体地说,S标志会伤害在寻呼机中查看不受信任代码的用户,因为补丁看起来像:

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

似乎与:

-old code;+new good code;

喜欢旧行为的用户仍然可以将$LESS环境变量显式设置为-FRSX,或将core.pager设置为“less -S”。

留档内容如下:

环境没有设置S选项,但命令行设置了,指示less截断长行。
类似地,将core.pager设置为less -+F将停用环境从命令行指定的F选项,停用less的“quit if one screen”行为。
可以为特定命令专门激活一些标志:例如,将pager.blame设置为less -S仅对git blame启用行截断。

您可以添加一个别名来使用pager.alias与自己的寻呼机进行差异,如下所示:

[alias]dc = diffdsc = diff --staged[pager]dc = catdsc = cat

这将保持颜色打开,并在“git dc”调用时使用“cat”作为寻呼机。

没有要做的事情:

  • 在别名中使用--no-pager。Git(1.8.5.2,Apple Git-48)会抱怨您试图修改环境。
  • 使用带有!sh!git的shell。这将绕过上面的环境错误,但它会将您的工作目录(就此命令而言)重置为顶级Git目录,因此如果您已经在存储库的子目录中,则对本地文件的任何引用都将不起作用。

您还可以为全局配置中的特定输出禁用/启用寻呼机:

git config --global pager.diff false

或者要设置core.pager选项,只需提供一个空字符串:

git config --global core.pager ''

在我看来,这比你说的将其设置为cat要好。

这适用于我在Linux上的Git版本2.1.4:

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

这使得Git使用cat而不是lesscat只是将diff的输出转储到屏幕而不进行任何分页。

对于我写的一个快速而肮脏的脚本,我是这样做的:

PAGER=cat git diff ...

当我知道输出不是很长时,我喜欢不时禁用分页。为此,我发现了一个使用Git别名的巧妙技巧:

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

或者将以下内容添加到~/. gitconfig的[alias]部分:

n = !git --no-pager

这意味着您可以使用前缀n关闭任何Git命令的分页,即:

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

正如它在mangit上所说,您可以在任何命令上使用--no-pager

我用它在:

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

然后使用别名来避免使用(和记住)长命令。

我在我的.gitconfig中有这个大块头,它似乎工作正常(禁用diff和show):

[pager]diff = falseshow = false

如果您使用oh-my-zsh,在~/.oh-my-zsh/lib/misc.zsh文件中,注释这行:

env_default 'LESS' '-R'

对于Windows,它是:

git config --global core.pager ""

这将关闭git中所有内容的分页,包括git branch中超级烦人的分页。

git -P diff

或者--no-pager

BTW:用猫保存颜色

git diff --color=always | cat

默认情况下,git使用较少的寻呼机。我通常更喜欢更多,因为它将打印第一页,然后允许您滚动浏览内容。

此外,完成后内容将保留在控制台中。这通常很方便,因为您经常想在查找后对内容做一些事情(例如,发送电子邮件给提交者并告诉他他在上次提交中引入了一个bug)。

如果您想管道内容,滚动以打印所有内容会很不方便。更多的好处是您将能够将其与管道结合起来,它将管道通过所有内容,例如。

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

基本上,您只需要更多,除非您不希望内容在完成后保留在控制台中。要使用更多,请执行以下操作。

git config --global core.pager 'more'

只要按照下面的指示。

  1. 只需在终端中输入vi ~/.gitconfig
  2. 粘贴LESS="-F -X $LESS"行。
  3. :wq并输入。
  4. 重新启动您的终端。

与此相关,如果您设置了默认分页器,并且想要创建使用不同分页器的别名,则可以使用-c选项将配置参数传递给一个命令。

例如,我将delta配置为我的默认git寻呼机,但我可以像这样创建lessdiff git别名,以防我想使用less

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

最佳分页是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 projectgit config core.pager '/usr/bin/less -R -F -X'