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

Lak*_*sad 580 git

是否有一个命令行开关传递给默认情况下git diff使用less寻呼机的其他命令?

我知道我可以将它传递给cat,但这会删除所有语法高亮显示.

我知道我可以将全局.gitconfig中的寻呼机设置为cat by GITPAGER=cat(或类似的东西); 但我想有时候有寻呼机(取决于差异的大小).

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

Ign*_*ams 635

--no-pager到git会告诉它不要使用寻呼机.将选项传递-F给less会告诉它如果输出适合单个屏幕则不会页面.

用法:

git --no-pager diff
Run Code Online (Sandbox Code Playgroud)

评论中的其他选项包括:

# 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
Run Code Online (Sandbox Code Playgroud)

  • 请记住,您必须在*命令之前添加--add-pager*,如"git --no-pager log --format = blah" (69认同)
  • 或者使用GIT_PAGER或PAGER环境变量,或者使用`core.pager` git config变量. (41认同)
  • 请注意,如果要在别名中包含`--no-pager`,则必须在命令前加上它,并且为了避免错误,您必须创建一个这样的别名:`git config alias.foo'! git --no-pager foo'`.有点混乱.简单地别名为''--no-pager foo'`将无效. (8认同)
  • 此外,如果您的终端在退出后退出屏幕,则您需要在`less`选项中添加`-E`以使'-F`可用. (6认同)
  • 谢谢,我想我可以将git --no-pager别名改为.bashrc中的gitc,对吧? (3认同)
  • @JimStewart 我发现 `git config alias.foo '-c core.pager=cat foo'` 工作得很好。但正如您所指出的,它直接抱怨“--no-pager foo”。 (2认同)
  • `--no-pager` 也可以缩写为 `-P` (2认同)

ish*_*aaq 243

如前所述,-F如果内容少于一个屏幕,则将选项传递给less会导致其退出,但是在这样做之后屏幕重置并且您最终没有看到内容,该less选项会消除该行为.因此,我使用以下内容根据内容量启用条件分页:

git config --global --replace-all core.pager "less -F -X"
Run Code Online (Sandbox Code Playgroud)

  • 注意:我必须在git`1.8.0.2`中使用`git config --global --add core.pager"less -F -X"`,上面的那个不起作用. (41认同)
  • 大!另外,为了使它不仅使用git,而且所有程序都添加了类似`export LESS =" - RFX"`到你的`.bashrc`或`.zshrc`的行为. (6认同)
  • 截至 2017 年 12 月,如果您使用的是 530 版本以下或更高版本,则不需要 `-X`,[这里是 unix SE 的一篇文章解释了这一点](https://unix.stackexchange.com/a/107355/ 121116)。`less -F` 将产生所需的行为。 (3认同)

gee*_*ekQ 153

使用

git config --global core.pager cat
Run Code Online (Sandbox Code Playgroud)

为所有存储库的所有命令摆脱寻呼机.

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

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

  • 这可能是扩展解释所要求的,但这是我正在寻找的,它是谷歌的最佳结果之一,所以感谢@geekQ (8认同)

Von*_*onC 69

文档中最近的更改提到了删除less("默认选项" FRSX)的默认选项的不同方法.

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

git config --global --replace-all core.pager 'less -+F -+X'
Run Code Online (Sandbox Code Playgroud)

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

export LESS="$LESS -FRXK" 
Run Code Online (Sandbox Code Playgroud)

所以我得到彩色差异Ctrl-C退出less.

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

less支持水平滚动,因此当切断线时,较少禁用quit-if-one-screen,以便用户仍然可以向左滚动文本以查看截断的内容.


这些修改在git 1.8.x中已经可见,如" 始终使用寻呼机git diff "中所示(参见注释).但文档刚刚改写(对于git 1.8.5或1 .9 ,2013年第4季度).

用于Git命令的文本查看器(例如,'less').
该值应由shell解释.

优先顺序是:

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

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

如果要有选择地覆盖Git的默认设置LESS,可以设置core.pager为egless -+S.
这将由Git传递给shell,它将最终命令转换为LESS=FRSX less -+S.环境告诉命令设置S切断长行的选项,但命令行将其重置为默认值以折叠长行.


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

config:重写core.pager文档

该文提到core.pagerGIT_PAGER没有给出优先权的整体情况.从git var(1)文档中借用更好的描述.

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

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


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

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

默认情况下,Git过去设置$LESS-FRSXif $LESS不是由用户设置的.
FRX旗实际意义GIT中(F以及X因为有时输出Git的管道少是短暂的,R因为Git的管道彩色输出).
S标志(剁长线),在另一方面,是不相关的GIT中和是用户偏好的问题.Git不应该决定用户更改LESS默认值.

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

-old code;
+new good code; [... lots of tabs ...] malicious code;
Run Code Online (Sandbox Code Playgroud)

看起来与以下相同:

-old code;
+new good code;
Run Code Online (Sandbox Code Playgroud)

喜欢旧行为的用户仍然可以-FRSX明确地设置$ LESS环境变量,或者将core.pager设置为' less -S'.

文档将为:

环境不设置S选项,但命令行会设置,指示较少截断长行.
同样,设置core.pagerless -+FF从命令行停用环境指定的选项,停用" quit if one screen"的行为less.
可以专门为特定命令激活某些标志:例如,设置pager.blameless -S仅启用行截断git blame.

  • 谢谢谢谢!我一直在寻找一种方法让git停止为MONTHS切断长线! (2认同)
  • 谢谢.这让我想出我想要导出LESS ="$ LESS -FRXK",这样我就可以从较少的ctrl-c退出彩色差异. (2认同)

mta*_*med 51

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

git config --global pager.diff false
Run Code Online (Sandbox Code Playgroud)

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

git config --global core.pager ''
Run Code Online (Sandbox Code Playgroud)

在我看来,这比设置它更好cat.


Ste*_*tex 10

关于管道时的残疾颜色:

使用--color以避免着色被禁用.

git diff --color | less -R

或者强制配置它(例如.gitconfig):

[color]
        ui = on
Run Code Online (Sandbox Code Playgroud)

git diff | less -R

对于非颜色工具,请使用:

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

导出环境变量LESS=-R(例如.bashrc)默认情况下以"less"打开颜色支持:

git diff | less

  • 请注意,如果未设置,git会在调用寻呼机时将`LESS`环境变量设置为`FRSX`. (2认同)

jco*_*and 9

这对我来说适用于Linux中的git版本2.1.4:

git config --global --replace-all core.pager cat
Run Code Online (Sandbox Code Playgroud)

这使得git使用cat而不是less. cat只是将输出转储diff到屏幕上而没有任何分页.

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

Jos*_*eek 7

您可以使用pager.alias自己的寻呼机为diff添加别名,如下所示:

[alias]
  dc = diff
  dsc = diff --staged
[pager]
  dc = cat
  dsc = cat
Run Code Online (Sandbox Code Playgroud)

这将保持颜色,并在'git dc'调用时使用'cat'作为寻呼机.

另外,不要做的事情:

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


dan*_*ann 6

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

git config --global --add alias.n '!git --no-pager'
Run Code Online (Sandbox Code Playgroud)

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

n = !git --no-pager
Run Code Online (Sandbox Code Playgroud)

这意味着您可以使用前缀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
Run Code Online (Sandbox Code Playgroud)

  • -P 也没有寻呼机 (8认同)

Is *_* Ma 6

正如man git上所说,您可以--no-pager在任何命令上使用。

我使用它:

git --no-pager diff
git --no-pager log --oneline --graph --decorate --all -n 10
Run Code Online (Sandbox Code Playgroud)

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


sek*_*kmo 5

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

[pager]
    diff = false
    show = false
Run Code Online (Sandbox Code Playgroud)


小智 5

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

env_default 'LESS' '-R'
Run Code Online (Sandbox Code Playgroud)


pat*_*rik 5

默认情况下,git 使用 less 作为分页器。我通常更喜欢更多,因为它会打印第一页,然后允许您滚动浏览内容。

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

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

# Find the commit abcdef123 in the full commit history and read author and commit message
git log |grep -C 5 'abcdef123'
Run Code Online (Sandbox Code Playgroud)

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

git config --global core.pager 'more'
Run Code Online (Sandbox Code Playgroud)