Làm thế nào để khác biệt và hợp nhất hai thư mục?


38

Tôi biết rằng chế độ khác của Vim ( vimdiff) cho phép chúng ta so sánh nội dung của hai (hoặc nhiều) tệp.

Nhưng có thể so sánh nội dung của nhiều tệp trên các thư mục để hợp nhất hai thư mục theo cách đệ quy (như DiffMerge và các công cụ tương tự)?


Là một VCS của bất kỳ loại nào được sử dụng cho các thư mục tương ứng của bạn? Điều đó sẽ mở ra một loạt các câu trả lời và plugin có thể không có sẵn cho các thư mục phẳng.
Caleb

Câu trả lời:


30

Có plugin DirDiff.vim ( GitHub ) để tìm khác biệt và hợp nhất hai thư mục theo cách đệ quy.

Nó thực hiện một diff đệ quy trên hai thư mục và tạo ra một "cửa sổ" khác. Dựa trên cửa sổ đó, bạn có thể thực hiện nhiều thao tác khác nhau như mở hai tệp ở chế độ khác của Vim, sao chép tệp hoặc thư mục đệ quy sang tệp kia hoặc xóa cây thư mục khỏi thư mục nguồn.

Sử dụng:

:DirDiff <dir1> <dir2>

Để biết thêm thông tin / trợ giúp: :help dirdiff

Xem ảnh chụp màn hình:

ảnh chụp màn hình wlee

Xem thêm:


liên kết đến blog cống hiến bị hỏng - thay vào đó blog đã bị xóa.
drevicko

1
@drevicko Cảm ơn, tôi đã thay thế liên kết với liên kết được lưu trữ
kenorb

4

Tôi sử dụng tập lệnh bao bọc pythonđể hợp nhất các tập tin (xem bên dưới). Đây là một phiên bản đơn giản hóa của những gì tôi sử dụng để hợp nhất các thư mục của mình ~/.vimvà như vậy.

Nó nên hoạt động trong Python 2 và 3; nhưng có lẽ không phải trong các phiên bản Python cũ như được vận chuyển với CentOS và một số bản phát hành khác.

Xin lưu ý rằng một số kiểm tra (như kiểm tra cho các tệp nhị phân hoặc nếu các tệp giống nhau) không nhanh lắm (nó đọc toàn bộ tệp); bạn có thể loại bỏ chúng nếu bạn muốn.

Nó cũng không báo cáo nếu a chỉ xuất hiện trong một trong các thư mục ...

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

Tôi đã muốn như vậy trong một thời gian. Giải pháp tốt nhất tôi tìm thấy là sử dụng vdwrap , hoạt động rất tốt. Tất cả nó làm là bọc git difftool --dir-diffcho vimdiff. Nó không yêu cầu bất kỳ plugin vim.

Tất cả bạn cần làm là nói git difftoolđể sử dụng vdwrap:

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

Lần tới khi bạn sử dụng git Difftool, nó sẽ mở Vim với các tab Vim riêng cho từng cặp tệp.

Một cảnh báo là nó là một kịch bản Zsh. Nó khá đơn giản để chuyển đổi nó thành một tập lệnh bash nhưng tôi đã không cho nó đi.



2

Nếu bạn chỉ muốn sử dụng vimdiff mà không cần cài đặt thêm bất kỳ thứ gì, lệnh sau sẽ mở tất cả các tệp khác nhau liên tiếp cho phép bạn xem xét các thay đổi với 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ó một giải pháp nhẹ cho điều đó:

  1. Thiết lập plugin vimdiffext .
  2. Làm diff dir1 dir2 | vim -R -tại vỏ.

Nó sẽ thêm các nếp gấp và so sánh song song cho các tệp đã thay đổi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.