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

Git branch command behaves like 'less'

提问人:DenicioCode 提问时间:1/19/2018 最后编辑:phuclvDenicioCode 更新时间:10/26/2023 访问量:87968

问:

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

该命令应该显示分支列表,就像文件一样。git branchls

这是我得到的输出:

git branch paging output

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

我的样子是这样的:.gitconfig

[user]
  email = [email protected]
  name = Dennis H.
[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 终端 git-branch 寻呼机

评论


答:

0赞 C-Otto 1/19/2018 #1

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

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

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

评论

1赞 DenicioCode 1/19/2018
未设置(未设置)问题仍然存在。有没有我必须检查这个环境变量的位置?PAGERGIT_PAGER
0赞 maaartinus 1/7/2020
@DenniJensen 您可以在命令上设置寻呼机,例如(等号后面有一个空格,等号前没有空格,就像写的那样)。不知道,它是否比例如,.PAGER= git branchgit branch | cat
103赞 Mark Adelsberger 1/19/2018 #2

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

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

git --no-pager branch

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

评论

0赞 DenicioCode 1/19/2018
git --no-pager branch工程。但是这是如何设置的呢?只有环境变量设置为 。这不是默认行为。我所有的大学都有输出,作为列表打印到终端。PAGERless
0赞 Lasse V. Karlsen 1/19/2018
您使用的是哪个版本的 git?你的同事用的是哪一个?
0赞 DenicioCode 1/19/2018
2.16.0!这是这个版本中 git 引入的功能吗?
0赞 DenicioCode 1/19/2018
是的,现在是默认的。github.com/git/git/blob/master/Documentation/RelNotes/......我旁边的大学使用相同的版本,没有这个问题:)谢谢@mark
5赞 codepleb 9/5/2019
这是这里最优越的答案,可悲的是它的赞成票很少,因为我滚动了很多才找到这部杰作。
1334赞 Zach Schneider 1/22/2018 #3

正如 Mark Adelsberger 的回答评论中提到的,这是 Git 2.16 中引入的默认行为更改。

默认情况下,您可以使用 pager.branch 配置设置关闭分页输出以进行回退:git branch

git config --global pager.branch false

评论

284赞 Stragulus 4/7/2018
这是一个奇怪的、奇怪的违约决定。我希望我的 unix-y cli 工具表现得像愚蠢的简单程序,如果你愿意,你可以链接它们,但我想这个讨论是针对另一个网站的。
13赞 Rory O'Kane 6/14/2018
@Stragulus 请注意,新的默认值不会阻止您与其他内容链接。使用管道检测,Git 会将分支列表输出到 命令或 中的 stdout。git branchgit branch > branches.txtgit branch | wc -l
38赞 Rory O'Kane 10/17/2018
@mitnk 不一定。如果您的寻呼机是 ,您可以添加到环境变量中,如果文本可以在不滚动的情况下查看,这将导致只写入 stdout。有关更多详细信息,请参阅man lessless--no-init --quit-if-one-screenLESSless
16赞 Sam 10/23/2018
如果你想手动将它添加到你的配置文件中,它是(在两行上)。[pager] branch = false
8赞 joseph 8/8/2019
作为对 @RoryO'Kane 评论的回应,您可能希望在 .zshrc、.bash_profile 等中(使用 -R)来尊重原始颜色控制字符。否则,您的 git 日志将受到影响。export LESS = "--no-init --quit-if-one-screen -R"
112赞 Matthieu Moy 4/17/2018 #4

正如其他答案所指出的,对于大多数命令,Git 默认将自身通过管道传输到寻呼机中(默认情况下)。less

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

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

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

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

如果你得到了你所描述的行为,你很可能已经设置了其他东西,取消设置它()将消除这个问题,同时保持“寻呼机”行为的长输出。或者,您可以通过将以下内容添加到文件中来激活该行为,同时保持原样:$LESSunset LESS$LESS.gitconfig

[core]
    pager = less -FRX

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

评论

1赞 zyy 11/24/2020
我有选项,因为似乎正在禁用鼠标滚动。pager = less -FRX
10赞 Tk421 3/5/2021
一个衬垫git config --global core.pager "less -FRX"
2赞 Erik Brendel 5/11/2022
谢谢,这是完美的:保持小输出的简单性,同时在需要时仍然具有寻呼机的好处
16赞 Nick 11/1/2018 #5

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

[pager]
   branch = false

评论

0赞 Ahmed Hasn. 3/5/2019
奇怪的是:这个设置是有效的,因为有些日子它不再起作用了,有什么变化还是我的配置没有被应用?
0赞 indivisible 6/17/2020
@ConquerorsHaki 这个解决方案对我有用 git v2.17.1 尝试调试为您/您的系统设置/未设置的设置以及从哪里设置(stackoverflow.com/q/12254076/1590950)。git config --list --show-origin
4赞 João Tiago 1/10/2019 #6

执行以下操作:

[alias]
  br = !git --no-pager branch
70赞 ionescu77 1/14/2019 #7

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

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

所以:

git config --global core.pager cat

评论

3赞 ionescu77 5/7/2019
感谢您的提醒。我承认在使用几个月后,我仍然在使用 cat,但例如,这样做很烦人。我只是想念原来的行为,但没有时间在这个过程中改进我的日常工作流程。git log
3赞 0x6d6c 8/30/2020
还有另一种解决方案可以绑定这两个词的特征: 和 : 它是蝙蝠 一只带翅膀的猫(1)克隆。一个小小的总结:对于短输出(适合一个屏幕),它的行为类似于 ,对于长输出(一个屏幕的大输出)。对我来说,这几乎是一个直截了当的解决方案。catlesscatless
0赞 ionescu77 8/31/2020
这将是理想的。有趣的是,不知道,它不在我的 mac 垃圾箱上,我看到有一个指向 github bat 项目的链接。我去看看。感谢。bat
1赞 Fer 12/10/2021
实际上,您可以决定哪些内容是分页的,哪些不是。我绝对希望我的 git 日志被分页,但不是标签列表(或分支......查看接受的答案
0赞 publicknowledge 8/15/2023
这是我从终端到iterm的最佳答案。
101赞 Yongwei Wu 3/3/2020 #8

公认的答案似乎是错误的。有两个问题:

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

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

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

export LESS=-FRX

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

评论

3赞 Software Engineer 1/31/2021
事实并非如此 -- 当设置了 LESS 环境变量时,该行为在大多数 Linux 变体下都会显示出来。ZSH 在这方面(或任何其他方面)并不特别。
2赞 Yongwei Wu 2/1/2021
@SoftwareEngineer 什么不是真的?我确切地说,重要的是是否设置了 LESS:“bash 定义了 nothing,而 zsh 将其定义为 .当我在 zsh 中做时,一切都恢复正常......”至于是否会发生这种情况,是默认配置的 bash 没有定义 LESS,而默认配置的 oh-my-zsh 定义了 LESS。我知道这一点,因为我在 macOS 中有完全相同的 oh-my-zsh 环境(就像提问者一样),并且我遇到了完全相同的问题。-Runset LESS
0赞 Software Engineer 2/1/2021
在 1 中,你说行为只出现在 zsh 中。正如我所说,这不是真的。env var 在我的 ubuntu-bash 中也设置为 -R,所以不仅仅是 zsh。在 2 中,您暗示当有大量输出时,输出到 sdtout 是不可取的;也错了。在我的自动化环境中,无论结果的长度如何,分页都是不可取的。鉴于如今自动化是操作的很大一部分,我想说的是,在很多情况下,标准输出行为是非常可取的,而对于手动诊断和遗留工作来说,“可能”不那么可取。所以,这是错误的。最初的答案是对的。
1赞 Yongwei Wu 2/3/2021
@SoftwareEngineer 您完全没有注意到,最初的问题是关于macOS下的行为(当然,其他系统可能具有不同的默认行为)。仔细看看这些路径。— 您关于自动化环境的评论也没有意义,因为分页仅在 TTY 中自动启用,而不是在重定向输出时启用。
0赞 Lambdaphile 2/13/2021
多谢!在 VSCode 终端中执行 cmd+f 来搜索分支名称对我不起作用,但添加我的 .zshrc 修复了它!export LESS=-FRX
0赞 Sake 10/6/2022 #9

这对我有用(Windows 下的 Powershell)

$ git branch | echo
2赞 Connor 3/17/2023 #10

如果你只想看到你的分支(未格式化),你可以通过管道将 git branch 传递给 cat:

git branch | cat