2010-02-02 251 views
403

是否有一个命令行开关传递给git diff以及默认使用less传呼机的其他命令?如何防止使用寻呼机的git diff?

我知道我可以管它给猫,但是这会删除所有的语法高亮。

我知道我可以通过GITPAGER=cat(或类似的东西)设置的寻呼机在全球的.gitconfig猫;但我想有时传呼机(取决于diff的大小)。

但是,我更喜欢命令行开关,如果有的话;我无法找到一个,通过手册页。

+10

注意:'core.pager'less - + F - + X''是一种更新的方法来删除这些选项。请参见[我的答案](http://stackoverflow.com/a/18781512/6309)。 – VonC 2013-09-13 08:19:11

+0

“less - + F - + X”是去除长日志中令人讨厌的“......跳过......”标记的魔法设置。非常感谢这些选项,您拯救了我的一天! – 2014-05-12 09:04:36

回答

442

--no-pager git会告诉它不使用寻呼机。 -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 
+3

谢谢,我想我可以将git --no-pager别名为.bashrc中的gitc,对吧? – 2010-02-02 12:50:55

+0

我不明白为什么不。我不知道如果用于一个根本不需要寻呼机的谓词,它会如何反应。 – 2010-02-02 12:53:14

+34

或使用GIT_PAGER或PAGER环境变量或'core.pager' git配置变量。 – 2010-02-02 14:43:06

109

使用

git config --global core.pager cat 

获得对所有库中的所有命令摆脱寻呼机。

您还可以通过使用pager.<cmd>设置而不是core.pager,你可以改变每git仓库的设置(省略--global)禁用分页单git的子命令。

man git-config和搜索pager.<cmd>了解详情。

+0

问题不在于如何完全禁用寻呼机,而是如何为grep子命令禁用它。 mtahmed的答案是完美的。 – TilmanBaumann 2014-10-06 12:46:33

+3

这可能是什么扩展的解释问,但这是我一直在寻找的,这是谷歌的最好结果之一,所以谢谢@geekQ – 2015-12-30 13:57:49

7

关于禁用颜色时管道:

使用--color避免着色被禁用。

git diff --color | less -R

或配置它逼上(如中的.gitconfig):

[color] 
     ui = on 

git diff | less -R

对于非彩色的工具,然后使用:

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

导出e环境变量LESS=-R(例如, .bashrc)中的“少”打开色彩支持默认:

git diff | less

+2

请注意,git将设置'LESS'环境变量为'FRSX'时调用寻呼机,如果未设置。 – tobbez 2012-09-27 15:42:48

170

如前所述前面的回答,传递-F选项较少导致其退出,如果含量小于一个屏幕,但是之后这样做屏幕重置,你最终没有看到内容,-X选项会消除该行为。所以,我用下面的基于内容的数量,使有条件的分页:

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

注意:我不得不在'git'1.8.0.2'中使用'git config --global --add core.pager'less -F -X“',上面的那个不起作用。 – Dogbert 2013-01-31 07:23:43

+3

太棒了!另外,为了使它不仅适用于git,而且所有程序都会在''.bashrc'或'.zshrc'中添加'export LESS =“ - RFX”'' – defhlt 2014-10-13 19:07:33

+0

谢谢!我一直困扰着git会从输出中截断第一行的选项,然后失去同步,使得沿着一条线然后向上一条线会导致正确的第一行占据顶部,接着是正确输出的第三行。无论如何,指定这个选项解决了这个问题。太离奇了。 – 2015-01-26 20:40:34

51

最近文档中的变化更不用说消除对less默认选项(“默认选项”是FRSX)的方式不同。

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

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

例如,Dirk Bester建议in the comments

export LESS="$LESS -FRXK" 

,这样我会涂有颜色差异与按Ctrl-C退出less

Wilson F提到in the commentshis question在于:

较少支持水平滚动,因此,当线被切掉,少禁用退出-IF-一个屏幕,使得用户仍然可以滚动文本到左边看看什么被切断了。


这些修改是在git的1.8.x的已经显现,如 “Always use the pager for git diff”(见注释)所示。 但是文档刚被重新编写(for git 1.8.5 or 1.9, Q4 2013)。

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

偏好的顺序是:

  • $GIT_PAGER环境变量,
  • 然后core.pager配置,
  • 然后$PAGER
  • 然后在编译时选择的缺省(通常是 '少' )。

LESS环境变量未设置,Git的将其设置为FRSX
(如果LESS环境变量设置,Git不会改变它在所有)。

如果您想有选择地覆盖Git的默认设置LESS,您可以将core.pager设置为例如less -+S
这将通过Git传递给shell,它将最终命令转换为LESS=FRSX less -+S。环境通知命令设置S选项以削减长行,但命令行将其重置为默认值以折叠长行。


新文件措词背后的原因见commit 97d01f2a

配置:改写core.pager文件

文提到core.pagerGIT_PAGER没有给予优先的大局。从git var(1)文档借用更好的描述。

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

重写说明如何将环境变量LESS设置为Git的默认值以及如何选择性地对其进行定制的部分。


注:commit b327583Matthieu Moy moy,2014年4月,为git的2.0.x版本/ 2.1,Q3 2014)将在默认情况下删除S:

寻呼机:从$ LESS通过删除 'S'默认

Git默认用于设置$LESS-FRSX如果$LESS不是由用户设定。
FRX flags实际上对Git有意义(FX,因为有时输出的Git管道更短,而且因为Git管道颜色输出,所以R)。
另一方面,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选项,去激活的less的“quit if one screen”的行为。
可以特别激活某些特定命令的标志:例如,将pager.blame设置为less -S仅启用git blame的行截断。

+2

谢谢,谢谢!我一直在寻找一种方法来让git停止为MONTHS排长队! – CoreDumpError 2014-01-06 20:10:43

+0

@CoreDumpError注意:下一个Git(2.0.X或2.1)不会在默认情况下切成线**!看到我上面编辑的答案。 – VonC 2014-07-27 06:46:40

+2

谢谢。这让我知道我想要导出LESS =“$ LESS -FRXK”,这样我就可以通过ctrl-c从较小的值退出而获得彩色差异。 – 2015-01-27 03:14:11

5

可以别名有自己的传呼机与pager.alias添加到差异,像这样:

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

这将保持颜色上,当在“调用使用“猫”的寻呼机git dc'。

而且,事情做:

  • 使用--no寻呼机在你的别名。 Git(1.8.5.2,Apple Git-48)会抱怨你正在尝试修改环境。
  • 使用带有!sh或!git的shell。这将绕过上面的环境错误,但会将您的工作目录(针对该命令的目的)重置为顶层git目录,因此如果您已经在您的子目录中,则对本地文件的任何引用都将不起作用回购。
24

您可以禁用/启用对全局配置特定输出寻呼机以及:

git config --global pager.diff false 

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

git config --global core.pager '' 

正如你所说,这在我看来比将它设置为cat更好。

+0

这就是我在Git 1.9上的工作......一切都没有奏效。 – 2015-08-02 13:19:33

+0

这是为我工作的那个'git version 2.5.4(Apple Git-61)' – 2016-02-18 14:47:51

+0

这就是我想要的,因为其他命令完全禁用了寻呼机,但这是唯一的答案,只禁用'git diff'同时让它为其他命令工作 – SingleNegationElimination 2017-12-09 21:44:44

7

这在Linux的工作对我来说与GIT版本2.1.4:

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

这使得Git的使用cat代替lesscat只是将diff的输出转储到屏幕上,无需分页。

+0

通常,如果答案包含解释代码意图做什么的解释,以及为什么解决问题而不介绍其他命令,则答案会更有帮助。 (这篇文章被至少一个用户标记,大概是因为他们认为没有解释的答案应该被删除。) – 2015-04-19 01:20:48

+1

@NathanTuggy我认为我很清楚,我正在回答所问的问题。看起来像一些用户喜欢跑来跑去标记简短的答案的乐趣。我会添加一些文字。 – jcoffland 2015-05-13 23:53:35

2

对于一个快速和肮脏的剧本我写的,我就是这么做的:

PAGER=cat git diff ... 
2

我想禁用分页不时,当我知道的输出也不是很长。对于这一点,我找到了一个巧妙的方法使用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