ChatGPT解决这个技术问题 Extra ChatGPT

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

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

命令 git branch 应该显示一个分支列表,就像 ls 对文件所做的那样。

这是我得到的输出:

https://i.stack.imgur.com/rh4td.png

如何获得 git branch 的默认行为?是什么导致分页输出?

我正在使用带有 oh_my_zsh 的 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

P
Peter Mortensen

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 将受到影响。
P
Peter Mortensen

正如其他答案所指出的那样,对于大多数命令,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"
谢谢,这是完美的:保持小输出的简单,同时在需要的地方仍然具有寻呼机的好处
P
Peter Mortensen

不是争论语义,而是你得到的行为默认的。这就是为什么当你不要求不同的东西时你会得到它。默认情况下,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
这是这里最优秀的答案,遗憾的是它的赞成票很少,因为我翻了很多卷才找到这部杰作。
Y
Yongwei Wu

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

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

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

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

export LESS=-FRX

-F '如果整个文件可以显示在第一个屏幕上,则会导致 less 自动退出'。但是需要同时指定-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 中自动启用,但在输出重定向时不会自动启用。
非常感谢!在 VSCode 终端中执行 cmd+f 来搜索分支名称对我不起作用,但在我的 .zshrc 中添加 export LESS=-FRX 修复了它!
P
Peter Mortensen

这种 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 项目的链接。我去看看。谢谢。
实际上你可以决定哪些东西是分页的,哪些不是。我绝对希望我的 git 日志被分页,而不是标签列表(或分支......)查看接受的答案
N
Nick

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

[pager]
   branch = false

奇怪的事情:这个设置正在工作,因为有些日子它不再是了,有什么改变还是我的配置没有被应用?
@ConquerorsHaki 这个解决方案适用于我的 git v2.17.1 尝试 git config --list --show-origin 来调试为您/您的系统设置/未设置的设置以及从哪里(stackoverflow.com/q/12254076/1590950)。
P
Peter

请执行下列操作:

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

C
C-Otto

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

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

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


未设置 PAGER(未设置 GIT_PAGER)问题仍然存在。有没有我必须检查这个环境变量的位置?
@DenniJensen 您可以在 PAGER= git branch 之类的命令上设置寻呼机(等号之后有一个空格,等号之前没有空格,就像写的一样)。不知道它是否比 git branch | cat 更好。