当我以交互方式添加 diff
时帅哥与 git add --patch
, 我有时会看到比屏幕还长的大块头,但无法使用 less
翻阅大块头。
这对我来说很奇怪,因为我已经设置了:
[core]
pager = less -FRX --tabs=4
[pager]
diff = diff-highlight | less -FRX --tabs=4
interactive.diffFilter=
管道通过 less
也无助于分页。我需要做什么才能获得
git add--patch
使用 less
这样我就可以使用键盘来导航超过一个屏幕的任何输出?
最佳答案
你不能。这是the Unix pipeline model的性质.
使用分页器的 Git 命令可以与任何通用 stdin
一起使用的原因寻呼机就是因为这种模式。此类 git 命令将其输出写入 stdout
.寻呼机从 stdin
读取其输入. stdout
前者通过管道传送到 stdin
后者。正是这种管道模型的简单性使寻呼机具有通用性,并允许 git 允许您选择自己的寻呼机,只要它使用此模型即可。
那么为什么不能git add -p
(或 git add -i
)与 git diff
相同或 git log
?
因为一次只能有一个交互式应用程序。git diff
和 git log
不互动。 git add -p
和寻呼机是交互式的。
管道模型的性质意味着一次只能控制一个应用程序 ,并且需要控制交互式应用程序。为了让寻呼机获得对终端的控制(以便它可以显示提示并响应您的输入),git add -p
必须释放控制权。一旦发生,就无法收回。
这样看:会有两个命令行提示 试图与您互动:用于 git add -p
的那个和一个寻呼机。他们将如何协调?它必须是这样的:
git add -p
给 stdout
写了一大堆, 以及大块结束 (EOH) 标记而不是通常的文件结束 (EOF) 标记。 git add -p
然后将终端的控制权交给管道另一端的任何应用程序。 quit
命令),它退出。但是 EOH 制造商告诉寻呼机,“不要退出。当用户完成后,将控制权交还给上游应用程序。不要退出。等待。” quit
命令告诉它你已经像往常一样完成了。 git add
. git add
的终端提示然后将替换寻呼机的... 如您所见,这不仅是 糟糕的用户体验 (使用寻呼机的
quit
命令在每个大块上返回 git add
),它会 彻底破坏 Unix 管道模型的强大功能和美感 .出于同样的原因,
git add -p
cannot use diff-so-fancy
git -p
的唯一途径拥有类似寻呼机的行为就是有一个内置的,或者定义一个“Git Pager API”,然后我们等待人们编写与这个 API 一起工作的寻呼机。这是插件模型 ,这与 非常不同管道模型 .这也意味着紧密集成:git add -p
命令和寻呼机命令必须组合在一起并在每个命令提示符下可用。使用终端应用程序的分页
我发现在终端窗口中向上滚动很容易。我的键盘命令允许我逐行或逐页移动。
使用
git add -p
的 split
命令您是否考虑过使用
git add -p
的 split
命令打破大块头?无论如何,我发现较小的帅哥更容易推理!
关于git - 如何使用寻呼机进行长 git add --patch 大块头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39743490/