【问题标题】:Git branch command behaves like 'less'Git 分支命令的行为类似于 'less'
【发布时间】:2020-06-22 22:14:16
【问题描述】:

当我使用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

【问题讨论】:

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


    【解决方案1】:

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

    因为 Git 默认会在 pager 中打开输出(至少在 Ubuntu 中是这样)。 接受的答案将完全取代寻呼机,如果您的 git 命令输出很长,您可能不喜欢

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

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      export LESS=-FRX
      

      -F'如果整个文件可以显示在第一个屏幕上,则更少自动退出'。但是-X需要同时指定,否则输出不足一屏时不会显示输出。

      【讨论】:

      • 我希望我能多次投赞成票。谢谢
      • 这不是真的——当设置了 LESS 环境变量时,这种行为会出现在大多数 Linux 变体中。 zsh 在这方面(或任何其他方面)并不特别。
      • @SoftwareEngineer 什么不正确?我确切地说,重要的是是否设置了 LESS:'bash 没有定义任何内容,而 zsh 将其定义为 -R。当我在zsh中做unset LESS时,一切都恢复正常了......'至于是否发生这种情况,是默认配置的bash没有定义LESS,而默认配置的oh-my-zsh定义了LESS。我知道这一点是因为我在 macOS 中有完全相同的 oh-my-zsh 环境(就像提问者一样),我遇到了完全相同的问题。
      • 在1中,您说该行为仅显示在zsh中。正如我所说,那不是真的。 env var 在我的 ubuntu-bash 中也设置为 -R,所以不仅仅是 zsh。在 2 中,您暗示当有大量输出时不希望输出到 sdtout;也错了。在我的自动化环境中,分页是从不可取的,无论结果的长度如何。鉴于自动化是当今操作的很大一部分,我会说标准输出行为在很多情况下是非常需要的,而对于手动诊断和遗留工作来说“可能”不太需要。所以,这是错误的。原来的答案是对的。
      • @SoftwareEngineer 你完全没有注意到最初的问题是关于 macOS 下的行为(当然,其他系统可能有不同的默认行为)。仔细看看路径。 — 您对自动化环境的评论也没有意义,因为分页仅在 TTY 中自动启用,而不是在输出重定向时启用。
      【解决方案3】:

      这种 Git 行为也让我越来越讨厌。 例如,当我只想列出标签时,我在less 中获得了我的标签列表。

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

      所以:

      git config --global core.pager cat
      

      【讨论】:

      • 是的,这对我来说应该是一个有效的答案
      • 感谢您的提醒。我承认在使用了几个月后,我仍在使用 cat,但是例如在执行 git log 时,它很烦人。我只是想念最初的行为,但没有时间从这个角度改进我的日常工作流程。
      • 你赢了!...完美!
      • 还有另一种解决方案可以结合两个词的特征:catless:它是 bat带翅膀的 cat(1) 克隆。一个小小的总结:对于短输出(适合一个屏幕),它的行为类似于cat,对于长输出(对于一个屏幕的大输出),它的行为类似于less。对我来说,这几乎是一个完美的解决方案。
      • 这将是理想的。有趣的是,不知道bat,它不在我的mac bin 上,我看到有一个github bat 项目的链接。我去看看。谢谢。
      【解决方案4】:

      正如comments to Mark Adelsberger's answer 中所述,这是introduced in Git 2.16 的默认行为更改。

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

      git config --global pager.branch false
      

      【讨论】:

      • 默认是一个奇怪的决定。我希望我的 unix-y cli 工具表现得像愚蠢的简单程序,如果你愿意,你可以链接它们,但我想这个讨论是针对另一个网站的。
      • @Stragulus 请注意,新的默认值不会阻止您将 git branch 与其他内容链接。使用pipe detection,Git 将在命令git branch > branches.txtgit branch | wc -l 中将分支列表输出到标准输出。
      • @mitnk 不一定。如果您的寻呼机是less,您可以将--no-init --quit-if-one-screen 添加到您的LESS 环境变量中,这将导致less 在无需滚动即可查看文本的情况下仅写入标准输出。有关详细信息,请参阅man less
      • 如果你想手动将它添加到你的配置文件中,它是[pager] branch = false(两行)。
      • 响应@RoryO'Kane 的评论,您可能希望在您的.zshrc、.bash_profile 等中执行export LESS = "--no-init --quit-if-one-screen -R"(带有-R),以尊重原始颜色控制字符。否则,你的 git log 会受到影响。
      【解决方案5】:

      正如其他答案所指出的,对于大多数命令,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"
      【解决方案6】:

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

      您可以使用--no-pager 选项覆盖此默认设置:

      git --no-pager branch
      

      或者,如果您将输出重定向到文件,Git 应该检测到它没有写入终端,因此无论如何都不应该使用寻呼机。 (另一方面,这暗示了一个脚本用例,在这种情况下,您应该考虑使用像git for-each-ref 这样的管道命令,而不是git branch。)

      【讨论】:

      • git --no-pager branch 有效。但是这一套怎么样?只有PAGER 环境变量设置为less。这不是默认行为。我所有的大学都有一个输出作为列表打印到终端。
      • 你使用的是哪个版本的 git?您的同事使用的是哪一款?
      • 2.16.0!这是这个版本给git引入的功能吗?
      • 是的,现在是默认设置。 github.com/git/git/blob/master/Documentation/RelNotes/…我旁边的大学使用相同的版本,没有这个问题:) thx @mark
      • 这是这里最优秀的答案,遗憾的是它的点赞数很少,因为我翻了很多卷才找到这个杰作。
      【解决方案7】:

      执行以下操作:

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

      【讨论】:

        【解决方案8】:

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

        [pager]
           branch = false
        

        【讨论】:

        • 这里很奇怪:此设置有效,但由于有些日子不再有效,是否有任何更改或我的配置没有被应用?
        • @ConquerorsHaki 这个解决方案适用于我的 git v2.17.1 尝试使用git config --list --show-origin 来调试为您/您的系统设置/未设置的设置以及从哪里设置 (stackoverflow.com/q/12254076/1590950)。
        【解决方案9】:

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

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

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

        【讨论】:

        • 未设置 PAGERGIT_PAGER 未设置)问题仍然存在。有没有我必须检查这个环境变量的位置?
        • @DenniJensen 您可以在命令上设置寻呼机,例如PAGER= git branch(等号后有一个空格,等号前没有一个空格,与所写完全一样)。不知道,是否比 git branch | cat 更好。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-23
        • 1970-01-01
        • 2021-11-05
        • 2015-07-15
        • 1970-01-01
        • 2021-10-23
        相关资源
        最近更新 更多