変更された行と変更された各行の変更されたバイトを強調表示する


91

オープンソースプロジェクトTracには、優れたdiff蛍光ペンがあります。変更された行と、変更された各行の変更されたバイトが強調表示されます。例については、ここまたはここを参照してください。

bashターミナルで、または差分出力(パッチファイル)に同じ色の強調表示(つまり、変更された行と変更されたバイトも)を使用する方法はありますか?gitvim


あなたが強調したいことは何ですか?バイト変更をハイライトする差分ツールが必要ですか?(それは非常に役に立ちます)。あなたはvimと言います。私の記憶では、プログラミング言語テンプレート(およびその他)を使用している場合、vimはすでに多くの色操作を行っています。どのように変更しますか?VT100で定義されている端末ウィンドウの色を変更するために使用できるかなりの数のテクニックがあります(また、カラーエスケープシーケンスもサポートする他の定義が数十あります)。詳細を教えてください。または、en.wikipedia.org / wiki / VT100および関連リンクをお読みください。多分それは助けることができます。
シェルター、2011年

私はあなたがオープンソースツールだけに興味があり、ターミナルだけに興味があることを知っています。ただし、参照ポイントとして、slickeditのdiffzillaを確認することをお勧めします。私が使用したいくつかのdiffツールの中で、常に文字の違いを最もよく表しているように見えます(ただし、diffが複雑である場合、間違いなく問題がありました(書式設定とコード変更の組み合わせ、これは常に悪い考えです)
nhed


注:GitHubは、Web GUIでそのような差分ツールを提供するようになりました:stackoverflow.com/a/25723584/6309
VonC

私は「別の」純粋なgit、diff-highlightベースのソリューションを投稿し、チュートリアルで簡単に1)関連するdiff-highlightファイルを見つけ、2)実行可能にします3).gitconfigで必要なパラメーターを設定します ぜひご覧ください。手順はUbuntu 18.04を対象としていますが、Linuxシステムで広く機能するはずです。
Zorglub29

回答:


57

diff-highlightPerlのcontribのスクリプトは、それはおそらくTracはそれを使用していることであることをTracのスクリーンショットと同様のような出力を生成します。

ここに画像の説明を入力してください

インストール:

wget https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight && chmod +x diff-highlight

ファイルdiff-highlight~/bin/ディレクトリ(またはどこにでも$PATH)に移動し、以下をに追加します~/.gitconfig

[pager]
        diff = diff-highlight | less
        log = diff-highlight | less
        show = diff-highlight | less

@cirosantilliによって提案された単一コピーペーストインストール:

cd ~/bin
curl -O https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight
chmod +x diff-highlight
git config --global pager.log 'diff-highlight | less'
git config --global pager.show 'diff-highlight | less'
git config --global pager.diff 'diff-highlight | less'

この。これは素晴らしいです。ありがとうございました。一部の場所では少し保守的であるように見えますが、テキストの大部分が共通している行がいくつか欠けています。バグトラッカーはありますか?
naught101

20
ああ、これはコアgitの一部です:github.com/git/git/tree/master/contrib/diff-highlight
naught101

2
これはモジュールになりました。ダウンロードするのに最も簡単なバージョンは、raw.githubusercontent.com / git / git
Chris Midgley

4
これはコアgitの一部であるだけでなく、gitとともに配布されており、おそらくすでにシステム上にあります。これを有効にする方法の詳細を以下の回答に追加しました。↓
コリークライン

1
これは、を介して表示される差分を逃しますgit add -p。さらに追加してください:git config --global interactive.diffFilter diff-highlight
josch

40

git diffまたはgit logおそらく他のユーザーも使用しながら、オプションを使用します--word-diff=color(ワード差分には他のモードもあります)。


2
--word-diff=color(特にとgit config color.diff.old "red reverse"git config color.diff.new "green reverse")本当に良いですが、私が望んでいるものではありません:(
Nikolay Frantsev

4
だからあなたが欠けているのは色でマーキングされているだけです/どういうわけか同時に変更された行とバイトの両方を?
anydot

6
Tracのように、変更された行と変更された各行の変更されたバイトを強調表示したい。変更されたバイトだけでなく、同じではありません。
Nikolay Frantsev 2011年

あなたはまた、でこれを使用することができますgit add --patchstackoverflow.com/questions/10873882/...
naught101

の利点はdiff-highlight、単語の差分と行の差分の両方でうまく機能することです。
Ciro Santilli郝海东冠状病六四事件法轮功

20

diff-so-fancyは、diff人間の眼球用に設計された蛍光ペンです。

先頭の+/を削除します-切り取り/貼り付けに煩わしいをファイル間のセクションを明確にします。

色付きgit(左)対diff-so-fancy(右-文字レベルのハイライトに注意):

diff-so-fancy出力

あなたがしたい場合diff-so-fancy(右側)の出力をが、内のファイルに制約されないgitリポジトリ、あなたに以下の機能を追加し.bashrcたすべてのファイルにそれを使用します:

dsf() { git diff --no-index --color "$@" | diff-so-fancy; }

例えば:

dsf original changed-file

文字レベルの強調表示と標準diff形式

の非標準のフォーマットが気に入らないが、diff-so-fancy文字レベルのgit強調表示が必要な場合は、を使用しdiff-highlightgitの出力を取得し、非常に標準的なフォーマットの出力を生成しdiffます。

diff-highlightスクリーンショット

からデフォルトで使用するにはgit、に追加します.gitconfig

[color "diff-highlight"]
  oldNormal = red bold
  oldHighlight = red bold 52
  newNormal = green bold
  newHighlight = green bold 22

[pager]
  diff = diff-highlight | less -FRXsu --tabs=4

この[pager]セクションはgit、既にカラー化された出力をパイプdiff-highlightラインして文字レベルでカラー化し、デフォルトを使用するのではなく、出力をページングする(必要な場合)ように指示していますless


これは非常に興味深いgitconfigです。これらのオプションについて少し説明していただけますか?
caesarsol 2017年

更新され、機能も追加されましたdsf()
トム・ヘイル

14

希望する動作がgit自体で利用できるようになりました(naught101のコメントで指摘されているように)。これを有効にするには、ポケットベルを

perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

/usr/share/doc/git/contrib/diff-highlight/diff-highlightUbuntu 13.10の蛍光ペンスクリプトの場所はどこですか(なぜdocフォルダーにあるのかわかりません)。システムにない場合は、を使用locate diff-highlightして検索してみてください。強調表示スクリプトは(少なくとも私のマシンでは)実行できないため、の要件に注意してくださいperl

さまざまなdiffライクなコマンドで常に蛍光ペンを使用するには、次のコードを~/.gitconfigファイルに追加するだけです。

[pager]
    log = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    show = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    diff = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

私はこれを新しい回答として追加しました。naught101のコメントは埋もれており、セットアップは必要以上に簡単ではないため、少なくとも、Ubuntuのバージョンでは、READMEの指示が機能しないためです。


これは、git add -p(インタラクティブモード)内の差分の強調表示を有効にしないことに気づきました。どうすれば修正できるのかわかりません。リストにaddを追加するだけでハングします。
dshepherd 2014

5
これはgitの2.9.0で動作するようになりました:git config interactive.diffFilter diff-highlight
トーマス

^これ!残念ながら、diff-highlight私は私の道にいなかったので、私はそれを最初に見つけなければなりませんでした。以下の私の答えの詳細。
コリークライン

11

バイトベースの差分のユーティリティは、v1.7.8 1以降、公式Gitで配布されています。あなたはそれがあなたのマシンにインストールされている場所を見つけてそれを有効にする必要があります。

Gitがインストールされている場所を見つける

  • Homebrewを介してGitがインストールされたMacOS :/usr/local/opt/git
  • Windows for Git with Windows:実行cd / && pwd -Wして、インストールディレクトリを見つけます。
  • Linux:オタク。Gitのインストール場所がわからない場合は、ll $(which git)またはlocate git役立つはずです。

diff-highlightあなたのPATHがそれを見つけることができるようにあなたのbinディレクトリにリンクしてください

GIT_HOME='/usr/local/opt/git/'  # Use the value from the first step.
ln -s "${GIT_HOME}/share/git-core/contrib/diff-highlight/diff-highlight" \
      '/usr/local/bin/diff-highlight'

Git設定で有効にする

git config --global interactive.diffFilter diff-highlight # Use on interactive prompts
git config --global pager.diff "diff-highlight | less"    # Use on git diff
git config --global pager.log  "diff-highlight | less"    # Use on git log
git config --global pager.show "diff-highlight | less"    # Use on git show

1これv1.7.8バージョンですが、それ以降、多くの変更加えられています。


1
gitでの配布を開始したバージョンを指定することをお勧めします。また、ディストロはデフォルトでPATHに配置するので、シンボリックリンクの手順は不要になると思いますか?そしてwhich git、それは:-)ではない場合、それは動作しませんので、最初の場所でPATHにあるように、それを必要とする
チロSantilli郝海东冠状病六四事件法轮功

2
それが良いでしょう!その情報を自由に追加してください。Gitにはがバンドルされdiff-highlightていますが、実際にはインストールされないため、(少なくともmacOSでは)シンボリックリンクのステップが実際に必要です。ご使用のプラットフォームでは不要であることが判明した場合は、回答を更新してください。一方、which gitGit gitパス上のどこかにバイナリをインストールするため、通常は機能します。
Cory Klein

debian不安定版では、私が持っていたのでこのファイルを「コンパイル」する必要があったことに注意してください.perl。コンパイルは簡単です。ディレクトリで実行sudo makeするだけdiff-highlightです。
tobiasBora

10

私は--color-wordsオプションを使用し、それは私のためにうまくいきます:

$ git diff --color-words | less -RS

5
いいえ、これは言葉の違いだけを示しています。OP(およびI)が必要とするのは、単語の違いが強調表示された通常の行ごとの差分です(つまり、異なる行は色付きのテキストであり、それらの行内の単語の違いは通常の色付きのテキストであり、色付きの強調表示または何か)。質問のリンク例をご覧ください。
naught101 2013年

1
pastebin.com/1JrhYHRtは、実際に私はあなたの質問に説明するように素敵な強調表示を取得するにはモロカイカラースキームとdifftoolとはvimdiffとしてはvimdiffを使用しています。1- git config --global diff.tool vimdiff 2- in vim ":colo molokai " * Molokai @ github.com/tomasr/molokai *〜/ .vimrcで可能な自動colorcheme:if&diff set background = dark colorscheme molokai endif
amized 2013年

4

@dshepherd 言います

希望する動作がgit自体で利用可能になりました

ただしdiff-highlight、DOCにあり、シェルからは使用できません。ディレクトリに
インストールするdiff-highlightには、~/bin次の手順に従ってください(これにより、入力が節約されます)。

$ locate diff-highlight
$ cd /usr/share/doc/git/contrib/diff-highlight  #or path you locate
$ sudo make
$ mv diff-highlight ~/bin

次に.gitconfig、公式のドキュメントによると、

[pager]
    log  = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

UPD
またgit、インストールせずに最新のものを試すことができます。

git diff --color-words=.

より複雑:

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

1

Emacsにはあなたのニーズを満たすはずのediff-patch-buffer関数があります。

パッチが適用されていないファイルをemacsタイプESC-x、ediff-patch-bufferで開きます。

プロンプトに従ってください。ファイルのパッチされたバージョンと元のバージョンの比較が強調表示されます。

あなたのコメントに従って、以下はdwdiffのみを必要とするbashソリューションを提供します:

#!/bin/bash
paste -d'\n' <(dwdiff -2 -L -c <(cat $2) <(patch $2 -i $1 -o -)) <(dwdiff -1 -L -c <(cat $2) <(patch $2 -i $1 -o -))| uniq

申し訳ありませんが、emacsは使いたくありません
。bash

それは理解できます。他に考えられる唯一のことは、パッチのstdoutでcolordiffを使用することです。colordiff -u <(patch original_file -i patch_file -o -) <(cat original_file) ただし、これは変更された行をバイトで はなくハイライトするだけです...
Finbar Crago

私はあなたの問題をもう少し考え、dwdiffだけを必要とする2番目のソリューションを追加しました。
Finbar Crago

1
私の質問を注意深く読んでください。ファイルを比較したくないのです
Nikolay Frantsev

1
混乱して申し訳ありません。差分ファイルの変更された行の変更されたバイトを強調表示する方法の直後ですか?もしそうならdwdiff -c --diff-input diff_file
Finbar Crago

1

難しい

GitLabは、Diffy https://github.com/samg/diffy(Ruby)を使用して、GitHubおよびdiff-highlightと同様の出力を実現しています。

ここに画像の説明を入力してください

Diffyは、GitLabが使用するHTML出力を含め、同じアルゴリズムとGitを使用してdiff自体を作成し、さまざまなタイプの出力をサポートします。

gem install diffy
echo '
  require "diffy"    
  puts Diffy::Diff.new("a b c\n", "a B c\n").to_s(:html)
' | ruby

出力:

<div class="diff">
  <ul>
    <li class="del"><del>a <strong>b</strong> c</del></li>
    <li class="ins"><ins>a <strong>B</strong> c</ins></li>
  </ul>
</div>

strong変更されたバイトにどのように追加されたかに注意してください。


0

はい、Vimは行内で変更されたテキストの強調表示を含めてこれを行います。
見て:h diff:h 08.7ファイルを比較する方法の詳細については、を。

Vimは強調表示にかなり単純なアルゴリズムを使用しています。最初に変更された文字、最後に変更された文字の行を検索し、それらの間のすべての文字を強調表示します。
つまり、行ごとに複数のハイライトを付けることはできません。Vimでの多くの設計決定は効率を優先します。


残念ながら、diff出力の変更されたバイトは強調表示されません(set filetype = diff)
Nikolay Frantsev

1
私はあなたの質問を理解したと思います-diffコマンドのテキスト出力を構文で強調表示して、行内で行われた変更を強調表示したいとします。Vimでこのテキストを編集すると、行の違いが強調表示されますが、行内で行われた変更は強調表示されません。
PDug 2011年

Vimの:patchfileコマンドを使用して元のファイルをロードし、パッチを適用したバージョンと比較できますか?
PDug 2011年

残念ながらいいえ、複数のファイルに再帰的な差分出力を使用したい
Nikolay Frantsev

0

vimdiff file1 file2 2つのファイル間の文字ごとの違いを表示します。

vimdiffは、vimに含まれているdiffツールです。(Vimは+ diffオプションでコンパイルされているはずです。:version

vim内から起動することもできます。詳細:help diffとコマンドについては、を参照してください。


ファイルを比較したくない、diff(パッチ)ファイルを強調表示したい。
Nikolay Frantsev 2011年

@Nikolay Frantsevパフォーマンスを気にしない場合は、format.vimプラグインをインストールして実行できますvimdiff file.old file.new -c 'FormatCommand diffformat' -c 'w! file.diff.html' -c 'qa!'
ZyX 2011年

バッチモードで差分を実行し(プリペンドscreen -D -mまたはアペンド&>/dev/null(/ dev / nullバリアントは、奇妙なバグを生成する場合があります)、ターミナルが点滅したくない場合)、フォーマットが完了した後にvimを終了しますが、純粋なvimscriptであり、私の最適化でも、大きなファイルの場合は非常に遅くなります。
ZyX 2011年

0

:これはここにあるものの複製です:gitのdiff強調表示を改善するには?。私の回答もここに投稿してください。直接このスレッドを見つけた人に役立つかもしれません:)

以前のいくつかの回答で述べたように、これはgitのみで可能です。お使いのシステムによっては手順が少し簡単になる可能性があるため、これを投稿しますが、これは他のいくつかの回答と似ています。

純粋にgitとその貢献者に依存している1つのソリューション。これには、gitに付属するファイル以外のファイルは必要ありません。すべての説明はUbuntu(18.04LTSでテスト済み)に関するものであり、他のLinuxシステムでも同様に機能するはずです。

  • diff-highlight contrib git snippetを見つけます:
find -L /usr -name diff-highlight -type f

私のシステムでは、唯一の有効な答えは次のとおりです。

/usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • 対応するperlスクリプトを実行可能にします。私の場合、私はする必要がありました:
sudo chmod +x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • ~/.gitconfig追加して、必要な結果が得られるようにを更新します(これらは4つのスペースではなくTABSであることに注意してください)。
[color "diff-highlight"]
    oldNormal = red
    oldHighlight = red 52
    newNormal = green
    newHighlight = green 22
  • 結果をお楽しみください(注:これは差分のカラーリング+ハイライトのみです。もちろん、ここにもプロンプトの他にさまざまな機能があります:))。

diff-highligh

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.