私はことを知っているVimの差分モードが(vimdiff
)私たちは2つ(またはそれ以上)のファイルの内容を比較することができます。
しかし、2つのディレクトリを再帰的にマージするために、ディレクトリ間で複数のファイルのコンテンツを比較することは可能です(DiffMergeや同様のツールのように)?
私はことを知っているVimの差分モードが(vimdiff
)私たちは2つ(またはそれ以上)のファイルの内容を比較することができます。
しかし、2つのディレクトリを再帰的にマージするために、ディレクトリ間で複数のファイルのコンテンツを比較することは可能です(DiffMergeや同様のツールのように)?
回答:
2つのディレクトリを再帰的に比較およびマージするDirDiff.vimプラグイン(GitHub)があります。
2つのディレクトリで再帰的な差分を実行し、差分「ウィンドウ」を生成します。そのウィンドウに基づいて、Vimのdiffモードで2つのファイルを開く、ファイルまたはディレクトリを他のファイルに再帰的にコピーする、ソースディレクトリからディレクトリツリーを削除するなど、さまざまなdiff操作を実行できます。
使用法:
:DirDiff <dir1> <dir2>
詳細情報/ヘルプ: :help dirdiff
スクリーンショットをご覧ください:
こちらもご覧ください:
ディレクトリを再帰的に比較してマージしますか?dedmブログで
ラッパースクリプトを使用python
してファイルをマージします(以下を参照)。これは、~/.vim
dirsなどをマージするために使用するものの簡易バージョンです。
Python 2および3で動作するはずです。ただし、CentOSや他のディストリビューションに同梱されているPythonの非常に古いバージョンにはおそらくないでしょう。
一部のチェック(バイナリファイルのチェック、またはファイルが同じ場合)はあまり高速ではないことに注意してください(ファイル全体を読み取ります)。必要に応じて削除できます。
また、ディレクトリの1つにのみが存在する場合は報告しません...
#!/usr/bin/env python
from __future__ import print_function
import hashlib, os, subprocess, sys
if len(sys.argv) < 3:
print('Usage: {} dir1 dir2'.format(sys.argv[0]))
sys.exit(1)
dir1 = os.path.realpath(sys.argv[1])
dir2 = os.path.realpath(sys.argv[2])
for root, dirs, files in os.walk(dir1):
for f in files:
f1 = '{}/{}'.format(root, f)
f2 = f1.replace(dir1, dir2, 1)
# Don't diff files over 1MiB
if os.stat(f1).st_size > 1048576 or os.stat(f2).st_size > 1048576: continue
# Check if files are the same; in which case a diff is useless
h1 = hashlib.sha256(open(f1, 'rb').read()).hexdigest()
h2 = hashlib.sha256(open(f2, 'rb').read()).hexdigest()
if h1 == h2: continue
# Don't diff binary files
if open(f1, 'rb').read().find(b'\000') >= 0: continue
subprocess.call(['vimdiff', f1, f2])
私はしばらくの間同じことを望んでいました。私が見つけた最良の解決策は、vdwrapを使用することでした。これは驚くほどうまく機能します。それがするのは、ラップだけgit difftool --dir-diff
ですvimdiff
。vimプラグインは必要ありません。
あなたがする必要があるのはgit difftool
、使用するように言うだけですvdwrap
:
git config --global difftool.vdwrap.cmd '/full/path/vdwrap $LOCAL $REMOTE'
git config --global diff.tool vdwrap
次回git difftoolを使用すると、ファイルのペアごとに個別のVimタブでVimが開きます。
警告は、Zshスクリプトであるということです。それをbashスクリプトに変換するのは非常に簡単なはずですが、私はそれを試していません。
そのための軽量なソリューションがあります:
diff dir1 dir2 | vim -R -
シェルで。変更されたファイルの折り畳みと横並び比較を追加します。