当我以diff
交互式添加git add --patch
帅哥时,我有时会得到比屏幕更长的帅哥。
这对我来说很奇怪,因为我已经设定了:
[core]
pager = less -FRX --tabs=4
[pager]
# Bypass pager: git --no-pager ...
diff = diff-highlight | less -FRX --tabs=4
我需要做些什么才能添加使用pager
?
答案 0 :(得分:4)
使用分页器的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
),它还会< 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
并使用edit
(less
)在大块上运行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
本身进行修复。