如果更改在一页上,不要自动终止 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
.
有更好的方法吗?
这里有一个 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'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、ksh
、zsh
等)
对于其他寻呼机,类似的方法应该有效。您只需要找到影响此行为的选项。
您看到的是 less
被 git
使用 -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
自动添加。)
如果我运行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'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 withIFS=$'\n'
beforeread -r
.echo
might throw an error or behave strangely if the first line starts with a dash (which looks toecho
like an option argument) -- useprintf '%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、ksh
、zsh
等)
对于其他寻呼机,类似的方法应该有效。您只需要找到影响此行为的选项。
您看到的是 less
被 git
使用 -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
自动添加。)