当我使用 git branch
命令列出所有分支时,我看到了 git branch | less
的输出。
命令 git branch
应该显示一个分支列表,就像 ls
对文件所做的那样。
这是我得到的输出:
https://i.stack.imgur.com/rh4td.png
如何获得 git branch
的默认行为?是什么导致分页输出?
我正在使用带有 oh_my_zsh
的 ZSH(那里没有 Git),我的 .gitconfig
看起来像这样:
[user]
email = myemail@mail.com
name = Dennis Haegler
[push]
default = simple
[merge]
tool = vimdiff
[core]
editor = nvim
excludesfile = /Users/dennish/.gitignore_global
[color]
ui = true
[alias]
br = branch
ci = commit -v
cam = commit -am
co = checkout
df = diff
st = status
sa = stash
mt = mergetool
cp = cherry-pick
pl = pull --rebase
[difftool "sourcetree"]
cmd = opendiff \"$LOCAL\" \"$REMOTE\"
[mergetool "sourcetree"]
cmd = /Applications/SourceTree.app/Contents/Resources/opendiff-w.sh
\"$LOCAL\" \"$REMOTE\" -ancestor \"$BASE\" -merge \"$MERGED\"
trustExitCode = true
如 comments to Mark Adelsberger's answer 中所述,这是默认行为更改 introduced in Git 2.16。
默认情况下,您可以使用 pager.branch
config setting 关闭 git branch
的分页输出:
git config --global pager.branch false
正如其他答案所指出的那样,对于大多数命令,Git 默认将自身通过管道传输到寻呼机(默认为 less
)。
不过,重要的一点是when the LESS environment variable is unset, Git sets it to FRX,其结果是用户可见的行为与命令输出较短时(即,如果您只有很少的分支)时不使用分页器的行为相同。参见man less:
-F 或 --quit-if-one-screen 如果整个文件可以显示在第一个屏幕上,则让 less 自动退出。 -R 或 --RAW-CONTROL-CHARS [...]ANSI“颜色”转义序列以“原始”形式输出。 -X 或 --no-init 禁止将 termcap 初始化和去初始化字符串发送到终端。如果去初始化字符串做了一些不必要的事情,比如清除屏幕,这有时是可取的。
如果您得到您描述的行为,您很可能已将 $LESS
设置为其他内容,取消设置 (unset LESS
) 将消除该问题,同时保持“寻呼机”行为以进行长时间输出。或者,您可以通过将其添加到您的 .gitconfig
文件中来激活行为,同时保持 $LESS
原样:
[core]
pager = less -FRX
如果您真的不喜欢寻呼机,可以全局或按命令停用它(请参阅其他答案)。
pager = less -FR
,因为选项 X
似乎禁用了鼠标滚动。
git config --global core.pager "less -FRX"
不是争论语义,而是你得到的行为是默认的。这就是为什么当你不要求不同的东西时你会得到它。默认情况下,branch
(和许多其他 Git 命令)在将输出发送到终端时使用寻呼机。
您可以使用 --no-pager
选项覆盖此默认值:
git --no-pager branch
或者,如果您将输出重定向到文件,Git 应该检测到它没有写入终端,因此无论如何都不应该使用寻呼机。 (另一方面,这暗示了一个脚本用例,在这种情况下,您应该考虑使用像 git for-each-ref
这样的管道命令而不是 git branch
。)
git --no-pager branch
有效。但是这一套怎么样?只有 PAGER
环境变量设置为 less
。这不是默认行为。我所有的大学都有一个输出作为列表打印到终端。
接受的答案似乎是错误的。有两个问题:
(默认配置的)bash 和 zsh 之间的行为实际上是不同的。 “问题”仅出现在 zsh 下。建议的解决方案将使 git branch 不总是使用寻呼机,当有大量输出时,这是不希望的。
真正的原因是 bash 和 zsh 对 LESS 有不同的默认定义:bash 没有定义任何东西,而 zsh 将它定义为 -R
。当我在 zsh 中执行 unset LESS
时,一切都恢复正常......
-R
行为可能仍然是需要的。在这种情况下,您可以将以下指令添加到您的 .zshrc 以保持一切正常:
export LESS=-FRX
-F
'如果整个文件可以显示在第一个屏幕上,则会导致 less 自动退出'。但是需要同时指定-X
,否则输出不足一屏时不会显示输出。
-R
。当我在zsh中执行unset LESS
时,一切都恢复正常......'至于是否发生这种情况,是默认配置的bash没有定义LESS,而默认配置的oh-my-zsh定义了LESS。我知道这一点是因为我在 macOS 中有完全相同的 oh-my-zsh 环境(就像提问者一样),我遇到了完全相同的问题。
export LESS=-FRX
修复了它!
这种 Git 行为对我来说也越来越烦人。例如,当我只想列出标签时,我在 less
中得到了我的标签列表。
也可以通过将默认的 Git PAGER 更改为 cat
而不是 less
来控制此行为。我宁愿在 iTerm 中滚动而不是在编辑器中滚动。我喜欢在需要时使用编辑器。
所以:
git config --global core.pager cat
git log
时它很烦人。我只是想念最初的行为,但没有时间从这个角度改进我的日常工作流程。
cat
和 less
:它是 bat
带翅膀的 cat(1) 克隆。一个小总结:对于短输出(适合一个屏幕),它的行为类似于 cat
,对于长输出(对于一个屏幕的大输出),它类似于 less
。对我来说,这几乎是一个完美的解决方案。
bat
,它不在我的 mac bin 上,我看到有一个指向 github bat 项目的链接。我去看看。谢谢。
对于那些想要更新他们的 ~/.gitconfig
来解决这个问题的人,它看起来像这样:
[pager]
branch = false
git config --list --show-origin
来调试为您/您的系统设置/未设置的设置以及从哪里(stackoverflow.com/q/12254076/1590950)。
请执行下列操作:
[alias]
br = !git --no-pager branch
https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables
GIT_PAGER 控制用于在命令行上显示多页输出的程序。如果未设置,则 PAGER 将用作后备。
要解决您的问题,您可以在 shell 中取消设置 PAGER 和 GIT_PAGER。
PAGER
(未设置 GIT_PAGER
)问题仍然存在。有没有我必须检查这个环境变量的位置?
PAGER= git branch
之类的命令上设置寻呼机(等号之后有一个空格,等号之前没有空格,就像写的一样)。不知道它是否比 git branch | cat
更好。
git branch
与其他东西链接起来。使用 pipe detection,Git 将在命令git branch > branches.txt
或git branch | wc -l
中将分支列表输出到标准输出。less
,您可以将--no-init --quit-if-one-screen
添加到您的LESS
环境变量中,如果无需滚动即可查看文本,这将导致less
仅写入标准输出。有关详细信息,请参阅man less
。[pager] branch = false
(两行)。export LESS = "--no-init --quit-if-one-screen -R"
(使用 -R),以尊重原始颜色控制字符。否则,您的 git log 将受到影响。