2つのディレクトリを比較およびマージする方法は?


38

私はことを知っているVimの差分モードがvimdiff)私たちは2つ(またはそれ以上)のファイルの内容を比較することができます。

しかし、2つのディレクトリを再帰的にマージするために、ディレクトリ間で複数のファイルのコンテンツを比較することは可能です(DiffMergeや同様のツールのように)?


それぞれのフォルダーにVCSが使用されていますか?これにより、フラットフォルダーでは利用できない可能性のあるさまざまな回答やプラグインが開かれます。
カレブ

回答:


30

2つのディレクトリを再帰的に比較およびマージするDirDiff.vimプラグイン(GitHub)があります。

2つのディレクトリで再帰的な差分を実行し、差分「ウィンドウ」を生成します。そのウィンドウに基づいて、Vimのdiffモードで2つのファイルを開く、ファイルまたはディレクトリを他のファイルに再帰的にコピーする、ソースディレクトリからディレクトリツリーを削除するなど、さまざまなdiff操作を実行できます。

使用法:

:DirDiff <dir1> <dir2>

詳細情報/ヘルプ: :help dirdiff

スクリーンショットをご覧ください:

wleeスクリーンショット

こちらもご覧ください:


dedmブログへのリンクが壊れています-むしろブログは削除されました。
-drevicko

1
@drevickoありがとう、リンクをアーカイブされたものに置き換えました
-kenorb

4

ラッパースクリプトを使用pythonしてファイルをマージします(以下を参照)。これは、~/.vimdirsなどをマージするために使用するものの簡易バージョンです。

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])

3

私はしばらくの間同じことを望んでいました。私が見つけた最良の解決策は、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スクリプトに変換するのは非常に簡単なはずですが、私はそれを試していません。



2

余分なものを何もインストールせずに、単にvimdiffを使用するだけの場合、次のコマンドを使用すると、すべての異なるファイルが連続して開かれ、vimdiffで変更を確認できます。

    for files in $(diff -rq dir1 dir2|grep 'differ$'|sed "s/^Files //g;s/ differ$//g;s/ and /:/g"); do 
        vimdiff ${files%:*} ${files#*:}; 
    done

1

そのための軽量なソリューションがあります:

  1. vimdiffextプラグインをセットアップします。
  2. やるdiff dir1 dir2 | vim -R -シェルで。

変更されたファイルの折り畳みと横並び比較を追加します。

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