Git分支命令的行为类似于' less'

时间:2018-01-19 13:11:39

标签: git terminal zsh git-branch oh-my-zsh

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

命令git branch应该显示分支列表,例如ls对文件的分支。

这是我得到的输出:

Enter image description here

我如何获得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

9 个答案:

答案 0 :(得分:390)

如上所述,这是默认行为更改introduced in Git 2.16

默认情况下,您可以使用pager.branch config setting关闭git branch的分页输出:

git config --global pager.branch false

答案 1 :(得分:25)

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

重要的一点是,When the LESS environment variable is unset, Git sets it to FRX,结果是用户可见的行为与命令输出短时没有使用寻呼机的行为相同(即如果你只有少数分支机构)。见man less

  

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

     

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

     

-X或--no-init
      禁止将termcap初始化和取消初始化字符串发送到终端。如果是,这有时是可取的   deinitialization字符串做了一些不必要的事情,比如清除   屏幕。

如果你得到你描述的行为,你很可能将$LESS设置为其他东西,并且取消设置它将解决问题,同时保持长传输的“寻呼机”行为。或者,您可以通过将此行为添加到$LESS文件来激活行为,同时保持.gitconfig

[core]
    pager = less -FRX

如果您真的不喜欢寻呼机,可以全局或按命令停用它(参见其他答案)。

答案 2 :(得分:17)

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

您可以使用--no-pager选项

覆盖此默认值
git --no-pager branch

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

答案 3 :(得分:16)

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

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

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

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

export LESS=-FRX

-F“如果可以在第一个屏幕上显示整个文件,则可以减少自动退出的时间”。但是,-X需要同时指定,否则当输出的屏幕数少于一屏时,将不会显示任何输出。

答案 4 :(得分:9)

这种git的行为对我也越来越烦人。 例如,当我只想列出标签时,我在less中得到了标签列表。

也可以通过将默认的 Git PAGER 更改为cat而不是less来控制此行为。 我宁愿在iTerm中滚动而不是在编辑器中滚动。我想在需要时使用编辑器。

所以:

git config --global core.pager cat

希望对您有帮助。

答案 5 :(得分:5)

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

[pager]
   branch = false

答案 6 :(得分:2)

  

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

因为默认情况下git在pager中打开输出(至少在ubuntu中) 接受的答案将完全替代寻呼机,如果您的输出很长,您可能会不喜欢它。

我建议用less代替寻呼机,这样它就不会“滚动”输出小于终端机高度的东西。

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

答案 7 :(得分:0)

https://git-scm.com/book/en/v2/Git-Internals-Environment-Variables

  

GIT_PAGER控制用于显示多页输出的程序   命令行。如果未设置,则PAGER将用作后备。

要解决您的问题,您可以在shell中取消设置PAGER和GIT_PAGER。

答案 8 :(得分:-1)

执行以下操作:

[alias]
  br = !git --no-pager branch