オープンソースプロジェクト Trac には優れたdiffハイライターがあります—変更された行を強調表示しますおよび変更された各行の変更されたバイト!here または here 例.
Bashターミナル、git
、またはvim
で同じ色のハイライト(つまり、変更された行および変更されたバイトも)を使用する方法はありますか?diff出力(パッチファイル)に対して?
diff-highlight
Perl contrib script は、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 diff
またはgit log
およびおそらくその他を使用しているときに、オプション--Word-diff=color
を使用します(Word diffs BTWには他のモードもあります)
diff-so-fancy
は、人間の眼球用に設計されたdiff
- highlighterです。
切り取り/貼り付けに煩わしい先頭の+
/-
を削除し、ファイル間のセクションを明確にします。
色付きのgit
(左)vs 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
- format出力:
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
に指示します。
私が使う --color-words
オプションとそれは私のためにうまく動作します:
$ git diff --color-words | less -RS
望む動作は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のバージョンでは[〜#〜] 動作しません。
V1.7.8以降、バイトベースの差分用のユーティリティが公式Gitとともに配布されました1。マシンのどこにインストールされているかを見つけて有効にするだけです。
/usr/local/opt/git
_cd / && pwd -W
_を実行してインストールディレクトリを見つけます。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 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バージョン ですが、 多くの変更点 がありますそれ以来作られました。
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)+'
Diffy
GitLabはDiffy https://github.com/samg/diffy (Ruby)を使用して、GitHubおよびdiff-highlightと同様の出力を実現しています。
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
はい、Vimは行内で変更されたテキストの強調表示を含めてこれを行います。
見る :h diff
および:h 08.7
ファイルの比較方法の詳細について。
Vimは、強調表示にかなり単純なアルゴリズムを使用します。最初に変更された文字、次に最後に変更された文字の行を検索し、それらの間のすべての文字を単に強調表示します。
これは、1行に複数のハイライトを表示できないことを意味します。Vimの多くの設計上の決定は、効率を優先します。
vimdiff file1 file2
は、2つのファイルの違いを文字ごとに表示します。
vimdiffは、vimに含まれるdiffツールです。 (Vimは+ diffオプションでコンパイルされている必要があり、:version
)
Vim内から起動することもできます。見る :help diff
詳細およびコマンドについて。