【问题标题】:git output is blank, except when captured as in: echo "$(git branch)"git 输出为空白,除非捕获如下: echo "$(git branch)"
【发布时间】:2020-11-13 16:37:56
【问题描述】:

我遇到了一个奇怪的问题,我真的不知道它是由与我的 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。我正在使用带有 Prezto 或 PowerLevel10k 配置的 ZSH 5.8(也是 Homebrew)。虽然这些工具为 Git 命令的许多快捷方式提供别名,但没有任何别名 来自 git * 可能会造成干扰:

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

我也试过原生的 Bash 5.0.18 shell,结果是一样的。

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 中,所以可能两者之间存在一些奇怪的交互?我到处搜索有类似问题的其他人,但我发现的所有内容都归结为未在没有提交的新存储库中列出的分支,这里绝对不是这种情况。

在这一点上我有点没有想法,所以我希望有人对进一步调查提出建议。

【问题讨论】:

标签: git shell homebrew zsh gnu


【解决方案1】:

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

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

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

  1. 如果没有寻呼机,看看问题是否会消失。

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

    • declare -p GIT_PAGER 将通过环境显示为git 配置的寻呼机。
    • git config core.pager 将通过其配置文件显示为git 配置的寻呼机
    • declare -p PAGER 将显示一个配置为供您的操作系统使用的寻呼机。
  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 来修复。

【讨论】:

  • @matt,答案的目标是适用于所有人,而不仅仅是 OP。我怀疑其他人会拥有完全相同的字符串,因此我不确定在答案本身中包含该字符串会添加任何实用程序;我们的目标是写一个对每个有错误配置寻呼机的人有帮助的答案。
  • 这就是问题所在。我的PAGER 环境变量设置为使用less,这是/usr/bin 中的macOS 系统二进制文件。我还有一个LESS 环境变量,其中包含-F 作为如果输入小于一整页时自动退出的选项。我相信该版本的less (v487) 中可能存在一个错误,导致在显示任何输入之前发生退出。删除-F 会显示输出,但会在短输入时保持寻呼机打开,这是不可取的。但是,安装 Homebrew 的 less (v551) 为我解决了这个问题,同时允许我保留 -F 选项。谢谢!
  • @matt,经过编辑,答案明确推荐unset LESS。该建议本身就解决了 OP 的问题,以及不依赖 -F 来获得相同行为的它的变体(并且恰好在具有 less 版本的平台上 -F 有不良行为)。通过这种方式,我们既涵盖了 OP 的直接问题,也涵盖了 其他尚未发现的相同故障类别的路径(其中有无限/不确定的数量)。
  • @CharlesDuffy 我仍然觉得如果 OP 添加了一个自我回答,以保留实际问题的实际具体解决方案,我们都会过得更好。或者,您可以将 OP 的“这是问题所在”的评论作为一种附录复制到您的答案中。我的目标是保留有关实际发生的事实。
  • @matt,已添加附录。
猜你喜欢
  • 2018-05-01
  • 2023-03-16
  • 2018-10-18
  • 2018-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多