Wie kann ich zwei Verzeichnisse unterscheiden und zusammenführen?


38

Ich weiß, dass wir mit Vims Diff-Modus ( vimdiff) den Inhalt von zwei (oder mehr) Dateien vergleichen können.

Es ist jedoch möglich, den Inhalt mehrerer Dateien in verschiedenen Verzeichnissen zu vergleichen, um zwei Verzeichnisse rekursiv zusammenzuführen (z. B. DiffMerge und ähnliche Tools).


Wird für Ihre jeweiligen Ordner ein beliebiges VCS verwendet? Das würde eine ganze Reihe von Antworten und Plugins eröffnen, die für flache Ordner möglicherweise nicht verfügbar sind.
Caleb

Antworten:


30

Es gibt das DirDiff.vim- Plugin ( GitHub ), um zwei Verzeichnisse rekursiv zu vergleichen und zusammenzuführen.

Es führt einen rekursiven Vergleich für zwei Verzeichnisse durch und generiert ein Vergleichsfenster. Basierend auf diesem Fenster können Sie verschiedene Diff-Vorgänge ausführen, z. B. das Öffnen von zwei Dateien im Diff-Modus von Vim, das rekursive Kopieren der Datei oder des Verzeichnisses in das andere oder das Entfernen des Verzeichnisbaums aus dem Quellverzeichnis.

Verwendung:

:DirDiff <dir1> <dir2>

Weitere Informationen / Hilfe: :help dirdiff

Siehe den Screenshot:

wlee screenshot

Siehe auch:


der link zum dedm blog ist kaputt - eher wurde der blog entfernt.
Drevicko

1
@drevicko Danke, ich habe den Link mit dem Archiv ersetzt
Kenorb

4

Ich verwende ein Wrapper-Skript python, um Dateien zusammenzuführen (siehe unten). Dies ist eine vereinfachte Version dessen, was ich verwende, um meine ~/.vimVerzeichnisse und dergleichen zusammenzuführen.

Es sollte in Python 2 und 3 funktionieren; aber wahrscheinlich nicht in sehr alten Versionen von Python, wie sie mit CentOS und einigen anderen Distributionen ausgeliefert werden.

Beachten Sie, dass einige Überprüfungen (z. B. bei Binärdateien oder bei identischen Dateien) nicht sehr schnell sind (die gesamte Datei wird gelesen). Sie können sie entfernen, wenn Sie möchten.

Es wird auch nicht gemeldet, ob a nur in einem der Verzeichnisse vorhanden ist ...

#!/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

Ich habe das gleiche für eine Weile gewollt. Die beste Lösung, die ich gefunden habe, war die Verwendung von vdwrap , was erstaunlich gut funktioniert. Es tut , ist alles einpacken git difftool --dir-difffür vimdiff. Es werden keine vim-Plugins benötigt.

Alles , was Sie tun müssen , ist zu sagen , git difftoolzu verwenden vdwrap:

git config --global difftool.vdwrap.cmd '/full/path/vdwrap $LOCAL $REMOTE'
git config --global diff.tool vdwrap

Wenn Sie das nächste Mal git difftool verwenden, wird Vim mit separaten Vim-Registerkarten für jedes Dateipaar geöffnet.

Eine Einschränkung ist, dass es sich um ein Zsh-Skript handelt. Es sollte ziemlich einfach sein, es in ein Bash-Skript zu konvertieren, aber ich habe es nicht ausprobiert.



2

Wenn Sie nur vimdiff verwenden möchten, ohne etwas anderes zu installieren, werden mit dem folgenden Befehl alle unterschiedlichen Dateien nacheinander geöffnet, sodass Sie sich die Änderungen mit vimdiff ansehen können:

    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

Dafür gibt es eine leichte Lösung:

  1. Richten Sie das vimdiffext- Plugin ein.
  2. Mach es diff dir1 dir2 | vim -R -in der Schale.

Es werden Falze hinzugefügt und nebeneinander für geänderte Dateien verglichen.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.