Bagaimana cara membedakan dan menggabungkan dua direktori?


38

Saya tahu bahwa mode diff Vim ( vimdiff) memungkinkan kami untuk membandingkan konten dua (atau lebih) file.

Tetapi apakah mungkin untuk membandingkan konten beberapa file di seluruh direktori untuk menggabungkan dua direktori secara rekursif (seperti DiffMerge dan alat serupa)?


Apakah VCS apa pun digunakan untuk folder masing-masing? Itu akan membuka seluruh jajaran jawaban dan plugin yang mungkin tidak tersedia untuk folder datar.
Caleb

Jawaban:


30

Ada plugin DirDiff.vim ( GitHub ) untuk membedakan dan menggabungkan dua direktori secara rekursif.

Ia melakukan diff rekursif pada dua direktori dan menghasilkan "jendela" yang berbeda. Berdasarkan jendela itu Anda dapat melakukan berbagai operasi diff seperti membuka dua file dalam mode Vim's diff, menyalin file atau direktori secara rekursif ke yang lain, atau menghapus pohon direktori dari direktori sumber.

Pemakaian:

:DirDiff <dir1> <dir2>

Untuk informasi lebih lanjut / bantuan: :help dirdiff

Lihat tangkapan layar:

tangkapan layar wlee

Lihat juga:


tautan ke blog dedm rusak - alih-alih blog telah dihapus.
drevicko

1
@drevicko Terima kasih, saya telah mengganti tautan dengan yang diarsipkan
kenorb

4

Saya menggunakan skrip wrapper pythonuntuk menggabungkan file (lihat di bawah). Ini adalah versi sederhana dari apa yang saya gunakan untuk menggabungkan ~/.vimdir saya dan semacamnya.

Itu harus bekerja di Python 2 dan 3; tetapi mungkin tidak dalam versi Python yang sangat lama seperti yang dikirim dengan CentOS dan beberapa distro lainnya.

Sadarilah bahwa beberapa pemeriksaan (seperti yang untuk file biner, atau jika file-nya sama) tidak terlalu cepat (ini membaca seluruh file); Anda bisa menghapusnya jika mau.

Juga tidak melaporkan jika hanya ada di salah satu direktori ...

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

Saya menginginkan hal yang sama untuk sementara waktu. Solusi terbaik yang saya temukan adalah menggunakan vdwrap , yang bekerja dengan sangat baik. Semua hal ini adalah bungkus git difftool --dir-diffuntuk vimdiff. Tidak memerlukan plugin vim.

Yang perlu Anda lakukan adalah memberi tahu git difftooluntuk menggunakan vdwrap:

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

Lain kali Anda menggunakan git difftool, itu akan membuka Vim dengan tab Vim terpisah untuk setiap pasangan file.

Peringatan adalah bahwa ini adalah skrip Zsh. Seharusnya cukup sederhana untuk mengubahnya menjadi skrip bash, tetapi saya belum mencobanya.



2

Jika Anda hanya ingin menggunakan vimdiff tanpa menginstal tambahan apa pun, perintah berikut akan membuka semua file yang berbeda secara berurutan sehingga Anda dapat melihat perubahan dengan 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

Ada solusi ringan untuk itu:

  1. Siapkan plugin vimdiffext .
  2. Lakukan diff dir1 dir2 | vim -R -di shell.

Ini akan menambah lipatan dan perbandingan berdampingan untuk file yang diubah.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.