如何使用寻呼机进行长git add --patch hunks?

时间:2016-09-28 09:34:29

标签: git git-diff pager git-add

当我以diff交互式添加git add --patch帅哥时,我有时会得到比屏幕更长的帅哥。

这对我来说很奇怪,因为我已经设定了:

[core]
      pager = less -FRX --tabs=4

[pager]
  # Bypass pager: git --no-pager ...
  diff = diff-highlight | less -FRX --tabs=4

我需要做些什么才能添加使用pager

4 个答案:

答案 0 :(得分:4)

您不能。这是the Unix pipeline model的本质。

使用分页器的Git命令可以与任何通用stdin分页器一起使用的原因是由于该模型。这样的git命令将其输出写入stdout。寻呼机从stdin读取其输入。前者的stdout通过管道传输到后者的stdin。正是精确这种流水线模型的简单性,使传呼机变得通用,并且允许git允许您选择自己的传呼机,只要它使用此模型即可。

那么git add -p(或git add -i)为什么不能与git diffgit log一样?

因为一次只能有一个交互式应用程序。

git diffgit log不是交互式的。 git add -p和寻呼机 是交互式的。

管道模型的性质意味着一次只能控制一个应用程序,而交互式应用程序也需要控制。为了使寻呼机能够控制终端(以便它可以显示提示并响应您的输入),git add -p必须释放控制权。一旦完成,就无法收回。

以这种方式查看:将有两个命令行提示与您进行交互:一个用于git add -p,另一个用于寻呼机。他们将如何协调?它必须像这样:

  1. git add -pstdout写一个大块,以及一个大块结束(EOH)标记,而不是通常的文件结束(EOF)标记。
  2. git add -p然后将终端的控制权交给管道另一端的任何应用。
  3. 寻呼机将收到大块,并在终端的控制下显示大块及其命令提示符。
  4. 寻呼机的行为将与通常情况相同,但有很大的不同。通常,它会看到一个EOF标记,因此当您说完(quit命令)时,它会退出。但是EOH制造商告诉寻呼机:“不要退出。完成操作后,将控制权移交给上游应用程序。不要退出。请稍等。”
  5. 因此,当您使用各种传呼器命令仔细阅读了大块头之后,您将使用其quit命令来告诉您已完成操作,就像平时一样。
  6. 但现在,寻呼机没有退出,而是以某种方式将终端控制权交还给git add
  7. git add的终端提示将代替寻呼机的...
  8. ...现在回到第1步。继续重复直到EOF。

如您所见,这不仅是不良的用户体验(使用传呼器的quit命令返回到每个大块的git add),它还会< strong>完全破坏,破坏了Unix管道模型的力量和美丽。

出于同样的原因,git add -p cannot use diff-so-fancy

git -p拥有类似寻呼机的行为的唯一方法是拥有一个内置的或定义“ Git寻呼机API”,然后我们等待人们编写与此API一起使用的寻呼机。这是插件模型,它与管道模型非常不同。这也意味着紧密的集成:git add -p命令和分页器命令必须合并并在每个命令提示符下可用。

使用终端应用程序的分页

我发现在终端窗口中向上滚动很容易。我的键盘命令允许我逐行或逐页移动。

使用git add -p的{​​{1}}命令

您是否考虑过使用split的{​​{1}}命令来打破常规?无论如何,我发现更小的帅哥更容易推理!

答案 1 :(得分:2)

添加到您的[pager] add = less -FRX --tabs=4

[core]
  pager = less -FRX --tabs=4

[pager]
  # " = true" means use pager defined in [core]
  add      = true
  diff     = true
  difftool = true
  log      = true
  show     = true

或:

{{1}}

答案 2 :(得分:1)

作为解决方法,您可以设置e并使用editless)在大块上运行EDITOR="EDITOR='$EDITOR' bash -c 'set -m; less -K \"\$1\"' --" git add -p 。但是,这种解决方法仍然存在一些缺点。可以通过以下方法避免这些问题:

EDITOR
  • 在调用less之前重置v可以使用less中的标准-K键来调用编辑器。

  • less的{​​{1}}选项允许使用Control-C退出less,告诉Git不要上演帅哥。用less退出q将导致大块上演。

  • set -m创建了一个单独的进程组,该进程组阻止Control-C冒泡并杀死Git进程。

还有Magit之类的工具可以提供a better interface for interactive staging

答案 3 :(得分:1)

基于AtnNn's answer,我想到了以下别名:

ap = !"VISUAL=\"VISUAL='$VISUAL' bash -c 'set -m; less -K -+F \\\"\\$1\\\"' --\" git add -p \"$@\" #"
  • e以翻页less中的块
    • ^C退出并重复交互式菜单
    • q暂存显示的内容
    • v编辑显示的内容

我正在制作PR,以通过git本身进行修复。