如果我运行git diff
,并且我的更改少于一页,该命令将自动退出。这是不希望的,因为这是在脚本中,git commit
之后我立即调用。这会导致丢失单页更改日志。
我的第一个想法是将差异通过管道传输到less
,但这不会导致差异变更日志显示一个空屏幕(需要q
按下退出)。这是我正在使用的命令:git diff --color=always | less
.
有没有更好的方法来做到这一点?
这是一个完成这项工作的bash脚本:
#!/bin/bash
num_lines=$(git diff | wc -l)
if [ $num_lines -eq 0 ]
then
echo "No changes"
else
git diff --color=always | less --raw-control-chars
fi
或者,这是一个最初基于@Phillip的评论的单行代码,感谢@tripleee的一些修复:
git diff --color=always | (IFS=$'\n' read -r A; if [ -n "$A" ]; then (printf '%s\n' "$A"; cat) | less --raw-control-chars; else echo "No changes"; fi)
one-liner 的优点是只运行git diff
一次以获得更好的性能。
每个@tripleee 的评论的一些解释:
您应该正确使用
read -r
,以免无意中破坏第一行。这仍然会破坏前导或尾随空格。您可以使用IFS=$'\n'
before修复它read -r
。如果第一行以破折号开头(看起来像一个选项参数),echo
则可能会引发错误或行为异常——请改用它来避免这种情况。echo
printf '%s\n' "$A"
在这两种情况下,传递给的--raw-control-chars
选项(短版本)将导致颜色正确显示。-r
less
您所看到的是使用选项 byless
调用的。通常,使用存储在环境变量中的任何选项。如果未设置该变量,则在运行前自动将其设置为。(也就是说,没有值,实际上正在运行。)-F
git
less
LESS
git
FRX
less
LESS
git
less -FRX
覆盖它的一种方法是将以下内容添加到您的.gitconfig
文件中:
[core]
pager = less -+F
如果LESS
没有设置,那么前面的配置会导致less
调用为
LESS=FRX less -+F
这意味着该-F
选项首先通过less
运行环境启用,然后立即从命令行禁用。
(在我对你的问题的评论中,我表示不less
应该提前退出。我观察到因为我实际上LESS=X
在我的环境中,所以我没有-F
自动添加。)
提供less
的是您的寻呼机,您可以通过以下方式影响所有调用的此行为
export LESS=-E
这将覆盖任何先前的值。为避免这种情况,而是添加-E
到其他选项的前面,请使用
LESS=-E"${LESS#-}"
只是为了影响它git
,也许像
alias git='LESS=-E"${LESS#-}" git'
(这是sh
语法,即应该适用于 Bash、ksh
、zsh
等)
对于其他寻呼机,类似的方法应该有效。您只需要找到影响此行为的选项。