Como diferenciar e mesclar dois diretórios?

38

Eu sei que o modo diff do Vim ( vimdiff) permite comparar o conteúdo de dois (ou mais) arquivos.

Mas é possível comparar o conteúdo de vários arquivos entre diretórios para mesclar dois diretórios recursivamente (como DiffMerge e ferramentas similares)?

kenorb
fonte
Existe um VCS de qualquer tipo em uso para suas respectivas pastas? Isso abriria toda uma gama de respostas e plugins que podem não estar disponíveis para pastas simples.
Calebe

Respostas:

30

Há o plugin DirDiff.vim ( GitHub ) para fazer a diferença e mesclar dois diretórios recursivamente.

Ele executa uma comparação recursiva em dois diretórios e gera uma "janela" de comparação. Com base nessa janela, você pode executar várias operações diff, como abrir dois arquivos no modo diff do Vim, copiar o arquivo ou diretório recursivamente para o outro ou remover a árvore de diretórios do diretório de origem.

Uso:

:DirDiff <dir1> <dir2>

Para mais informações / ajuda: :help dirdiff

Veja a captura de tela:

captura de tela

Veja também:

kenorb
fonte
o link para o blog dedm está quebrado - o blog foi removido.
drevicko 29/03
11
@drevicko Graças, eu substituído ligação com o arquivado
kenorb
4

Eu uso um script de wrapper pythonpara mesclar arquivos (veja abaixo). Esta é uma versão simplificada do que eu uso para mesclar meus ~/.vimdiretórios e tal.

Deve funcionar em Python 2 e 3; mas provavelmente não em versões muito antigas do Python fornecidas com o CentOS e outras distribuições.

Esteja ciente de que algumas verificações (como a de arquivos binários ou se os arquivos são iguais) não são muito rápidas (ele lê o arquivo inteiro); você pode removê-los se quiser.

Também não informa se a está presente apenas em um dos diretórios ...

#!/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])
Martin Tournoij
fonte
3

Eu queria o mesmo por um tempo. A melhor solução que encontrei foi usar o vdwrap , que funciona incrivelmente bem. Tudo que faz é envoltório git difftool --dir-diffpara vimdiff. Não requer nenhum plug-in vim.

Tudo que você precisa fazer é dizer git difftoolpara usar vdwrap:

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

Na próxima vez que você usar o git difftool, ele abrirá o Vim com guias separadas do Vim para cada par de arquivos.

Uma ressalva é que é um script Zsh. Deve ser bem simples convertê-lo em um script bash, mas ainda não testei.

akshay
fonte
related: stackoverflow.com/questions/8156493/git-vimdiff-and-dirdiff
Ciro Santilli新疆改造中心法轮功六四事件
2

Se você quiser apenas usar o vimdiff sem instalar nada extra, o comando a seguir abrirá todos os arquivos diferentes em sucessão, permitindo que você observe as alterações com o 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
Jongab
fonte
1

Existe uma solução leve para isso:

  1. Configure o plugin vimdiffext .
  2. Faça diff dir1 dir2 | vim -R -com casca.

Ele adicionará dobras e comparação lado a lado para arquivos alterados.

Yuriy Ershov
fonte