git - 如何使用寻呼机进行长 git add --patch 大块头?

标签 git git-diff pager git-add

当我以交互方式添加 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 diffgit log不互动。 git add -p和寻呼机是交互式的。
管道模型的性质意味着一次只能控制一个应用程序 ,并且需要控制交互式应用程序。为了让寻呼机获得对终端的控制(以便它可以显示提示并响应您的输入),git add -p必须释放控制权。一旦发生,就无法收回。
这样看:会有两个命令行提示 试图与您互动:用于 git add -p 的那个和一个寻呼机。他们将如何协调?它必须是这样的:

  • git add -pstdout 写了一大堆, 以及大块结束 (EOH) 标记而不是通常的文件结束 (EOF) 标记。
  • git add -p然后将终端的控制权交给管道另一端的任何应用程序。
  • 寻呼机将接收大块,并控制终端显示大块的碎片及其命令提示。
  • 寻呼机的行为与通常一样,但有很大的不同。通常它会看到一个 EOF 标记,所以当你说你完成时(quit 命令),它退出。但是 EOH 制造商告诉寻呼机,“不要退出。当用户完成后,将控制权交还给上游应用程序。不要退出。等待。”
  • 因此,当您使用各种寻呼机命令仔细阅读大块时,您将使用它的 quit命令告诉它你已经像往常一样完成了。
  • 但是现在寻呼机没有退出,而是以某种方式将终端控制权交还给 git add .
  • git add的终端提示然后将替换寻呼机的...
  • ...现在我们回到第 1 步。继续重复直到 EOF。

  • 如您所见,这不仅是 糟糕的用户体验 (使用寻呼机的 quit 命令在每个大块上返回 git add),它会 彻底破坏 Unix 管道模型的强大功能和美感 .
    出于同样的原因, git add -p cannot use diff-so-fancy git -p的唯一途径拥有类似寻呼机的行为就是有一个内置的,或者定义一个“Git Pager API”,然后我们等待人们编写与这个 API 一起工作的寻呼机。这是插件模型 ,这与 非常不同管道模型 .这也意味着紧密集成:git add -p命令和寻呼机命令必须组合在一起并在每个命令提示符下可用。
    使用终端应用程序的分页
    我发现在终端窗口中向上滚动很容易。我的键盘命令允许我逐行或逐页移动。
    使用 git add -psplit命令
    您是否考虑过使用 git add -psplit命令打破大块头?无论如何,我发现较小的帅哥更容易推理!

    关于git - 如何使用寻呼机进行长 git add --patch 大块头?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39743490/

    相关文章:

    Git:如何只列出本地分支机构?

    git - "git branch"和 "git checkout -b"有什么区别?

    git - 如何检索 stash 的更改

    git - 是否可以在 gitk 中配置差异?

    git - 'git diff' 显示不够

    php - Yii2 中的滚动寻呼机扩展

    php - Symfony2 DatagridBundle/SonataNewsBundle Pager nbResults 计算不正确

    git - 将文件移至 LFS 后如何从 git 数据库中删除该文件?

    ibm-midrange - IBM i 操作系统上的 git diff 奇数字符

    ios - 委托(delegate)不会执行功能