有没有一种命令行开关可以传递给 git diff
和默认使用 less
分页器的其他命令呢?我知道存在以下方法:
git diff | cat
... 去除所有语法高亮git config --global core.pager cat
将全局 .gitconfig 中的分页器设置为cat
export GIT_PAGER=cat
但我更喜欢一种命令行开关。
有没有一种命令行开关可以传递给 git diff
和默认使用 less
分页器的其他命令呢?我知道存在以下方法:
git diff | cat
... 去除所有语法高亮git config --global core.pager cat
将全局 .gitconfig 中的分页器设置为cat
export GIT_PAGER=cat
但我更喜欢一种命令行开关。
--no-pager
告诉Git不要使用分页器。将选项-F
传递给less
将告诉它如果输出适合单个屏幕,则不要分页。
确保在命令之前添加--no-pager
或-P
,例如git --no-pager log...
。
用法:
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
# short option alternative
git -P diff
core.pager
git配置变量。 - Jakub Narębski--no-pager
,则需要在命令前面加上它。为了避免错误,您需要像这样创建别名:git config alias.foo '!git --no-pager foo'
。有点令人困惑。简单地将别名设置为'--no-pager foo'
是行不通的。 - Jim Stewart--no-pager
can also be shortened to -P
- Alex Jasmin如先前的回答所提到的,将-F
选项传递给less
会在内容少于一个屏幕时退出。然而,在这样做后,屏幕会被重置,导致无法看到内容。
-X
选项可以取消这种行为。因此,我使用以下命令根据内容量启用条件分页:
git config --global --replace-all core.pager "less -F -X"
git config --global --add core.pager "less -F -X"
,上面那个命令不起作用。 - Dogbert.bashrc
或.zshrc
文件中添加类似于export LESS="-RFX"
的内容。 - defhlt使用
git config --global core.pager cat
为了在所有仓库的所有命令中摆脱分页,您可以使用core.pager
而不是使用单个Git子命令禁用分页,并且您可以按Git存储库更改设置(省略--global
)。有关详细信息,请参见man git-config
并搜索pager.<cmd>
。git log
,那将是非常糟糕的。更糟糕的是,如果执行 git log -p
,你会看到所有提交的差异被倒入到你的终端中。 - Ethergit config --global pager.diff false
或者设置core.pager选项,只需提供一个空字符串:
git config --global core.pager ''
在我看来,这比你说的设置为cat
要好。
git version 2.5.4 (Apple Git-61)
。 - Ashley Coolmangit diff
的答案,同时让它在其他命令中继续工作。 - SingleNegationEliminationcode "$($env:UserProfile)\.gitconfig"
并在 [core]
设置下添加 pager =
。这个答案对于我的当前 powershell 会话起作用,但似乎没有将设置保存在任何地方,因此在下次启动时仍然有效。 - No Refunds No Returnsgit config --global pager.log "less -F -X"
或类似命令。 - Clucking Turtlegit config --global core.pager ""
。 - wovanoless
的默认选项(“默认选项”是FRSX
)。git config --global --replace-all core.pager 'less -+F -+X'
export LESS="$LESS -FRXK"
less
并获得有颜色的差异。 Wilson F在评论中和他的问题中提到,less支持水平滚动,因此当行被截断时,less会禁用“如果只有一页则退出”,使用户仍然可以向左滚动文本以查看被截断的内容。
git diff
" 所示(请参见评论)。但是文档刚刚重新措辞(适用于 Git 1.8.5 或 1.9,Q4 2013)。
用于 Git 命令(如 'less')的文本查看器。
这个值旨在由 shell 解释。优先顺序是:
$GIT_PAGER
环境变量,- 然后是
core.pager
配置,- 再是
$PAGER
,- 最后是编译时选择的默认设置(通常是 'less')。
当未设置
LESS
环境变量时,Git 会将其设置为FRSX
(如果已设置LESS
环境变量,则 Git 不会对其进行更改)。如果您想有选择地覆盖 Git 的
LESS
默认设置,则可以将core.pager
设置为例如less -+S
。
Git 将把此设置传递给 shell,shell 将其转换为LESS=FRSX less -+S
。环境告诉命令将S
选项设置为截断长行,但命令行将其重置为默认值以折叠长行。
请参阅提交 97d01f2a,了解新文档措辞背后的原因:
core.pager
文档文本提到了
core.pager
和GIT_PAGER
,但没有给出其优先级的整体概述。借鉴git var
(1)文档中更好的描述。使用机制允许全局、全局和每个仓库的配置文件,并不仅限于特定变量。删除它以澄清段落。
重写部分,解释环境变量
LESS
如何设置为Git的默认值,以及如何选择性地自定义它。
moy
,2014年4月,适用于git 2.0.x/2.1,2014年第三季度)将默认删除 $LESS 中的 'S':
文档将会这样说明:By default, Git used to set
$LESS
to-FRSX
if$LESS
was not set by the user.
TheFRX
flags actually make sense for Git (F
andX
because sometimes the output Git pipes to less is short, andR
because Git pipes colored output).
TheS
flag (chop long lines), on the other hand, is not related to Git and is a matter of user preference. Git should not decide for the user to changeLESS
's default.More specifically, the
S
flag harms users who review untrusted code within a pager, since a patch looking like:
-old code; +new good code; [... lots of tabs ...] malicious code;
would appear identical to:
-old code; +new good code;
Users who prefer the old behavior can still set the $LESS environment variable to
-FRSX
explicitly, or set core.pager to 'less -S
'.
环境变量没有设置
S
选项,但是命令行设置了该选项,指示 less 截断长行。
同样地,将core.pager
设置为less -+F
将会禁用来自命令行的环境中指定的F
选项,禁用了less
的 "一屏退出
" 行为。
可以针对特定的命令明确激活某些标志:例如,将pager.blame
设置为less -S
仅为git blame
启用行截断。
less
设置为<1屏幕退出并且不剪切行(即less -F -+S
)时,运行日志命令后我会回到命令提示符。然而,如果我剪切行(即删除-+S
),并且任何行被剪切,则在结束时,它不会立即退出,而是打印“END”并等待我按q
键。是否有一种方法可以剪切行并仍然在不到一屏幕的时间内自动退出less
? - Wilson Fless
支持水平滚动(也许每个人都知道这一点,但我不知道),因此当行被截断时,less
禁用了quit-if-one-screen
,以便用户仍然可以向左滚动文本以查看被截断的内容。 - Wilson F我在Linux上使用的Git版本为2.1.4,以下方法对我有效:
git config --global --replace-all core.pager cat
这会使Git使用cat
代替less
。 cat
只是将diff
的输出直接显示在屏幕上,而没有分页。
关于管道时禁用颜色:
使用 --color
以避免颜色被禁用。
git diff --color | less -R
或者强制配置(例如在 .gitconfig 文件中):
[color]
ui = on
git diff | less -R
对于非彩色工具,请使用:
git diff --no-color | 某些基本工具
将环境变量 LESS=-R
导出(例如在 .bashrc 中)默认在"less"中打开颜色支持:
git diff | less
LESS
环境变量,则在调用分页器时,git将其设置为FRSX
。 - tobbez有时候我想禁用分页,特别是当我知道输出内容不是很长的时候。为此,我发现使用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 pager
git n log -n 3 # Show the last three commits without pager
git n show v1.1 # Show information about a tag
您可以使用 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
的 shell。这将绕过上述环境错误,但它将重置您的工作目录(对于此命令而言)到顶级 Git 目录,因此如果您已经在存储库的子目录中,则任何对本地文件的引用都将无法正常工作。正如“man git”所述,您可以在任何命令中使用--no-pager
。
我在以下命令中使用它:
git --no-pager diff
git --no-pager log --oneline --graph --decorate --all -n 10
然后使用别名来避免使用(和记忆)长命令。
core.pager 'less -+F -+X'
是一种更近期的方法来去除这些选项。请参考我的回答。 - VonCless
的相关问题(这取决于less
版本):https://unix.stackexchange.com/questions/107315/less-quit-if-one-screen-without-no-init - Pierz