4

如果我运行git diff,并且我的更改少于一页,该命令将自动退出。这是不希望的,因为这是在脚本中,git commit之后我立即调用。这会导致丢失单页更改日志。

我的第一个想法是将差异通过管道传输到less,但这不会导致差异变更日志显示一个空屏幕(需要q按下退出)。这是我正在使用的命令:git diff --color=always | less.

有没有更好的方法来做到这一点?

4

3 回答 3

5

这是一个完成这项工作的脚本:

#!/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则可能会引发错误或行为异常——请改用它来避免这种情况。echoprintf '%s\n' "$A"

在这两种情况下,传递给的--raw-control-chars选项(短版本)将导致颜色正确显示。-rless

于 2016-09-13T16:54:55.690 回答
2

您所看到的是使用选项 byless调用的。通常,使用存储在环境变量中的任何选项。如果未设置该变量,则在运行前自动将其设置为。(也就是说,没有值,实际上正在运行。)-FgitlessLESSgitFRXlessLESSgitless -FRX

覆盖它的一种方法是将以下内容添加到您的.gitconfig文件中:

[core]
    pager = less -+F

如果LESS没有设置,那么前面的配置会导致less调用为

LESS=FRX less -+F

这意味着该-F选项首先通过less运行环境启用,然后立即从命令行禁用。

(在我对你的问题的评论中,我表示不less应该提前退出。我观察到因为我实际上LESS=X在我的环境中,所以我没有-F自动添加。)

于 2016-09-13T18:14:47.390 回答
1

提供less的是您的寻呼机,您可以通过以下方式影响所有调用的此行为

export LESS=-E

这将覆盖任何先前的值。为避免这种情况,而是添加-E到其他选项的前面,请使用

LESS=-E"${LESS#-}"

只是为了影响它git,也许像

alias git='LESS=-E"${LESS#-}" git'

(这是sh语法,即应该适用于 Bash、kshzsh等)

对于其他寻呼机,类似的方法应该有效。您只需要找到影响此行为的选项。

于 2016-09-13T17:33:01.867 回答