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

时间:2016-09-13 16:41:30

标签: git bash less-unix

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

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

有没有更好的方法呢?

3 个答案:

答案 0 :(得分:5)

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

html,
body {
  min-height: 100% !important;
  height: 100%;
}

.container {
  width: 100%;
  min-height: 100%;
  height: 100%;
}

.images {
  width: 100%;
  min-height: 100% !important;
  height: 100%;
}

#content {
  min-height: 100% !important;
  height: 100%;
  /*Change this to change width*/
  width: 70%;
  resize: horizontal;
  float: right;
  position: relative;
  background: white;
}

div {
  border: 1px solid black;
}

span {
  border: 1px solid black;
  border-radius: 50%;
  position: absolute;
  top: calc(50% - 20px);
  left: -10px;
  cursor: pointer;
  height: 40px;
  width: 40px;
  display: inline-block;
  background: white;
}

或者,这里有一个最初基于@Phillip's comment的单行,有一些修复感谢@tripleee

#!/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

单线程的优点是只运行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) 一次以获得更好的性能。

@tripleee's comment的一些解释:

  

你应该正确使用git diff来无意地破坏第一行。这仍然会破坏前导空格或尾随空格。您可以在read -r之前使用IFS=$'\n'进行修复。如果第一行以短划线开头(read -r类似于选项参数),echo可能会抛出错误或行为异常 - 请使用echo来避免这种情况。

在这两种情况下,传递给printf '%s\n' "$A"的{​​{1}}选项(简短版--raw-control-chars)都会使颜色正确显示。

答案 1 :(得分:2)

您看到less使用-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,所以我没有{{1}自动添加。)

答案 2 :(得分:1)

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

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

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

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

仅针对git影响它,可能类似于

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

(这是sh语法,即应该适合Bash,kshzsh等。)

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