Come diff e unire due directory?


38

So che la modalità diff di Vim ( vimdiff) ci consente di confrontare i contenuti di due (o più) file.

Ma è possibile confrontare il contenuto di più file tra le directory per unire ricorsivamente due directory (come DiffMerge e strumenti simili)?


Un VCS è in uso per le tue rispettive cartelle? Ciò aprirebbe un'intera gamma di risposte e plugin che potrebbero non essere disponibili per le cartelle flat.
Caleb,

Risposte:


30

C'è un plugin DirDiff.vim ( GitHub ) per diff e unire due directory in modo ricorsivo.

Esegue una diff ricorsiva su due directory e genera una "finestra" diff. Sulla base di quella finestra è possibile eseguire varie operazioni diff come l'apertura di due file in modalità diff di Vim, copiare il file o la directory in modo ricorsivo sull'altro o rimuovere l'albero della directory dalla directory di origine.

Uso:

:DirDiff <dir1> <dir2>

Per maggiori informazioni / aiuto: :help dirdiff

Guarda lo screenshot:

screenshot di Wlee

Guarda anche:


il link al blog dedm è interrotto - piuttosto il blog è stato rimosso.
drevicko,

1
@drevicko Grazie, ho sostituito il collegamento con quello archiviato
Kenorb

4

Uso uno script wrapper pythonper unire i file (vedi sotto). Questa è una versione semplificata di ciò che uso per unire i miei ~/.vimdir e simili.

Dovrebbe funzionare in Python 2 e 3; ma probabilmente non nelle versioni molto vecchie di Python fornite con CentOS e altre distro.

Essere consapevoli del fatto che alcuni controlli (come quello per i file binari, o se i file sono gli stessi) non sono molto veloci (legge l'intero file); potresti rimuoverli se vuoi.

Inoltre non segnala se a è presente solo in una delle directory ...

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

Ho voluto lo stesso per un po '. La migliore soluzione che ho trovato è stata usare vdwrap , che funziona incredibilmente bene. Tutto ciò che fa è avvolgere git difftool --dir-diffper vimdiff. Non richiede alcun plugin vim.

Tutto quello che devi fare è dire git difftooldi usare vdwrap:

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

La prossima volta che usi git difftool, aprirà Vim con schede Vim separate per ogni coppia di file.

Un avvertimento è che si tratta di uno script Zsh. Dovrebbe essere abbastanza semplice convertirlo in uno script bash ma non ci ho provato.



2

Se vuoi semplicemente usare vimdiff senza installare nulla in più, il seguente comando aprirà in successione tutti i file diversi, consentendoti di esaminare le modifiche con 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

C'è una soluzione leggera per questo:

  1. Imposta il plugin vimdiffext .
  2. Fare diff dir1 dir2 | vim -R -a shell.

Aggiungerà pieghe e confronti affiancati per i file modificati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.