不要在只有一页上有更改时自动终止git diff

4
如果我运行git diff,而我的更改小于一页,则命令将自动退出。这是不希望的,因为它在脚本中,之后我立即调用git commit。这会导致错过单页变更日志。
我的第一个想法是将差异传送到less,但这会导致没有差异的变更日志显示为空屏幕(需要按q退出)。这是我正在使用的命令:git diff --color=always | less
有更好的方法吗?

1
你有一个.lessrc文件吗?默认情况下,less不应该自动存在。(例如,less-e-E选项提供了您报告的行为。) - chepner
忽略上面的评论,看看我的回答;我设置了一个环境变量,防止less提前退出。 - chepner
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's comment,并且由于@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的解释:

您应该正确使用read -r,以避免无意中破坏第一行。这仍然会破坏前导或尾随空格。在read -r之前使用IFS=$'\n'可以解决这个问题。echo如果第一行以破折号开头(看起来像echo的选项参数),可能会抛出错误或表现奇怪--使用printf'%s\n' "$A"代替以避免这种情况。

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


2
优化的方法是只运行一次 git diff,而不是两次,并动态决定是否运行 lessgit diff | (read A; if [ -n "$A" ]; then echo "$A"; less; fi) 同样可以正常工作。 - Phillip
1
@HubertGrzeskowiak 不,这是有意的。如果有任何输出,则运行“less”,否则只需退出。 - Phillip
1
我是一个长期使用Linux的用户,最近刚刚学到了很多关于bash的用法 :-) - Hubert Grzeskowiak
1
你应该正确使用 read -r,以避免无意中破坏第一行。这仍然会破坏前导或尾随空格。在 read -r 之前使用 IFS=$'\n' 可以解决这个问题。如果第一行以破折号开头(看起来像是选项参数),则 echo 可能会抛出错误或表现奇怪 - 使用 printf '%s\n' "$A" 来避免这种情况。 - tripleee
1
@ScottWeldon 是的,我本意是像 @tripleee 后来所做的那样将 echo 输出导入到 less 中。抱歉。 - Phillip
显示剩余13条评论

2
你所看到的是git调用带有-F选项的less。通常情况下,less使用存储在环境变量LESS中的任何选项。如果未设置该变量,则git在运行less之前自动将其设置为FRX。(也就是说,在没有为LESS指定任何值的情况下,git实际上正在运行less -FRX。)

一个覆盖此设置的方法是将以下内容添加到您的.gitconfig文件中:

[core]
    pager = less -+F

如果没有设置LESS,那么上述配置会导致调用less
LESS=FRX less -+F

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

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


1

如果您使用的分页程序是less,您可以通过以下方式影响所有调用的行为:

export LESS=-E

这将覆盖任何先前的值。为了避免这种情况,而是在其他选项前面添加-E,请使用。
LESS=-E"${LESS#-}"

要仅影响git,可能需要像这样的内容

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

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

对于其他分页程序,类似的方法应该也可以奏效。您只需要找到影响此行为的选项。


实际上,我已经使用这个方法在运行git时将LESS=-r添加到设置中,以便正确地使用颜色代码。不知道为什么,但似乎在我使用git的所有平台上都存在这个问题。 - tripleee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接