オープンソースプロジェクトTracには、優れたdiff蛍光ペンがあります。変更された行と、変更された各行の変更されたバイトが強調表示されます。例については、ここまたはここを参照してください。
bashターミナルで、または差分出力(パッチファイル)に同じ色の強調表示(つまり、変更された行と変更されたバイトも)を使用する方法はありますか?gitvim
回答:
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'
git add -p。さらに追加してください:git config --global interactive.diffFilter diff-highlight
git diffまたはgit logおそらく他のユーザーも使用しながら、オプションを使用します--word-diff=color(ワード差分には他のモードもあります)。
--word-diff=color(特にとgit config color.diff.old "red reverse"でgit config color.diff.new "green reverse")本当に良いですが、私が望んでいるものではありません:(
git add --patch:stackoverflow.com/questions/10873882/...
diff-highlight、単語の差分と行の差分の両方でうまく機能することです。
diff-so-fancyは、diff人間の眼球用に設計された蛍光ペンです。
先頭の+/を削除します-切り取り/貼り付けに煩わしいをファイル間のセクションを明確にします。
色付きgit(左)対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-highlightてgitの出力を取得し、非常に標準的なフォーマットの出力を生成しdiffます。
からデフォルトで使用するには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です。これらのオプションについて少し説明していただけますか?
dsf()。
希望する動作が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を追加するだけでハングします。
git config interactive.diffFilter diff-highlight
diff-highlight私は私の道にいなかったので、私はそれを最初に見つけなければなりませんでした。以下の私の答えの詳細。
バイトベースの差分のユーティリティは、v1.7.8 1以降、公式Gitで配布されています。あなたはそれがあなたのマシンにインストールされている場所を見つけてそれを有効にする必要があります。
/usr/local/opt/gitcd / && pwd -Wして、インストールディレクトリを見つけます。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 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バージョンですが、それ以降、多くの変更が加えられています。
which git、それは:-)ではない場合、それは動作しませんので、最初の場所でPATHにあるように、それを必要とする
diff-highlightていますが、実際にはインストールされないため、(少なくともmacOSでは)シンボリックリンクのステップが実際に必要です。ご使用のプラットフォームでは不要であることが判明した場合は、回答を更新してください。一方、which gitGit はgitパス上のどこかにバイナリをインストールするため、通常は機能します。
.perl。コンパイルは簡単です。ディレクトリで実行sudo makeするだけdiff-highlightです。
私は--color-wordsオプションを使用し、それは私のためにうまくいきます:
$ git diff --color-words | less -RS
@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)+'
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
colordiff -u <(patch original_file -i patch_file -o -) <(cat original_file) ただし、これは変更された行をバイトで はなくハイライトするだけです...
dwdiff -c --diff-input diff_file
難しい
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変更されたバイトにどのように追加されたかに注意してください。
はい、Vimは行内で変更されたテキストの強調表示を含めてこれを行います。
見て:h diff、:h 08.7ファイルを比較する方法の詳細については、を。
Vimは強調表示にかなり単純なアルゴリズムを使用しています。最初に変更された文字、最後に変更された文字の行を検索し、それらの間のすべての文字を強調表示します。
つまり、行ごとに複数のハイライトを付けることはできません。Vimでの多くの設計決定は効率を優先します。
vimdiff file1 file2 2つのファイル間の文字ごとの違いを表示します。
vimdiffは、vimに含まれているdiffツールです。(Vimは+ diffオプションでコンパイルされているはずです。:version)
vim内から起動することもできます。詳細:help diffとコマンドについては、を参照してください。
vimdiff file.old file.new -c 'FormatCommand diffformat' -c 'w! file.diff.html' -c 'qa!'。
screen -D -mまたはアペンド&>/dev/null(/ dev / nullバリアントは、奇妙なバグを生成する場合があります)、ターミナルが点滅したくない場合)、フォーマットが完了した後にvimを終了しますが、純粋なvimscriptであり、私の最適化でも、大きなファイルの場合は非常に遅くなります。
注:これはここにあるものの複製です:gitのdiff強調表示を改善するには?。私の回答もここに投稿してください。直接このスレッドを見つけた人に役立つかもしれません:)
以前のいくつかの回答で述べたように、これはgitのみで可能です。お使いのシステムによっては手順が少し簡単になる可能性があるため、これを投稿しますが、これは他のいくつかの回答と似ています。
純粋にgitとその貢献者に依存している1つのソリューション。これには、gitに付属するファイル以外のファイルは必要ありません。すべての説明はUbuntu(18.04LTSでテスト済み)に関するものであり、他のLinuxシステムでも同様に機能するはずです。
find -L /usr -name diff-highlight -type f
私のシステムでは、唯一の有効な答えは次のとおりです。
/usr/share/doc/git/contrib/diff-highlight/diff-highlight
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