İki dizin nasıl dağılır ve birleştirilir?


38

Vim'in diff mode ( vimdiff) 'un iki (veya daha fazla) dosyanın içeriğini karşılaştırmamıza izin verdiğini biliyorum .

Ancak, iki dizini yinelemeli olarak birleştirmek için (DiffMerge ve benzeri araçlar gibi) birden çok dosyanın içeriğini dizinler arasında karşılaştırmak mümkündür.


İlgili klasörleriniz için herhangi bir VCS kullanılıyor mu? Bu, düz klasörler için kullanılamayacak bir dizi cevap ve eklenti açar.
Caleb,

Yanıtlar:


30

Orada DirDiff.vim eklenti ( GitHub iki dizinleri ardışık fark ve birleştirme için).

İki dizinde özyinelemeli bir fark gerçekleştirir ve bir diff "penceresi" oluşturur. Bu pencereye dayanarak, Vim'in diff modunda iki dosyayı açmak, dosyayı veya dizini art arda diğerine kopyalamak veya dizin ağacını kaynak dizinden kaldırmak gibi çeşitli diff işlemlerini gerçekleştirebilirsiniz.

Kullanımı:

:DirDiff <dir1> <dir2>

Daha fazla bilgi / yardım için: :help dirdiff

Ekran görüntüsüne bakın:

wlee ekran görüntüsü

Ayrıca bakınız:


dedm blog bağlantısı kesildi - blog kaldırıldı.
drevicko

1
@drevicko Teşekkürler, bağlantıyı arşivlenenle değiştirdim
kenorb

4

pythonDosyaları birleştirmek için bir sarmalayıcı komut dosyası kullanıyorum (aşağıya bakın). Bu, ~/.vimdirseklerimi birleştirmek için kullandıklarımın basitleştirilmiş bir versiyonudur .

Python 2 ve 3'te çalışması gerekir; fakat muhtemelen CentOS ve diğer bazı dağıtımlarla birlikte gelen Python'un çok eski sürümlerinde bulunmuyor.

Bazı kontrollerin (ikili dosyalar için yapılanlar gibi veya dosyalar aynıysa) çok hızlı olmadıklarını (dosyanın tamamını okur) unutmayın. İstersen onları kaldırabilirsin.

Ayrıca, yalnızca bir dizinlerden birinde mevcut olup olmadığını bildirmez ...

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

Ben de bir süre aynı şeyi istedim. Bulduğum en iyi çözüm inanılmaz derecede iyi çalışan vdwrap kullanmaktı . Tek yaptığı sarmak git difftool --dir-diffiçin vimdiff. Herhangi bir vim eklentisi gerektirmez.

Yapmanız gereken tek şey git difftoolkullanmak söyle vdwrap:

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

Git difftool'u bir sonraki kullanışınızda, Vim her dosya çifti için ayrı Vim sekmeleriyle açılacaktır.

Bir uyarı, bunun bir Zsh betiği olduğu yönünde. Bunu bir bash betiğine dönüştürmek oldukça basit olmalı, ama ben böyle bir şey yapmadım.



2

Yalnızca bir şey yüklemeden sadece vimdiff kullanmak istiyorsanız, aşağıdaki komut tüm farklı dosyaları art arda açarak vimdiff değişikliklerine bakmanızı sağlar:

    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

Bunun için hafif bir çözüm var:

  1. Vimdiffext eklentisini ayarlayın .
  2. Do diff dir1 dir2 | vim -R -kabuğunda.

Değişen dosyalar için kıvrımlar ve yan yana karşılaştırma ekleyecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.