如果更改在一页上,不要自动终止 git diff

Don't automatically terminate git diff if changes are on one page

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

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

有更好的方法吗?

这里有一个 脚本来完成这项工作:

#!/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's comment, with some fixes thanks to @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)

单行的优点是只有运行git diff一次,性能更好。

根据 @tripleee's comment 的一些解释:

You should properly use read -r to not unintentionally mangle the first line. This will still mangle leading or trailing whitespace. You can fix that with IFS=$'\n' before read -r. echo might throw an error or behave strangely if the first line starts with a dash (which looks to echo like an option argument) -- use printf '%s\n' "$A" instead to avoid that.

在这两种情况下,传递给 less--raw-control-chars 选项(简短版本 -r)将使颜色正确显示。

如果 less 是您的寻呼机,您可以通过

影响所有调用的此行为
export LESS=-E

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

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

只影响 git,可能是

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

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

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

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

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

[core]
    pager = less -+F

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

LESS=FRX less -+F

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

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