두 디렉토리를 비교하여 병합하는 방법은 무엇입니까?


38

내가 알고 빔의 DIFF 모드 ( vimdiff) 우리가 두 개 (또는 그 이상) 파일의 내용을 비교할 수 있습니다.

그러나 DiffMerge 및 유사한 도구와 같이 두 디렉토리를 재귀 적으로 병합하기 위해 디렉토리에서 여러 파일의 내용을 비교할 수 있습니까?


각 폴더에 VCS를 사용하고 있습니까? 플랫 폴더에서는 사용할 수없는 모든 범위의 답변과 플러그인이 열립니다.
Caleb

답변:


30

DirDiff.vim 플러그인 ( GitHub의 두 디렉토리를 재귀 적 DIFF 및 병합으로는).

두 디렉토리에서 재귀 diff를 수행하고 diff "창"을 생성합니다. 해당 창을 기반으로 Vim의 diff 모드에서 두 파일 열기, 파일 또는 디렉토리를 다른 파일로 재귀 적으로 복사하거나 소스 디렉토리에서 디렉토리 트리를 제거하는 등 다양한 diff 작업을 수행 할 수 있습니다.

용법:

:DirDiff <dir1> <dir2>

자세한 정보 / 도움말 : :help dirdiff

스크린 샷을 참조하십시오 :

wlee 스크린 샷

또한보십시오:


dedm 블로그에 대한 링크가 끊어졌습니다. 오히려 블로그가 제거되었습니다.
drevicko

1
@drevicko 감사합니다. 링크가 보관 처리 된 것으로 교체되었습니다
kenorb

4

래퍼 스크립트를 사용하여 python파일을 병합합니다 (아래 참조). 이것은 내 ~/.vim디렉토리 등 을 병합하는 데 사용하는 단순화 된 버전입니다 .

파이썬 2와 3에서 작동합니다. CentOS 및 다른 배포판과 함께 제공되는 이전 버전의 Python에서는 아닐 것입니다.

이진 파일이나 파일이 동일한 경우와 같은 일부 검사는 빠르지 않습니다 (전체 파일을 읽습니다). 원하는 경우 제거 할 수 있습니다.

또한 디렉토리 중 하나에 만 a가 존재하는지 여부는보고하지 않습니다 ...

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