问题描述
我在 Windows 10 上使用 git bash 2.32。
在更新到 2.32 后的 git bash 中,我看到用于显示日志的命令的奇怪行为:
git -c core.pager='less -S -F' log --all --decorate --oneline --graph
如您所见,我尝试使用带有 less
寻呼机的“狗”命令,以在 EOF 时退出并剪切长度超过当前屏幕宽度的行。
但是在我更新到 2.32 后,输出似乎在 80 个符号后被截断,这通常远小于实际屏幕宽度(如下图所示)。
我正在尝试了解如何增加该限制,以便 less
截断长度超过 160 个符号的行,或者只是不适合当前屏幕的行。
注意:我将宽度更改为 160,现在 echo $COLUMNS
返回 160,但这没有一点帮助。
注意:我还为当前会话启用了 checkwinsize
选项。也没有运气。
解决方法
这是一个相对较新的 Git-for-Windows 错误,在 Git 邮件列表的存档中找到了 here 的讨论和补丁。 this GitHub issue 中有很多进一步的讨论。该错误将在 Git-for-Windows 的下一次更新中修复。
与此同时,请考虑this workaround from KalleOlaviNiemitalo:
git config --global core.pager "env -u COLUMNS less"
,
问题“Duplicated lines when moving in pager #3235”将在 Git 2.33(2021 年第 3 季度)中修复。
您可以立即使用 Git for Windows snapshots 对其进行测试。
(见顶部的重复行)
根本原因:当我们无法弄清楚终端有多宽时,我们自己使用了 80 的回退值(这是无法避免的),但是当我们运行寻呼机时,我们将其导出到COLUMNS
,它强制寻呼机使用硬编码值,即使寻呼机完全有能力自己计算出来。
当我们使用硬编码的默认值供我们自己使用时,停止导出 COLUMNS
。
请参阅 commit 9b6e2c8 的 Johannes Schindelin (dscho
)(2021 年 6 月 21 日)。
(由 Junio C Hamano -- gitster
-- 于 commit 32d6280 合并,2021 年 7 月 8 日)
pager
:避免在我们猜测它的值时设置 COLUMNS
合著者:Junio C Hamano
签字人:约翰内斯·辛德林
我们在 Git 中查询 TIOCGWINSZ
以确定 COLUMNS
的正确值,然后设置该环境变量。
如果 TIOCGWINSZ
不可用,我们回退到硬编码值 80 并且仍然设置环境变量。
在 Windows 上这是一个问题。
原因是 Windows 版 Git 使用的 less
版本依赖于 MSYS2 运行时与伪终端交互(通常在 MinTTY 窗口内,它也知道 MSYS2 运行时)。
MinTTY 和 less.exe
都通过 ioctl()
调用与该伪终端交互(即使 Windows 上没有这样的东西,MSYS2 运行时也会模拟)。
由于 https://github.com/gwsw/less/commit/bb0ee4e76c2,less
更喜欢使用 COLUMNS
变量而不是询问 ncurses 本身。
但是 git.exe
本身不意识到 MSYS2 运行时,或者对于那个伪终端的问题,并且无法调用 ioctl()
或 {{1} }.
因此,无论实际终端大小是多少,TIOCGWINSZ
都会回退到硬编码 80 列。
但是 git.exe
完全能够与 MSYS2 运行时交互,并且实际上不需要 Git 的帮助(这实际上让事情变得更糟)。
所以我们不要在 Windows 上覆盖 less.exe
。
除非我们设法从终端查询实际值,否则我们不要设置 COLUMNS
。