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


414

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

Answers:


736

就像在Mark Adelsberger的评论中提到的那样,这是Git 2.16中引入的默认行为更改。

您可以git branch使用pager.branchconfig设置将页面输出默认关闭:

git config --global pager.branch false

127
那是违约的奇怪决定。我希望我的unix-y cli工具的行为像愚蠢的简单程序,您可以根据需要链接这些程序,但是我想讨论的对象是另一个站点。
Stragulus

7
@Stragulus请注意,新的默认设置不会阻止您git branch与其他对象链接。使用管道检测,Git将在命令git branch > branches.txtgit branch | wc -l。中将分支列表输出到stdout 。
罗里·奥肯

3
@ RoryO'Kane但在使用分页器时,ESC/q经过简单的git branch检查,我有一个额外的输入。
mitnk

23
@mitnk不一定。如果您的寻呼机是less,则可以添加--no-init --quit-if-one-screenLESS环境变量,less如果可以不滚动而查看文本,则将导致只写到stdout。请参阅man less以获取更多详细信息。
罗里·奥肯

13
如果要手动将其添加到配置文件中,它是[pager] branch = false(两行)。
山姆

56

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

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

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

-R或--RAW-CONTROL-CHARSANSI
“颜色”转义序列以“原始”形式输出。

-X或--no-init
禁用将termcap初始化和反初始化字符串发送到终端。如果取消初始化字符串做了不必要的操作(如清除屏幕),有时这是理想的。

如果您得到了描述的行为,则很可能已将其$LESS设置为其他值,并且unset LESS取消设置它()将消除该问题,同时保持“ pager”行为以获得长输出。另外,您可以通过将行为$LESS添加到.gitconfig文件中来激活行为,同时保持原样:

[core]
    pager = less -FRX

如果您确实不喜欢寻呼机,则可以全局或按命令将其停用(请参阅其他答案)。


40

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

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

git --no-pager branch

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


git --no-pager branch作品。但是如何设置?仅PAGER环境变量设置为less。这不是默认行为。我所有的大学都有输出,作为打印到终端的列表。
DenniJensen

您正在使用哪个版本的git?您的同事正在使用哪一个?
Lasse V. Karlsen

2.16.0!这个版本在git中引入了此功能吗?
DenniJensen

是的,现在是默认设置。github.com/git/git/blob/master/Documentation/RelNotes/… 我旁边的我的大学正在使用相同的版本,并且没有这个问题:) thx @mark
DenniJensen

1
这是这里最好的答案,很可惜它没有那么多票,因为我滚动了很多才能找到这个杰作。
codepleb

25

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

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

所以:

git config --global core.pager cat

1
是的,对我来说,这应该是一个有效的答案
Tura,

2
感谢您的单挑。我承认使用几个月后,我仍在使用cat,但是例如这样做git log很烦人。我只是想念原来的行为,但没有时间在这方面改善我的日常工作流程。
ionescu77

你赢了!
sdlins

2
请注意,这还将适用于git log...
bagerard

10

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

[pager]
   branch = false

奇怪的是:此设置正在起作用,并且由于某些日子不再可用,是否有任何更改?或者是否只是未应用我的配置?
征服者

7

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

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

我建议将寻呼机替换为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。当我unset LESS在zsh中执行操作时,一切恢复正常。

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

export LESS=-FRX

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


0

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

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

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


1
取消设置PAGERGIT_PAGER被清除的)的问题仍然存在。我必须在任何位置检查此环境变量吗?
DenniJensen

@DenniJensen您可以在命令上设置传呼机,例如PAGER= git branch(与写法完全相同的等号后面有一个空格,而等号之前没有空格)。不知道,它是否比例如更好git branch | cat
maaartinus

-1

我也遇到过同样的问题,git status并且也git config --global pager.status false解决了这个问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.