web-dev-qa-db-ja.com

git-diffのようにdiffを動作させるには?

git diffの出力フォーマットが好きです。行間の変化の色と+/-表現は、GNU diffよりも読みやすいです。

git diffフラグをgitリポジトリの外で使用して--no-indexを実行でき、正常に動作します。ただし、ファイルまたはサブディレクトリを再帰diffから除外するための--excludeオプションが欠落しているようです。

両方の長所を活用する方法はありますか? (色オプションと+-/git diff形式とGNU diff)の--excludeオプション。

colordiff を試してみましたが、git diffの出力形式の方が好きです

120
Mzzzzzz

色の付け方がわかりませんが、これで+/- のではなく <および>

diff -u file1 file2
141
jonescb

git diff --no-index -- A Bを使用することもできます( manpage を使用)。

84
eacousineau
  1. colordiff をインストールします。

  2. 〜/ .colordiffrcを更新します(必要に応じて、最初に/ etc/colordiffrcをコピーします):

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. つかいます colordiff -u file1 file2 2つのファイルまたはcolordiff -ruN path1 path2パスを再帰的に比較します。

まったく同じではありませんが、非常に近いものです。

23
Steve

これは私が提案するものであり、かなり近いです

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff:これをインストールする必要があります
    • brew install colordiff私のMacで。
    • port install colordiff一部のMacでは。
    • Sudo apt-get install colordiff DebianまたはUbuntuで
    • 他のプラットフォームの場合、 メインページ または GitHub からソースをダウンロードし、 インストール手順 に従ってください
  • -R:これは、未加工コードの代わりに色を表示するようLessに指示します。

最終的には-wホワイトスペースの差分を表示したくなかったため。

diff -w -u FILE1 FILE2 | colordiff | less -R

編集:@Ciprian Tomoiagaのコメントで示唆されているように、これを関数にして~/.bashrcファイルも。

function gdiff () { diff -u $@ | colordiff | less -R; }
15
Nate

bashdifftput、およびlessのみを使用すると、git diffの出力を厳密に近似できます。ただし、diffプログラマーの近視眼のために、いくつかの顕著な違いがあります。

次のBash関数定義を、ユーザーアカウントから自動的に取得されるファイルに配置すると、コマンドラインから関数にアクセスできるようになります。

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

この関数は次のように機能します。

  1. 最終的に、diffは、ファイル内の変更がどのように表示されるかを指定するためのさまざまなフォーマットオプションで呼び出されます。
  2. tputは、ANSIカラーコードをこれらのフォーマットオプションに挿入するために使用されます。非ANSI端末を使用する場合は、tput setaftput setfに置き換える必要があることに注意してください。
  3. diffの出力は、lessにパイプされます。 -Rを使用すると、ANSIカラーを保持できます。 -Xは、lessが終了時に画面をクリアしないようにします。 -Fは、出力が1画面に収まる場合、lessがポケットベルとして動作するのを防ぎます。
  4. 最初のパラメーターが@fullの場合、関数は追加および削除された行に加えて、変更されていないすべての行を表示します。

このアプローチとgit diffの以下の違いに注意してください。

  1. git diffは、各変更を囲む3行のコンテキストを報告します。あいにく、diffは、コンテキスト行の数を指定すると同時に書式設定オプションも指定したい場合、文句を言って終了するようです。 (少なくともMac OS X Yosemiteではそうです)。 diffプログラマーに感謝します。したがって、デフォルトの動作である各変更を囲むコンテキスト行を要求しないか、@fullを最初のパラメーターとして指定することにより、ファイル内のすべての変更されていない行も報告されるように要求できます。
  2. コンテキストの行はgit diffとは異なるため、この関数によって報告される行番号もgit diffによって報告される行番号と異なります。
  3. 単一行の変更が報告されることがありますが、これは正しい動作ですが、変更されたファイルに単一の空行が挿入されている場合は迷惑です。 git diffは、コンテキスト行を介してこれをより適切に処理していると思います。必要に応じて、diffにさまざまなオプションを渡して、空白の処理を改善することができます。
2
Dejay Clayton

GNU diffには、Unix SEの この回答 に従って、2016年後半のバージョン3.4以降の--colorオプションがあります。 -uと並んでgit diffの出力を模倣するには十分です:

diff -u --color=always file1 file2 | less -r

--colorはパイプで使用する場合はalwaysでなければなりません。autoはパイプの色をオフにします。

私はこれをWindowsのGit Bashでのみ試しましたが、less -Rはハンクの最初の行にのみ色を付けます。 less -rはその場合私のためにそれを修正しました。

2
codehearts

あなたが探している colordiff

Sudo apt-get install colordiff

これを_.bashrc_または_.zshrc_に配置します。

diff() { git diff --no-index "$1" "$2" | colordiff; }

要件:gitcolordiffは事前にインストールする必要があります。

使用法:_diff file1 file2_

例:$ _diff .tmux.conf .zshrc.pre-oh-my-zsh_の場合

diff function example

2
himanshuxd

colordiff を使用します。

インストール:

Sudo apt-get install colordiff

使用法:

colordiff -u file_one file_two

git diffで示されるものとまったく同じ違いを与えます。

0
Rakmo

もう1つのオプションは、リポジトリの外部から実行することで、gitはファイル間の差分を認識します。例えば。次のようなシェル関数:

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}
0
Karl