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


637

默认情况下git diff,是否存在要传递给命令行的命令行开关以及其他使用less寻呼机的命令?

我知道我可以将其通过管道传递给cat,但是这样可以删除所有语法突出显示。

我知道我可以将全局.gitconfig中的传呼机设置为cat by GITPAGER=cat(或类似方式);但我有时想传呼(取决于diff的大小)。

但是,如果有的话,我希望使用命令行开关。我找不到手册页中的内容。


16
注意:core.pager 'less -+F -+X'这是删除这些选项的最新方法。请参阅下面的答案
VonC

“ less-+ F-+ X”是删除长日志中烦人的“ ...跳过...”标记的神奇设置。非常感谢您的选择,您节省了我的时间!
Guillaume Perrot


请参阅相关的问题上使用lessGit的(有异依赖less版本):unix.stackexchange.com/questions/107315/...
Pierz

Answers:


688

--no-pagerGit会告诉它不要使用寻呼机。如果将输出传递给单个屏幕-Fless则传递选项to 将告诉它不分页。

用法:

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别名为.bashrc中的gitc,对吗?
Lakshman Prasad '02

42
或使用GIT_PAGER或PAGER环境变量,或core.pagergit config变量。
JakubNarębski10年

74
请记住,您必须命令添加--add-pager ,例如“ git --no-pager log --format = blah”
Ana Betts

6
另外,如果您的终端在退出后少了一点,则您希望将其添加-Eless选项中以使其-F可用。
mgalgs 2011年

9
请注意,如果要包含--no-pager别名,则必须在命令前加上前缀,为避免错误,必须创建如下别名:git config alias.foo '!git --no-pager foo'。有点令人困惑。只是简单地使用别名是'--no-pager foo'行不通的。
吉姆·斯图尔特

270

如前面提到的那样,如果内容少于一个屏幕,则将-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上面的那个没有用。
Dogbert,

7
大!也要使其不仅在git中export LESS="-RFX".bashrc.zshrc
起作用,

这次真是万分感谢; 我一直受制于一个选项,其中git会截断输出中的第一行,然后失去同步,以至于先下降一行然后再上升一行会导致正确的第一行占据顶部,然后是正确输出的第三行。无论如何,指定此选项可以解决该问题。好奇怪
蒂姆·哈珀

如果使用Git For Windows(使用的Greenwood Software构建的较少),则您需要的参数为-E(来源:greenwoodsoftware.com/less/faq.html#dashe
Gavin Ward

1
是的,正如我在回答中所解释的,我希望在寻呼机启动和退出之前和之后都不要重设屏幕,特别是如果所有屏幕都适合一个屏幕时,正是-X这样。如果您不喜欢它,请不要使用它。我之所以喜欢它,是因为这样我可以通过查看历史记录中以前的git命令的结果来引用诸如git SHA之类的东西,而无需再次键入命令。每个人都自己。
ishaaq

168

采用

git config --global core.pager cat

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

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

查看man git-config并搜索pager.<cmd>详细信息。


问题不是如何完全禁用寻呼机,而是如何为grep子命令禁用寻呼机。mtahmed的答案是完美的。
TilmanBaumann 2014年

9
这可能是扩展解释所要的,但这是我一直在寻找的东西,它是Google最好的搜索结果之一,因此感谢@geekQ
Brian F Leighty 2015年

70

文档中的最新更改提到了一种删除的默认选项的不同方式less(“默认选项”为FRSX)。

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

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

例如,Dirk Bester 在评论中建议:

export LESS="$LESS -FRXK" 

这样我就Ctrl-C从退出了less

威尔逊˚F提到的意见,并在他的问题是:

less支持水平滚动,因此当切掉线条时,less禁用了“如果一个屏幕退出”功能,以便用户仍然可以向左滚动文本以查看被切掉的内容。


这些修改已经在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.pagerless -+S
这将由Git传递到shell,它将最终命令转换为LESS=FRSX less -+S。环境告诉命令将S选项设置为砍掉长行,但是命令行将其重置为默认值以折叠长行。


有关新文档措辞的原因,请参见commit 97d01f2a

配置:重写core.pager文档

案文中提到的内容core.pagerGIT_PAGER没有给出总体的优先顺序。从git var(1)文档中借用更好的描述。

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

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


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

传呼机:默认情况下,从$ LESS中删除“ S”

默认情况下,Git曾经设置$LESS-FRSX如果$LESS用户未设置。
这些FRX标志对于Git实际上是有意义的(F并且X因为有时输出Git传递到less会很短,并且R Git的输出彩色的)。
S标志(剁长线),在另一方面,是不相关的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.pagerless -+F将会F从命令行停用环境指定的选项,从而停用的quit if one screen行为less
可以专门为某些命令激活一些标志:例如,设置pager.blameless -S仅对启用行截断git blame


2
谢谢谢谢!我一直在寻找一种使git不再为MONTHS砍掉长线的方法!
coredumperror 2014年

@CoreDumpError注意:默认情况下,下一个Git(2.0.X或2.1)不会将行砍掉!请参阅上方我编辑的答案。
VonC 2014年

2
谢谢。这让我知道要导出LESS =“ $ LESS -FRXK”,以便使用ctrl-c从更少的地方退出彩色差异。
德克·贝斯特2015年

@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)
Ashley Coolman

这就是我想要的,因为其他命令完全禁用了寻呼机,但这是唯一禁用的选项,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


2
请注意,如果未设置git ,则它将在调用分页器时将LESS环境变量FRSX设置为。
tobbez 2012年

10

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

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

这使得Git使用cat而不是lesscat只是将输出内容转储diff到屏幕上而没有任何分页。


通常,如果答案包括对代码意图的解释,以及为什么不引入其他代码就能解决问题的原因,则答案会更有帮助。(此帖子已由至少一个用户标记,大概是因为他们认为应删除无解释的答案。)
Nathan Tuggy 2015年

3
@NathanTuggy我认为很明显,我正在回答所问的问题。似乎有些用户喜欢四处奔波地标记简短的答案,以求有趣。我将添加一些文本。
jcoffland 2015年

7

您可以使用pager.alias使用自己的分页器向diff添加别名,如下所示:

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

这将保持颜色不变,并在“ git dc”处调用时将“ cat”用作寻呼机。

另外,不要做的事情:

  • 采用 --no-pager在您的别名中。Git(1.8.5.2,Apple Git-48)会抱怨您正在尝试修改环境。
  • 将外壳程序与!sh或一起使用!git。这将绕过上面的环境错误,但会将您的工作目录(出于此命令的目的)重置为顶级Git目录,因此,如果您已经在以下目录的子目录中,则对本地文件的任何引用将不起作用您的存储库。

+1当您想在之后通过commit导航git log而不是时,此技术很有用git log --oneline。使用和pager.log = less -FXR +/^commit.*,同时--onelinealias.l1 = log --oneline和设置选项的大小写pager.l1 = less -FXR
克劳迪奥

6

我身上有这个大块,.gitconfig似乎工作正常(对diff和show都禁用):

[pager]
    diff = false
    show = false

4

当我知道输出不是很长时,我不时禁用分页。为此,我发现了一个使用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做到相同但更可靠。
Matthieu Moy

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'

嘿,我认为OP希望有一个命令行开关来与git diff一起使用一次,而不是一个永久的全局解决方案。另外,我不知道修改oh-my-zsh源代码有多好,因为以后很难更新oh-my-zsh。最好在.zshrc文件中设置该默认值。
卡里·拉辛马基(KarriRasinmäki)

1
谢谢,你是对的。如果使用oh-my-zsh并需要永久的全局解决方案,则可以unset LESS在.zshrc的末尾添加 。
慢雨

1

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

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

如果随后要管道传输内容,则滚动以打印所有内容将很不方便。拥有更多好处的是,您将能够将其与管道结合使用,并且它将通过所有管道进行管道传输,例如。

# 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
git -P diff

要么 --no-pager

顺便说一句:与猫保持颜色

git diff --color=always | cat

0

请按照以下说明进行操作。

  1. 只需输入 vi ~/.gitconfig您的终端即可。
  2. LESS="-F -X $LESS"线。
  3. :wq并输入。
  4. 重新启动终端。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.