web-dev-qa-db-ja.com

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

オープンソースプロジェクト Trac には優れたdiffハイライターがあります—変更された行を強調表示しますおよび変更された各行の変更されたバイト!here または here 例.

Bashターミナル、git、またはvimで同じ色のハイライト(つまり、変更された行および変更されたバイトも)を使用する方法はありますか?diff出力(パッチファイル)に対して?

75

diff-highlight Perl contrib script は、Tracが使用していると思われるTracスクリーンショットの出力と非常に類似した出力を生成します。

enter image description here

でインストール:

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'
51
Sina Samavati

git diffまたはgit logおよびおそらくその他を使用しているときに、オプション--Word-diff=colorを使用します(Word diffs BTWには他のモードもあります)

35
anydot

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

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

色付きのgit(左)vs diff-so-fancy(右-文字レベルのハイライトに注意してください):

diff-so-fancy output

diff-so-fancy (右側)出力で、gitリポジトリー内のファイルに制約されない場合は、次の関数を.bashrcに追加して、任意のファイルで使用します。

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

例えば:

dsf original changed-file

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

diff-so-fancyの非標準の書式設定が気に入らないが、文字レベルのgit強調表示が必要な場合は、 diff-highlight を使用します。これにより、gitの出力が生成され、標準のdiff- format出力:

diff-highlight screenshot

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に指示します。

12
Tom Hale

私が使う --color-wordsオプションとそれは私のためにうまく動作します:

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

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

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

どこ /usr/share/doc/git/contrib/diff-highlight/diff-highlightは、Ubuntu 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のコメントは埋もれています。セットアップが本来あるべきほどささいなことではなく、少なくとも [〜#〜] readmeにある指示のUbuntuのバージョンでは[〜#〜] 動作しません。

9
dshepherd

V1.7.8以降、バイトベースの差分用のユーティリティが公式Gitとともに配布されました1。マシンのどこにインストールされているかを見つけて有効にするだけです。

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

  • GitがインストールされているMacOS( Homebrew ):_/usr/local/opt/git_
  • Windows for Git for Windows :_cd / && pwd -W_を実行してインストールディレクトリを見つけます。
  • Linux:オタク。 Gitのインストール先がまだわからない場合は、ll $(which git)または_locate git_が役立ちます。

_diff-highlight_をbinディレクトリにリンクして、PATHで見つけられるようにします

_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バージョン ですが、 多くの変更点 がありますそれ以来作られました。

7
Cory Klein

as@ dshepherdsays

必要な動作が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)+'
4
Eugen Konkov

Diffy

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

enter image description here

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

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がどのように追加されたかに注意してください。

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
1
Finbar Crago

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

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

0
PDug

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

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

Vim内から起動することもできます。見る :help diff詳細およびコマンドについて。

0
Xavier T.