git 输出为空白,除非捕获为: echo "$(git branch)"

git output is blank, except when captured as in: echo "$(git branch)"

我遇到了一个奇怪的问题,我真的无法判断它是由我的 Git 安装或 shell 相关的问题引起的,还是完全由其他原因引起的。如果我在一个有很多分支和提交的 Git 存储库中,我尝试列出分支:

$ git branch
$ git branch -a
$ git branch --list

根本没有输出。但是,如果我 运行 通过 echo 这些命令的输出,结果正如人们所期望的那样:

$ echo "`git branch`"
  local-branch-1
  local-branch-2
* master
$ echo "$(git branch -a)"
  local-branch-1
  local-branch-2
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master 

我的配置是 macOS 10.14.6,通过 Homebrew 安装了 Git 2.29.2。我将 ZSH 5.8(也是 Homebrew)与 Prezto 或 PowerLevel10k 配置一起使用。虽然这些工具为 Git 命令设置了很多快捷方式的别名,但没有任何可能会干扰的 来自 git * 的别名:

$ type git
git is /usr/local/bin/git
git is /usr/bin/git

我也试过一个处女Bash5.0.18shell,结果一样

ZSH 选项卡补全会正确显示分支,所以如果我,例如:

$ git checkout <tab>
local-branch-1   master
local-branch-2   origin/HEAD
HEAD             origin/master

我从其他一些 Git 命令中得到了类似的行为,例如 git config --local --list。但是所有“操作”命令(pushpulladdcommit 等)似乎都按预期工作,包括正确的输出。 (但是一些“仅信息”命令也是如此,例如 git version。)

我觉得这像是某种 shell 配置错误,但据我所知,它只影响 Git,而且它发生在我喜欢的 ZSH 安装和 vanilla Bash,所以也许两者之间有些奇怪的互动?我到处搜索有类似问题的其他人,但我发现的所有内容都归结为未在没有提交的新存储库中列出的分支,这里绝对不是这种情况。

我现在有点不知所措,所以我希望有人对进一步调查提出建议。

如果这仅在输出到 TTY 时发生,则可能是寻呼机问题。

当 运行 在常规终端中时,除非您使用 $(git ...)git ... | otherprogram 捕获或重定向 git 的输出,否则 isatty(1) 为真,因此 git 自动调用寻呼机让用户阅读内容太长无法显示在一个屏幕上。

如果是寻呼机问题,有几个调试选项。

  1. 看看问题是否在没有寻呼机的情况下消失。

    • git --no-pager branch还有问题吗?
  2. 检查正在使用的寻呼机。

    • declare -p GIT_PAGER 将通过环境显示 git 配置的寻呼机。
    • git config core.pager 将通过其配置文件显示 git 配置的寻呼机。
    • declare -p PAGER 将显示配置为供 OS 通常使用的寻呼机。
  3. 检查寻呼机的配置方式,并尝试清除或简化该配置。

    • 如果您的寻呼机是 LESSdeclare -p LESS 将显示通过环境为其配置的选项,unset LESS 将暂时清除这些选项。
    • 如果您的寻呼机是 MOREdeclare -p MORE 将显示通过环境为其配置的选项,unset MORE 将暂时清除这些选项。
    • 对于另一个寻呼机,请考虑阅读其手册。

关于这个具体实例:

OP 在他们的环境中 LESS='-F -g -i -M -R -S -z-4' exported。 less-F 参数指示它在要显示的内容少于一页时退出。

在 OP 的 (MacOS) 系统上,less 的标准版本,当用 -F 调用时,在 发出之前退出 标准输出的原始内容;这可以通过删除该标志或安装更新版本的 less.

来修复