วิธีแตกต่างและรวมสองไดเรกทอรี


38

ฉันรู้ว่าโหมด diff ของ Vim ( vimdiff) ช่วยให้เราสามารถเปรียบเทียบเนื้อหาของไฟล์สองไฟล์ (หรือมากกว่า)

แต่มันเป็นไปได้ที่จะเปรียบเทียบเนื้อหาของหลาย ๆ ไฟล์ข้ามไดเรกทอรีเพื่อรวมสองไดเรกทอรีซ้ำ (เช่น DiffMerge และเครื่องมือที่คล้ายกัน)?


VCS ใช้กับโฟลเดอร์ของคุณหรือไม่ นั่นจะเป็นการเปิดคำตอบและปลั๊กอินทั้งหมดที่อาจไม่มีในโฟลเดอร์ flat
แม็กเคเล็บ

คำตอบ:


30

มีปลั๊กอินDirDiff.vim ( GitHub ) เพื่อกระจายและผสานสองไดเรกทอรีซ้ำ

มันทำหน้าที่ต่างกันแบบเรียกซ้ำในสองไดเรกทอรีและสร้างหน้าต่าง "diff" จากหน้าต่างนั้นคุณสามารถทำการดำเนินการ diff ต่าง ๆ เช่นการเปิดสองไฟล์ในโหมด diff ของ Vim ให้คัดลอกไฟล์หรือไดเรกทอรีที่เรียกซ้ำไปยังไฟล์อื่นหรือลบทรีไดเรกทอรีออกจากไดเรกทอรีต้นทาง

การใช้งาน:

:DirDiff <dir1> <dir2>

สำหรับข้อมูลเพิ่มเติม / ความช่วยเหลือ: :help dirdiff

ดูภาพหน้าจอ:

ภาพหน้าจอ wlee

ดูสิ่งนี้ด้วย:


ลิงก์ไปยังบล็อก dedm ใช้งานไม่ได้ แต่บล็อกถูกลบไปแล้ว
drevicko

1
@drevicko ขอบคุณฉันได้แทนที่ลิงค์ด้วยหนึ่งที่เก็บถาวร
kenorb

4

ฉันใช้สคริปต์ตัวpythonตัดคำเพื่อรวมไฟล์ (ดูด้านล่าง) นี่เป็นเวอร์ชั่นที่เรียบง่ายของสิ่งที่ฉันใช้เพื่อรวม~/.vimdirs ของฉันและเช่นนั้น

ควรทำงานใน Python 2 และ 3 แต่อาจไม่ได้อยู่ใน Python เวอร์ชันเก่ามากที่มาพร้อมกับ CentOS และ distros อื่น ๆ

โปรดทราบว่าการตรวจสอบบางอย่าง (เช่นเดียวกับไฟล์ไบนารีหรือหากไฟล์เหมือนกัน) นั้นไม่เร็วมาก (จะอ่านไฟล์ทั้งหมด) คุณสามารถลบออกได้หากต้องการ

นอกจากนี้ยังไม่รายงานว่ามีเพียงหนึ่งในไดเรกทอรีใดไดเรกทอรีหนึ่ง ...

#!/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ไม่ต้องใช้ปลั๊กอินใด ๆ

สิ่งที่คุณต้องทำคือบอก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 มันควรจะง่ายในการแปลงเป็นสคริปต์ทุบตี แต่ฉันไม่ได้ให้มันไป



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.