Git branch命令的行为就像'less'

Den*_*sen 305 git terminal zsh git-branch oh-my-zsh

当我使用git branch命令列出所有分支时,我看到输出git branch | less.

该命令git branch应该显示分支列表,就像ls文件一样.

这是我得到的输出:

在此输入图像描述

我如何获得默认行为git branch?导致分页输出的原因是什么?

我正在使用ZSH oh_my_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
Run Code Online (Sandbox Code Playgroud)

小智 549

如上所述,这是Git 2.16中引入的默认行为更改.

您可以git branch使用pager.branch配置设置默认关闭分页输出:

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

  • 这是一个奇怪的,奇怪的决定,默认.我希望我的unix-y cli工具表现得像你可以链接的愚蠢的简单程序,但我想这个讨论是针对另一个网站的. (83认同)
  • @mitnk不一定.如果您的寻呼机是'less`,您可以将`--no-init --quit-if-one-screen`添加到您的`LESS`环境变量中,如果文本可以,这将导致`less`只写入stdout无需滚动即可查看.有关详细信息,请参阅[`man less`](https://linux.die.net/man/1/less). (18认同)
  • 如果要手动将其添加到配置文件中,则为[[pager] branch = false`(两行)。 (8认同)
  • @Stragulus请注意,新的默认值并不会阻止你用其他东西链接`git branch`.使用[管道检测](/sf/ask/63781791/),Git会在命令`git branch> branches.txt`或`git branch |中输出分支列表到stdout.wc -l`. (7认同)
  • 为了回应 @RoryO'Kane 的评论,您可能需要在 .zshrc、.bash_profile 中执行 `export LESS = "--no-init --quit-if-one-screen -R"` (使用 -R),等,以尊重原始颜色控制字符。否则,你的 git 日志将会受到影响。 (5认同)
  • 我讨厌默认行为被改变,让你弄清楚如何恢复它,特别是我讨厌 git 分支的这种行为:/ (4认同)
  • @RoryO'Kane但是有了寻呼机,我在一个简单的`git branch`检查后有一个额外的`ESC/q`类型. (3认同)
  • `git config --global core.pager ''` 将在所有 git 命令上打开分页器 (3认同)

Yon*_* Wu 37

接受的答案似乎是错误的。有两个问题:

  1. (默认配置)bash 和 zsh 之间的行为实际上是不同的。“问题”仅在 zsh 下出现。
  2. 建议的解决方案将git branch始终不使用寻呼机,这在有大量输出时是不需要的。

真正的原因是 bash 和 zsh 对 LESS 有不同的默认定义:bash 什么都不定义,而 zsh 将其定义为-R. 当我unset LESS在 zsh 中执行时,一切都恢复正常....

-R行为可能仍然是需要的。在这种情况下,您可以将以下指令添加到您的 .zshrc 以保持一切正常:

export LESS=-FRX
Run Code Online (Sandbox Code Playgroud)

-F'如果整个文件可以显示在第一个屏幕上,则导致 less 自动退出'。但是,-X需要同时指定,否则当输出少于一屏时将不显示任何输出。

  • 这不是真的——当设置 LESS 环境变量时,大多数 Linux 变体都会出现这种行为。zsh 在这方面(或任何其他方面)并不特殊。 (3认同)
  • @SoftwareEngineer 什么是不正确的?我确实说过,重要的是是否设置了 LESS:“bash 没有定义任何内容,而 zsh 将其定义为“-R”。当我在 zsh 中 `unset LESS` 时,一切都恢复正常......' 至于是否会出现这种情况,是默认配置的 bash 没有定义 LESS,而默认配置的 oh-my-zsh 定义了 LESS。我知道这一点是因为我在 macOS 中有完全相同的 oh-my-zsh 环境(就像提问者一样),并且遇到了完全相同的问题。 (2认同)

Mat*_*Moy 36

正如其他答案所指出的那样,less对于大多数命令,git默认将自身管道化为寻呼机(默认情况下).

但重要的一点是,当未设置LESS环境变量时,Git将其设置为FRX,结果是用户可见行为与命令输出短时未使用寻呼机的行为相同(即如果你只有几个分支).见人少:

-F或--quit-if-one-screen
如果整个文件可以显示在第一个屏幕上,则会自动退出.

-R或--RAW-CONTROL-CHARS
[...] ANSI"颜色"转义序列以"原始"形式输出.

-X或--no-init
禁止将termcap初始化和取消初始化字符串发送到终端.如果取消初始化字符串不需要某些操作,例如清除屏幕,则有时需要这样做.

如果你得到你描述的行为,你很可能已经$LESS设置了其他东西,并且取消它会解决问题,同时保持"寻呼机"行为以获得长输出.或者,您可以通过将此行为unset LESS添加到$LESS文件中来激活保持原样的行为:

[core]
    pager = less -FRX
Run Code Online (Sandbox Code Playgroud)

如果你真的不喜欢寻呼机,你可以在全局或基于每个命令的基础上停用它(参见其他答案).

  • 一行代码 `git config --global core.pager "less -FRX"` (11认同)
  • 谢谢,这是完美的:对于小输出保持简单,同时在需要时仍然具有寻呼机的优点 (2认同)

Mar*_*ger 25

不要争论语义,但你得到的行为默认的.这就是为什么当你不要求不同的东西时你得到它.默认情况下,branch(和许多其他git命令)在向终端发送输出时使用寻呼机.

您可以使用该--no-pager选项覆盖此默认值

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

或者,如果将输出重定向到文件,git应检测到它没有写入终端,因此不应使用寻呼机.(另一方面,这表明脚本用例,在这种情况下,您应该考虑使用git for-each-ref优先级的管道命令git branch.)

  • 这是这里最优秀的答案,遗憾的是它的赞成票如此之少,因为我滚动了相当多的时间才能找到这部杰作。 (3认同)

ion*_*u77 17

Git的行为也让我越来越烦。less例如,当我只想列出标签时,我就获得了标签列表。

人们可以通过更改默认也控制此行为的Git PAGERcat代替less。我宁愿在iTerm中滚动而不是在编辑器中滚动。我喜欢在需要时使用编辑器。

所以:

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

  • 是的,这对我来说应该是一个有效的答案 (4认同)
  • 还有另一种解决方案,它绑定了两个词的特征:“cat”和“less”:它是 [`bat`](https://github.com/sharkdp/bat) *带有翅膀的 cat(1) 克隆*。一个小总结:对于短输出(适合一个屏幕),它的行为类似于“cat”,对于长输出(对于一个屏幕的大输出),它的行为类似于“less”。对我来说,这“几乎”是一个完美的解决方案。 (3认同)
  • 感谢您的提醒。我承认使用几个月后,我仍在使用 cat,但是例如在执行 `git log` 时它很烦人。我只是想念最初的行为,但没有时间在这方面改进我的日常工作流程。 (2认同)

Nic*_*ick 8

对于那些想要更新其~/.gitconfig解决方案的人,它看起来像这样:

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


小智 5

请执行下列操作:

[alias]
  br = !git --no-pager branch
Run Code Online (Sandbox Code Playgroud)


Imr*_*ran 5

Git分支命令的行为类似于“少”

因为默认情况下,Git在分页器中打开输出(至少在Ubuntu中)。该接受的答案将完全取代寻呼机,这你可能不喜欢,如果你的输出是很长。

我建议将寻呼机替换为less,这样它不会“滚动”输出小于终端高度的输出。

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