git difftool, tüm diff dosyalarını derhal aç, seri olarak değil


240

Varsayılan git diff davranışı, her diff dosyasını seri olarak açmaktır (sonraki dosyayı açmadan önce önceki dosyanın kapatılmasını bekleyin).

Aynı anda tüm dosyaları açmak için bir yol arıyorum - örneğin BeyondCompare bu aynı BC penceresindeki sekmelerdeki tüm dosyaları açar.

Bu, karmaşık bir değişiklik grubunu gözden geçirmeyi kolaylaştıracaktır; diff dosyaları arasında ileri ve geri kaydırın ve önemsiz dosyaları yok sayın.


"git diff" veya "git difftool" mu? Git mail listesine (herkese açık ve varous web arayüzü ile) mesaj gönderebilirsiniz: git@vger.kernel.org
Jakub Narębski

Harici diff uygulamasını tetiklemek için "git difftool" kullanıyorum. Posta listesi fikri için teşekkürler.
Seba Illingworth

Platformu bilmek faydalı olacaktır. Unix tabanlı bir platformda, diff'i gerçekleştirmek için bir betik yazardım ve git bu betiği kullanma talimatı verirdim. Senaryoda, ben sadece arka planda diff çalıştırmak sonra senaryo ölmesine izin.
Chris Cleeland

Windows platformu, ama fikirler için teşekkürler Chris.
Seba Illingworth

Yanıtlar:


214

gitV1.7.11 ile başlayarak, farklı git difftool --dir-diffbir dizin gerçekleştirmek için kullanabilirsiniz .

Bu özellik örneğin Meld 3.14.2 ile iyi çalışır ve değiştirilen tüm dosyalara göz atmanıza izin verir:

git difftool --dir-diff --tool=meld HEAD~ HEAD

Bu kullanışlı bir Bash işlevidir:

git-diff-meld() (
  git difftool --dir-diff --tool=meld "${1:-HEAD~}" "${2:-HEAD}"
)

Aşağıdaki yanıt gitv1.7.11'den daha eski kurulumlar için geçerlidir .


Aynı soru git posta listesinde de sorulmuştur .

Ben rasgele taahhütler arasında bir dizin fark gerçekleştiren bu e-posta iş parçacığına dayalı bir kabuk komut dosyası koymak.

Git v1.7.10 ile başlayarak, git-diffallkomut dosyası contribstandart git kurulumuna eklenir .

V1.7.10 öncesi sürümler git-diffalliçin GitHub'daki projeden yükleme yapabilirsiniz .

İşte proje açıklaması:

Git-diffall betiği git için dizin tabanlı bir fark mekanizması sağlar. Komut dosyası, hangi diff görüntüleyicisinin kullanıldığını belirlemek için diff.tool yapılandırma seçeneğine dayanır.

Bu komut dosyası, diff için bir dizi düzeltme belirtmek için kullanılan tüm formlarla uyumludur:

1) git diffall: çalışma ağacı ve aşamalı değişiklikler arasındaki farkı gösterir
2) git diffall --cached [<commit>]: aşamalı değişiklikler ve HEAD (veya diğer adlandırılmış birleştirme) arasındaki farkı gösterir
3) git diffall <commit>: çalışma ağacı ile adlandırılan
4 git diffall <commit> <commit>arasındaki farkı gösterir
5) git diffall <commit>..<commit>: iki adlandırılmış işlem arasındaki farkı gösterir 5) : aynı yukarıdaki gibi
6) git diffall <commit>...<commit>: her ikisinin ortak atalarından başlayarak daldaki ve ikinciye kadar olan değişiklikleri göster<commit>

Not: tüm formlar isteğe bağlı bir yol sınırlayıcı alır [--] [<path>]

Bu komut dosyası Git listesinde Thomas Rast tarafından sağlanan bir örneğe dayanmaktadır .


Git-diffall ve github.com/wmanley/git-meld arasındaki fark nedir ? Her ikisini de denedim ve ilk bakışta aynı işlevselliği sağlıyorlar.
kynan

5
Senaryonuz için çok minnettarım. Açıkçası, Git'in bu konuda neden doğru davranmadığını (Mercurial bunu yıllardır yaptı) ve Git topluluğunun ilgi eksikliğini anlayamıyorum.
Douglas

6
Güncelleme ( git difftool --dir-diffKarşılaştırma ve Ötesi Hakkında): Scooter Yazılımı ile temas kurdum (Karşılaştırmanın Ötesinde yazarları) ve bcompare.exedesteklenen bir çözüm olmadığını ve bir kerede birden fazla fark varsa sorunlara neden olabileceğini söylüyorlar . bcomp.exeGelecekteki bir sürümde klasör diffs için destek eklemeyi planlıyorlar (bu arada, bcompare.exedesteklenmeyen bir geçici çözüm olarak kullanmaya devam edeceğim ).
Peter Rust

4
@coin Beyond Compare 4 ile test ettim ve --dir-diff destekli bcomp.exe ile çalışıyor gibi görünüyor.
Peter Rust

5
Sadece --dir-diffMeld ile mükemmel bir şekilde çalıştığını söylemek için yorum yapmak . Oradan, tek tek dosyalar için farkları seçmenize ve görüntülemenize izin verir.
mkasberg

61

İşte yerleştiğim şey ...

Aşağıdaki kodu adlı bir dosyaya kopyalayın git-diffall(uzantı yok):

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

Dosyayı cmdgit install dir klasörünüze yerleştirin (örn. C:\Program Files (x86)\Git\cmd)

Ve istediğiniz gibi kullanın git diff:

git diffall
git diffall HEAD
git diffall --cached 
git diffall rev1..rev2
etc...

Notlar: Bunun anahtarı , harici diff komutunun bir arka plan görevinde çalışmasını söyleyen & parametresidir, böylece dosyalar hemen işlenir. BeyondCompare durumunda bu, her dosya kendi sekmesinde bir ekran açar.


Gönderdiğiniz için teşekkürler. Maalesef, WinMerge'nin -s seçeneği ile çalışmaz. WinMerge bunlara bakmadan önce ilk geçici dosyalar dışındaki tüm geçici dosyalar silinir.
Carlos Rendon

Carlos: Git ile WinMerge kullanıyorum. Benim yaklaşım WinMerge başlattıktan sonra bir 'uyku 1' eklemek (benim durumumda zaten "arka planda" gibi görünüyor - gerek &). Bu şekilde geçici dosya, WinMerge'in bir kez alması için yeterince uzun yaşar (garip durumlar hariç). Ayrıca, her dosyayı açmak için dosya başına 1 saniye sürdüğü anlamına gelir. Bu kötü bir kesmek (ben asla "cevap" olarak sunmak istiyorum!), Ama kolay, oldukça etkili bir.
Woody Zenfell III

2
Değişikliği: Linux üzerinde kullanım için, Git 2.x ile, ben hafif bir modifikasyon yapmak zorunda "$filename"için "../$filename". Sonra Beyond Compare
Dave C

1
@DaveC, orijinal dosyayı "dosyayı git kurulumunuzun cmd klasöründe saklar" der ve pencerelerde bir örnekle devam eder. Linux'ta "git-diffall" dosyasını nerede sakladınız?
m4l490n

2
Klasöre git-diffalldosya ekledikten sonra pencereleri yeniden başlatmamız gerekiyor C:\Program Files\Git\cmdmu? Ben tam olarak talimatlar gibi yaptım ama yaptıktan sonra $ git diffall git: 'diffall' is not a git command. See 'git --help'. Did you mean this? difftool
nesdis 12:07

19

meld kaynak denetimi altında bir dizin verirseniz (Git, Mercurial, Subversion, Bazaar ve muhtemelen diğerleri), değiştirilen tüm dosyaları otomatik olarak listeleyecek ve bireysel farklılıkları görüntülemek için çift tıklayabileceğiniz düzgün bir özelliğe sahiptir.

IMO meld ., VCS'nizi başlatacak şekilde yapılandırmaktan çok yazmak ve VCS'yi bulmasını çok daha kolaydır meld. Ayrıca, projenizin hangi VCS'yi kullandığı önemli değil, aynı komutu kullanabilirsiniz, bunlar arasında çok fazla geçiş yaparsanız harika olur.

Tek dezavantajı, meld için değişiklikleri taramaktan daha yavaş gitmesi, git / hg / svn'deki değişiklikleri geçirmekten daha yavaş olmasıdır, ancak bir sorun olacak kadar yavaş olup olmadığı, onu nasıl kullandığınıza bağlı olacaktır.


4
Bana göre ana dezavantajı, meld'in (herhangi bir nedenle) diff'i yeni bir sekme yerine yeni bir pencerede açması ve diff'i kapattıktan sonra, çalışma dizinindeki dosya daha önce can sıkıcı bir açılır mesajla yeni bir sekmede açılır.
kynan

güzel bir araç ama korkunç Windows kurulumu (2012 başı itibariyle).
Wernight

@kynan Bu sinir bozucu çift pencere pop-up şey için değilse farklı bir VCS agnostik yolu için mükemmel bir çözüm gibi görünüyor. Bu bir utanç. :(
PKKid

Meld'in harika bir özelliği fark filtreleridir: örneğin yorumlardaki değişiklikleri göz ardı edin veya git diffteklif vermeyen boş satırlar ekleyin / kaldırın .
kynan

1
Bu yaklaşımı bir yıl kadar kullandım; daha küçük projeler için iyi çalışır, ancak büyük bir projeniz (yani çok sayıda dosya) olduğunda, git diffs için manuel olarak "tarar" (çünkü git açıkça bir liste sağlayabilirse bu yaklaşımı neden aldığınızdan emin değilsiniz) doğrudan dosyaları ...)
namuol

3

Ben buldunuz bu yöntemi daha sonra kopya eski / yeni geçici dirs dışarı dosya ve üzerlerinde karşılaştırmak bir klasör yaptığı (GitDiff.bat ve GitDiff.rb).

Ancak BeyondCompare'in hızlı temizleme için harika olan diff penceresinden dosyayı düzenleyebilmesinin kullanışlı bir özelliği olduğu için, çalışma dosyalarını doğrudan (çalışma dizininden) görüntülemeyi tercih ederim.

Düzenleme: git posta listesindeki soruma yanıt olarak benzer bir yöntem .



2

Burada Araxis Merge'in '-nowait' komut seçeneği olduğunu fark ettim :

-nowait Karşılaştırmanın bir karşılaştırmanın kapatılmasını beklemesini önler

Belki bu hemen bir çıkış kodu döndürür ve işe yarar, kimse bunu yaşadı? BeyondCompare için benzer seçenek bulunamadı ...


2

Diffuse ayrıca VCS entegrasyonuna sahiptir. SVN, Mercurial, Bazaar, vb.Dahil olmak üzere diğer VCS'lerin çok sayıda ile birlikte çalışır ... Git için, tüm değişiklikler olmasa da bazı değişiklikler yapılırsa üç bölme bile gösterecektir. Çatışma durumunda, dört bölme bile olacaktır.

Aşamalı ve düzenlenmemiş düzenlemelerle dağınık ekran görüntüsü

İle çağır

diffuse -m

Git çalışma kopyanızda.

Bana sorarsan, on yıldır gördüğüm en iyi görsel fark. (Ben de kaynaşmayı denedim.)


Diffüzün hangi kısmını, özellikle de meld'i sevdiğinizi söyleyebilir misiniz?
musiphil

@musiphil: Basitliğini seviyorum - görevi çözmek için gereken özelliklerin tam setine sahip gibi görünüyor, daha fazla değil, aynı zamanda daha az değil. (Farkların ve sekme boyutu genişliğinin yeniden hizalanması gibi.) Neden meld'den geçiş yaptığımı hatırlamıyorum ve o zamandan beri meld kullanmadım, bu yüzden şimdi onları gerçekten karşılaştıramıyorum.
krlmlr

1
Diffuse git ile herhangi bir yapılandırma yapmadan çalıştı. Dağınık -m, farklı sekmelerde git diffs ile tek bir pencere açar; diğer araçların da başlamak için çok fazla yapılandırmaya ihtiyacı vardır.
mosh

1

Yapmak istediğiniz tek şey şu anda değiştirilmiş olan tüm dosyaları açmaksa, şöyle bir şey deneyin:

vi $ (git durumu | sed -n '/.*modifiye: * / s /// p')

"Karmaşık değişiklik kümeleri" ni taahhüt ediyorsanız, iş akışınızı yeniden gözden geçirmek isteyebilirsiniz. Git'in gerçekten güzel özelliklerinden biri, geliştiricinin karmaşık değişiklik setlerini bir dizi basit yamaya indirgemesini kolaylaştırmasıdır. Şu anda değiştirilmiş olan tüm dosyaları düzenlemeye çalışmak yerine,

git add --patch
Bu, yakışıklı bir şekilde parçalarını sahnelemenize izin verecektir.


1

İki çalışma ağacını çoğaltacak ve DiffMerge ile karşılaştıracak bir powershell betiği yazdım. Böylece şunları yapabilirsiniz:

GitNdiff master~3 .

Örneğin, üç şubeden önce ana dalı mevcut çalışma ağacı ile karşılaştırmak.

Parlak ve yeni ve muhtemelen böcek dolu. Bir dezavantajı, çalışma ağacınızdaki henüz eklenmemiş olan dosyaların her iki çalışma ağacına da kopyalanmasıdır. Ayrıca yavaş olabilir.

http://github.com/fschwiet/GitNdiff


1

Araxis ile Mac OS X'te git-diffall kullanmak isteyenler için, github'da git-diffall projesine çatalladım ve Araxis Merge komutunu saran bir AppleScript ekledim. Not: Bu, araxisgitdiffMac OS X için Araxis Merge ile birlikte gelen dosyanın biraz değiştirilmiş bir kopyasıdır .

https://github.com/sorens/git-diffall


1

Aşağıdaki meld ve kdiff3 ile çalışır

git difftool --dir-diff origin/branch1..origin/branch2

Tüm dosyaları kolaylıkla göz atabileceğiniz bir pencerede açar. Menşe / şube adı yerine değişiklik kümeleriyle kullanılabilir

Örneğin: git difftool --dir-diff origin/master..24604fb72f7e16ed44115fbd88b447779cc74bb1


-2

Gitk'i kullanabilir ve tüm farklılıkları aynı anda görebilirsiniz


3
Evet gitk'i kullanışlı buluyorum, ancak BC'yi farklılaştırmaya geldiğinde görmek istediğim şey :)
Seba Illingworth
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.