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

771
当我使用git branch命令列出所有分支时,我看到了git branch | less的输出结果。这个命令应该像ls一样列出所有分支。 以下是我得到的输出截图。 Enter image description here 如何恢复git branch的默认行为?是什么导致了分页输出? 我的.gitconfig文件看起来是这样的:
[user]
  email = myemail@mail.com
  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
10个回答

1329

284
这是一个非常奇怪的决定将默认设置为这样。我希望我的类Unix命令行工具能像愚蠢简单的程序一样运行,以便你可以随意组合它们,但我想那个讨论应该放到其他网站去。 - Stragulus
13
请注意,新的默认设置并不会阻止您将git branch与其他命令链式使用。使用管道检测(pipe detection),Git会将分支列表输出到标准输出中,在命令git branch > branches.txtgit branch | wc -l中都可以实现。 - Rory O'Kane
38
并非一定如此。如果您的分页器是less,则可以将 --no-init --quit-if-one-screen 添加到您的 LESS 环境变量中,这将导致less仅在文本无需滚动即可查看时才写入标准输出。有关更多详细信息,请参见man less - Rory O'Kane
16
如果你想手动将其添加到配置文件中,可以写成[pager] branch = false(分成两行)。 - Sam
8
针对 @RoryO'Kane 的评论,你可能想在你的 .zshrc、.bash_profile 等文件中执行 export LESS="--no-init --quit-if-one-screen -R"(包括 -R),以便支持原始颜色控制字符。否则,你的 git log 会受到影响。 - joseph
显示剩余10条评论

112

正如其他答案所指出的那样,对于大多数命令,Git默认将其传输到分页器(默认为less)。

然而,一个重要的点是:当未设置LESS环境变量时,Git会将其设置为FRX。这意味着,当命令的输出很短(即如果您只有几个分支),用户可见的行为与不使用分页器时相同。请参阅man less

  

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

     

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

     

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

如果您遇到您描述的行为,最有可能的情况是$LESS设置为其他值,取消设置它(unset LESS)将消除这个问题,同时保持长输出的“分页器”行为。或者,您可以通过将以下内容添加到.gitconfig文件中来激活此行为,同时保持$LESS不变:

[core]
    pager = less -FRX

如果您真的不喜欢分页器,可以全局或按命令基础停用它(请参见其他答案)。


1
我将pager = less -FR作为选项,因为选项X似乎禁用了鼠标滚动。 - zyy
10
一句话翻译:将 git config --global core.pager "less -FRX" 添加到全局配置中。 - Tk421
2
谢谢,这很完美:保持简单,适用于小输出,同时在需要时仍然具有分页的好处。 - Erik Brendel

103

不是要较真,但你得到的行为 确实是 默认值。这就是你没有要求其他内容时所得到的结果。默认情况下,branch(以及其他许多 Git 命令)在将输出发送到终端时使用分页器。

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

git --no-pager branch
如果将输出重定向到文件,则 Git 应该检测到它不是在写入终端,因此不应该使用分页程序。 (另一方面,这表明脚本使用情况,这种情况下,您应该优先考虑使用管道命令,如 git for-each-ref,而不是 git branch。)

你正在使用哪个版本的git?你的同事们又在使用哪个版本呢? - Lasse V. Karlsen
2.16.0!这个版本中引入了新功能吗? - DenicioCode
5
这是这里最优秀的答案,可惜点赞数很少,因为我滚了很久才找到这个杰作。 - codepleb
对我来说,git --no-pager branch 是最好的选择,因为它可以帮助你记住 --no-pager 选项并轻松地完成两者。当查看远程分支时,例如使用 git branch -a,分支列表很容易填满屏幕,因此分页更可取;但是当查看本地分支时,通常不会有那么多分支,并且您可能希望在命令行上列出它们,以便您可以提醒自己拥有哪些分支,然后执行例如 git checkout <branch-name> - drkvogel
这个答案可行,不需要修改我的环境。 - bmaggi
显示剩余5条评论

101

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

  1. 实际上,在(默认配置的)bash和zsh之间存在不同的行为。这个“问题”只在zsh下出现。
  2. 建议的解决方案会使git branch不会总是使用一个分页器,当有大量输出时,这并不是所期望的。

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

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

export LESS=-FRX

-F参数表示如果整个文件可以在第一个屏幕上显示,则使less自动退出。 但是,-X参数需要同时指定,否则在输出不足一屏幕时将不会显示任何输出。


3
这不是真的 - 当设置了LESS环境变量时,大多数Linux变体都会显示出这种行为。在这方面(或其他任何方面),zsh并不特别。 - Software Engineer
2
@软件工程师 什么不是真的?我说的正是重要的是LESS是否设置:‘bash没有定义任何东西,而zsh会将其定义为-R。当我在zsh中执行unset LESS时,一切都恢复正常.....’至于这是否发生,那就是默认配置的bash不定义LESS,而默认配置的oh-my-zsh定义LESS。我知道这一点,因为我在macOS中有完全相同的oh-my-zsh环境(就像提问者一样),我遇到了完全相同的问题。 - Yongwei Wu
在1中,你说这种行为只在zsh中出现。正如我所说的,这是不正确的。我的ubuntu-bash中的环境变量也设置为-R,所以不仅仅是zsh。在2中,你暗示在有大量输出时将输出到sdtout并不理想,这也是错误的。在我的自动化环境中,分页永远都不是理想的选择,无论结果的长度如何。考虑到自动化在运营中占据了很大一部分,我认为在很多情况下,stdout的行为都是非常理想的,并且“也许”在手动诊断和传统工作方面会稍显不足。因此,这是不正确的。原始答案是正确的。 - Software Engineer
1
@软件工程师,您完全没有注意到原始问题是关于在macOS下的行为(当然,其他系统可能有不同的默认行为)。请仔细查看路径。您关于自动化环境的评论也没有意义,因为分页仅在TTY中自动启用,而在输出被重定向时不会启用。 - Yongwei Wu
可以确认在zsh/Big Sur中,需要使用-X标志才能使-F正常工作。 - worc
显示剩余3条评论

70
这个 Git 的行为对我来说越来越烦人。 例如,当我只想列出标签时,在使用 less 时会显示我的标签列表。
可以通过将默认的 Git PAGER 更改为 cat 来控制此行为,而不是使用 less。我宁愿在 iTerm 中滚动,也不愿在编辑器中滚动。我只在需要时才使用编辑器。
git config --global core.pager cat

3
谢谢提醒。我承认使用了几个月后,我仍在使用cat命令,但是例如在执行git log时它很烦人。我只是想念原来的行为,但是没有时间从这个角度改善我的日常工作流程。 - ionescu77
3
还有一种解决方案将catless的特性结合在一起:它是bat——带有翅膀的cat(1)克隆。简单概括一下:对于短输出(适合一个屏幕),它的行为就像cat,而对于长输出(超过一个屏幕),它的行为就像less。对我来说,这几乎是一个完美的解决方案。 - 0x6d6c
这将是理想的。 有趣的是,我不知道 bat,它不在我的 Mac bin 上,我看到了一个链接到 Github 的 bat 项目。我会去看一下。谢谢。 - ionescu77
1
实际上,您可以决定哪些内容需要分页,哪些不需要。我绝对希望我的git日志被分页,但不需要标签列表(或分支...)请参见已接受的答案。 - Fer
这对我来说是从终端到iTerm的最佳答案。 - publicknowledge

16

如果想要更新~/.gitconfig来解决这个问题,它应该是这样的:

对于想要更新~/.gitconfig以解决此问题的人,其应如下所示:

[pager]
   branch = false

奇怪的事情出现了:这个设置以前可以用,但是从几天前开始就不能用了,有什么改变吗?还是我的配置没有被应用? - Ahmed Hasn.
@ConquerorsHaki 这个解决方案对我来说在 git v2.17.1 上可行。尝试使用 git config --list --show-origin 命令来调试你/你的系统上设置了哪些设置以及从哪里设置(https://dev59.com/xGct5IYBdhLWcg3wNq6v)。 - indivisible

4

请按照以下步骤操作:

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

2
如果您只想查看分支(未格式化),可以使用以下命令将 git branch 管道传输到 cat:
git branch | cat

0

这对我有用(在Windows下使用Powershell)

$ git branch | echo

0

1
取消设置 PAGER(已取消设置 GIT_PAGER),问题仍然存在。我需要检查哪些位置的环境变量? - DenicioCode
@DenniJensen 你可以在命令行中设置分页器,例如 PAGER= git branch(等号后面有一个空格,前面没有空格,与原文一模一样)。我不知道这是否比 git branch | cat 更好。 - maaartinus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接