2016-09-13 1 views
4

git diffを実行し、変更が1ページ未満の場合、コマンドは自動的に終了します。これはスクリプト内にあるので望ましくないので、すぐにgit commitを呼び出します。これにより、単一ページの変更ログが失われます。変更が1ページにある場合、git diffを自動的に終了しない

最初に考えたのは、差分をlessにパイプすることですが、これにより、変更ログに空白の画面が表示されることはありません(qを押して終了する必要があります)。私が使用しているコマンドは次のとおりです:git diff --color=always | less

これを行うにはいくつかの方法がありますか?

+1

はあなたを行いますどこかに '.lessrc'ファイルがありますか? 'less'はデフォルトでは自動的には存在しません。 (例えば、 '-e'と' -E'のオプションは 'less'になります) – chepner

+0

上記のコメントを無視し、私の答えを見てください。私は環境変数を設定して、「less」が早期に終了するのを防ぎます。 – chepner

答えて

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) 

1 -linerには、パフォーマンスを向上させるために一度だけgit diffを実行する利点があります。

@tripleee's commentあたりのいくつかの説明:あなたが適切に意図せずに最初の行をマングルしないようにread -rを使用する必要があります

。これは、先頭または末尾の空白をまだmangleします。 で修正することができます。read -rより前に修正してください。 echoは、最初の行がダッシュ(オプションの引数のようにechoのように見えます)で始まっていれば間違った動作をするかもしれません。代わりにprintf '%s\n' "$A"を使用してください。どちらの場合も

lessに渡さ--raw-control-charsオプション(ショートバージョン-r)は、色が正しく表示するようになります。

+0

これは、 'diff'を一度だけ行うように最適化することができます:' PAGER'環境変数を同様のbashスクリプトに設定して 'git diff'を実行すると、' PAGER = "read A; [-n ' $ A ']; echo' \ $ A '; less; fi "git diff'です。 – Phillip

+0

@Phillip私は、ビジネスロジックのページャー変数を最適化することは考慮しませんでしたが、これはコードゴルフにとって素晴らしいハックです。 –

+2

最適化は、 'git diff'を2回ではなく1回だけ実行し、' less'を実行するかどうかを動的に決定することです。 'git diff | (Aを読む; [-n "$ A"]; echo "$ A"; less; fi) 'も同様に動作します。 – Phillip

1

提供lessがあなたのページャである、あなたは、以前の値を上書きします

export LESS=-E 

これですべての呼び出しのために、この動作に影響を与えることができます。これはsh構文であることを避け、代わりに他のオプションの前に-Eを追加し、ちょうどgitのためにそれに影響を与えるために

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

を使用するには、多分

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

のようなものは(つまりはする必要がありますksh,zshなど)

他のポケットベルの場合、同様のアプローチが有効です。この動作に影響を与えるオプションを見つけるだけでいいです。

+0

実際には、カラーコードを正しく動作させるために 'git'を実行しているときに' LESS = -r'を設定に追加するためにこれを使っています。私は 'git'を使用するすべてのプラットフォームで問題になるようです。 – tripleee

2

lessは、-Fオプションで呼び出され、gitです。通常、lessは、環境変数LESSに格納されているオプションを使用します。その変数が設定されていない場合、lessを実行する前にgitが自動的にFRXに設定します。 (これはLESSの値なし、gitが効果的less -FRXを実行している、である。)これをオーバーライドする

一つの方法は、あなたの.gitconfigファイルに以下を追加することです:LESSは、その後、設定されていない場合

[core] 
    pager = less -+F 

上記の設定は、

最初経由で有効になっている -Fオプションを意味
LESS=FRX less -+F 

と呼ばれるようにlessを引き起こしlessが実行されている環境では、すぐにが無効になります。コマンドラインから

(あなたの質問に私のコメントでは、私は私が実際に私の環境でLESS=Xを持っているので、私は-Fが自動的に追加されていなかったので、ことを観察した。lessが早期に終了するべきでないことを示している。)

関連する問題