Değiştirilen her satırda değişen satırları ve değişen baytları vurgulayın


94

Açık Kaynak projesi Trac , mükemmel bir fark vurgulayıcıya sahiptir - her değişen satırda değişen satırları ve değişen baytları vurgular ! Örnekler için buraya veya buraya bakın .

Bash terminalinde aynı renk vurgusunu (yani değişen satırlar ve değişen baytlar ) gitveya vim diff çıktısı için (yama dosyası) kullanmanın bir yolu var mı?


Vurgulamak istediğin nedir? Bayt değişikliklerini vurgulayan bir fark aracı ister misiniz? (Çok yardımı dokunur). Vim diyorsunuz, anımsadığıma göre vim, programlama dili şablonlarını (ve diğerlerini) kullanırken zaten birçok renk manipülasyonu yapıyor. Bunu nasıl değiştirirsin? VT100 olarak tanımlanan bir terminal penceresinde rengi değiştirmek için kullanılabilecek epeyce teknik vardır (ve renk kaçış dizilerini de destekleyecek düzinelerce başka tanım vardır). Daha ayrıntılı bilgi lütfen. Veya en.wikipedia.org/wiki/VT100 ve ilgili bağlantıları okuyun . Belki bu yardımcı olabilir.
shellter

Sadece açık kaynaklı araçlarla ve sadece terminalle ilgilendiğinizi biliyorum. Ancak bir referans noktası olarak, slickedit'in difzillasına bakmak isteyebilirsiniz. Kullandığım birkaç diff aracı arasında her zaman karakter farklılıklarını en iyi temsil ediyor gibi görünüyor (ancak farkların karmaşık olduğu durumlarda kesinlikle sorunları vardı (biçimlendirme ve kodun birleşimi, bu her zaman kötü bir fikirdir)
nhed


Not: GitHub artık Web GUI'sinde böyle bir fark aracı sunuyor: stackoverflow.com/a/25723584/6309
VonC

Kolayca 1) ilgili diff-vurgulama dosyasını bulmak, 2) çalıştırılabilir hale getirmek 3) gerekli parametreleri .gitconfig içinde ayarlamak için öğreticilerle birlikte 'bir başka' saf git, diff vurgulama tabanlı çözüm gönderdim. Lütfen bir göz at. Talimatlar Ubuntu 18.04 içindir, ancak linux sistemlerinde geniş çapta çalışmalıdır.
Zorglub29

Yanıtlar:


60

diff-highlightPerl contrib komut muhtemelen Trac onu kullandığını olduğunu Trac ekran benzer böylece çıktı üretir:

görüntü açıklamasını buraya girin

Şununla yükle:

wget https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight && chmod +x diff-highlight

Dosyayı taşı diff-highlightiçin ~/bin/dizine (veya her yerde $PATHis) ve sonra aşağıdakileri ekleyin~/.gitconfig :

[pager]
        diff = diff-highlight | less
        log = diff-highlight | less
        show = diff-highlight | less

@Cirosantilli tarafından önerilen tek kopyalı yapıştırma kurulumu:

cd ~/bin
curl -O https://raw.githubusercontent.com/git/git/fd99e2bda0ca6a361ef03c04d6d7fdc7a9c40b78/contrib/diff-highlight/diff-highlight
chmod +x diff-highlight
git config --global pager.log 'diff-highlight | less'
git config --global pager.show 'diff-highlight | less'
git config --global pager.diff 'diff-highlight | less'
git config --global interactive.diffFilter diff-highlight

Bu. Bu mükemmel. Teşekkür ederim. Yine de bazı yerlerde biraz muhafazakar görünüyor, ancak açıkça metnin çoğunluğunun ortak olduğu bazı satırları kaçırıyor. Bunun için bir hata izleyiciniz var mı?
naught101

21
Ah, bu artık çekirdek git'in bir
naught101

2
Artık bir modüle dönüştürüldü ve bence indirmesi en kolay sürüm, bu değişiklikten hemen önce raw.githubusercontent.com/git/git/…
Chris Midgley

4
Çekirdek git'in sadece bu parçası değil, git ile dağıtılmış ve muhtemelen zaten sisteminizde. Aşağıdaki cevabıma nasıl etkinleştireceğime dair ayrıntıları ekledim. ↓
Cory Klein

2
Bu, üzerinden gördüğünüz farkları özlüyor git add -p. Lütfen git config --global interactive.diffFilter diff-highlight
şunları

41

Kullanırken git diffveya git logve muhtemelen diğerlerini kullanırken, seçeneği kullanın --word-diff=color(kelime farkları BTW için başka modlar da vardır)


2
--word-diff=colorgerçekten daha iyi (özellikle git config color.diff.old "red reverse"ve ile git config color.diff.new "green reverse"), ama istediğim bu değil :(
Nikolay Frantsev

4
Yani, eksik olduğunuz tek şey renkli işaretleme / bir şekilde aynı anda hem satırları hem de baytları değiştirmiş?
anydot

7
Trac'ta olduğu gibi, her değişen satırda değişen satırları ve değişen baytları vurgulamak istiyorum. Sadece değişen baytlar değil, aynı şey değil.
Nikolay Frantsev

Bunu şununla da kullanabilirsiniz git add --patch: stackoverflow.com/questions/10873882/…
naught101

Bunun avantajı, diff-highlighthem kelime farkları hem de satır farkları için iyi çalışmasıdır.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

21

diff-so-fancydiffinsan gözü için tasarlanmış bir -highlighter.

Baştaki +/ -kes / yapıştır için rahatsız edici olanları kaldırır ve dosyalar arasında net bölümler oluşturur.

Renkli git(sol) vs diff-so-fancy(sağ - karakter düzeyinde vurgulara dikkat edin):

diff-so-fancy çıktı

diff-so-fancy(Sağ taraf) çıktısını istiyorsanız, ancak bir githavuzdaki dosyalarla sınırlandırılmamışsanız .bashrc, herhangi bir dosyada kullanmak için aşağıdaki işlevi kendi işlevinize ekleyin :

dsf() { git diff --no-index --color "$@" | diff-so-fancy; }

Örneğin:

dsf original changed-file

Karakter seviyesinde vurgulama ve standart diffformat

Standart olmayan biçimlendirmesini sevmiyorsanız diff-so-fancy, ancak yine de karakter düzeyinde gitvurgulamak istiyorsanız , 'ın çıktısını diff-highlightalacak gitve gerçekten oldukça standart diffbiçimli çıktı üretecek olanı kullanın :

fark vurgulama ekran görüntüsü

Varsayılan olarak kullanmak için şuraya gitekleyin .gitconfig:

[color "diff-highlight"]
  oldNormal = red bold
  oldHighlight = red bold 52
  newNormal = green bold
  newHighlight = green bold 22

[pager]
  diff = diff-highlight | less -FRXsu --tabs=4

Bu [pager]bölüm git, önceden renklendirilmiş çıktısını diff-highlightkarakter düzeyinde renklendirmeye yönlendirmeyi ve ardından çıktıyı sadece varsayılanı kullanmak yerine daha az (gerekirse) sayfalamayı söyler less.


Bu çok ilginç, bu gitconfigseçeneklerden biraz bahseder misiniz?
caesarsol

Güncellenmiş, ayrıca işlev eklenmiştir dsf().
Tom Hale

15

İstediğiniz davranış artık git'in kendisinde mevcuttur (naught101 tarafından yapılan bir yorumda belirtildiği gibi). Etkinleştirmek için çağrı cihazınızı şu şekilde ayarlamanız gerekir:

perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

/usr/share/doc/git/contrib/diff-highlight/diff-highlightUbuntu 13.10'daki vurgulayıcı komut dosyasının yeri nerede (neden bir docklasörde olduğu hakkında hiçbir fikrim yok ). Sisteminizde yoksa, locate diff-highlightbulmak için kullanmayı deneyin . Vurgulanan komut dosyasının çalıştırılabilir olmadığını (en azından benim makinemde), dolayısıyla gereksinimin olduğunu unutmayın perl.

Vurgulayıcıyı çeşitli fark benzeri komutlar için her zaman kullanmak için ~/.gitconfigdosyanıza aşağıdakileri eklemeniz yeterlidir :

[pager]
    log = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    show = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less
    diff = perl /usr/share/doc/git/contrib/diff-highlight/diff-highlight | less

Yeni bir cevap naught101 yorumu, gömülü ve kurmak oldukça olmadığı için önemsiz ben yönergeleri olduğunu Ubuntu sürümüne olması gerektiği gibi ve en az olarak olarak ben bu ilave README işi yok.


Bunun, git add -p(etkileşimli mod) içindeki farklar için vurgulamayı etkinleştirmediğini fark ettim . Yine de bunun nasıl düzeltilebileceğini bilmiyorum, sadece listeye ekle eklemek askıda kalmasına neden oluyor.
dsh Shepherd

5
Bu şimdi 2.9.0 sürümünde çalışmalı:git config interactive.diffFilter diff-highlight
Thomas

^ Bu! Ne yazık ki, diff-highlightyolumda değildi, bu yüzden önce onu bulmalıydım. Aşağıdaki cevabımdaki detaylar.
Cory Klein

11

Bayt tabanlı farklar için bir yardımcı program, v1.7.8'den beri resmi Git ile dağıtılmaktadır 1 . Makinenizde nereye kurulu olduğunu bulmanız ve etkinleştirmeniz yeterlidir.

Git'in nerede kurulu olduğunu bulun

  • Homebrew aracılığıyla kurulu Git ile MacOS :/usr/local/opt/git
  • Windows için Git ile Windows : cd / && pwd -WKurulum dizinini bulmak için çalıştırın .
  • Linux: Nerd. Git yüklü olduğu zaten bilmiyorsanız, o zaman ll $(which git)ya locate gityardımcı olmalıdır.

diff-highlightYol dizininizin bulabilmesi için bin dizininize bağlantı verin

GIT_HOME='/usr/local/opt/git/'  # Use the value from the first step.
ln -s "${GIT_HOME}/share/git-core/contrib/diff-highlight/diff-highlight" \
      '/usr/local/bin/diff-highlight'

Git yapılandırmanızda etkinleştirin

git config --global interactive.diffFilter diff-highlight # Use on interactive prompts
git config --global pager.diff "diff-highlight | less"    # Use on git diff
git config --global pager.log  "diff-highlight | less"    # Use on git log
git config --global pager.show "diff-highlight | less"    # Use on git show

1 İşte v1.7.8 sürümü , ancak o zamandan beri birçok değişiklik yapıldı.


1
Git ile hangi versiyonda dağıtılmaya başladığını belirtmekte fayda var. Ayrıca dağıtımların varsayılan olarak PATH içine koyacağını tahmin ediyorum, bu yüzden symlink adımına gerek kalmayacak? Ve which gitilk etapta
PATH'de

2
İyi olurdu! Bu bilgileri eklemekten çekinmeyin. Git paket yapar rağmen diff-highlight, aslında değil yüklemek Sembolik bağ adım (en azından MacOS üzerine) gerçekten gerekli yüzden bunu. Platformunuz için gerekli olmadığını fark ederseniz, cevabı tekrar güncellemekten çekinmeyin. Bu arada, which gitGit, çünkü genellikle, çalışır yapar yüklemek gityolda ikili bir yerlerde.
Cory Klein

Debian unstable'da bu dosyayı "derlemem" gerektiğine dikkat edin, çünkü elimde bir .perl. Derleme önemsiz: sadece koşmak sudo makeiçinde diff-highlightdizine.
tobiasBora

10

Kullandığım --color-wordsseçeneği ve bu benim için para cezası çalışır:

$ git diff --color-words | less -RS

5
Hayır, bu sadece kelimelerdeki farkı gösterir. OP'nin (ve I) istediği şey, kelime farklarının vurgulanmış olduğu normal bir satır-satır farktır (yani, farklı satırların renkli metin olduğunu ve bu satırlardaki kelime farklılıklarının normal renkli metin olduğunu, renkli vurgulamalı veya bir şey). Şimdi soruda bulunan örnek bağlantılara bakın.
naught101

1
pastebin.com/1JrhYHRt Aslında, sorunuzda tarif ettiğiniz gibi güzel bir vurgulama elde etmek için vimdiff'i difftool olarak ve vimdiff'i molokai renk şemasıyla kullanıyorum. 1- git config --global diff.tool vimdiff 2- in vim ": colo molokai " * Molokai @ github.com/tomasr/molokai * ~ / .vimrc ile olası otomatik renk şeması: if & diff set background = dark colorscheme molokai endif
13'te

4

olarak @dshepherd diyor :

İstediğiniz davranış artık git'in kendisinde mevcut

Ancak diff-highlightDOC'ta bulunur ve kabuktan alınamaz.
Yüklemek için diff-highlightsenin içine ~/bindizinde sonraki adımları (Bu yazmaktan kurtarır olacaktır) izleyin:

$ locate diff-highlight
$ cd /usr/share/doc/git/contrib/diff-highlight  #or path you locate
$ sudo make
$ mv diff-highlight ~/bin

Ardından .gitconfig, resmi belgenizi şu şekilde yapılandırın :

[pager]
    log  = diff-highlight | less
    show = diff-highlight | less
    diff = diff-highlight | less

UPD
Ayrıca en son githerhangi bir kurulum yapmadan deneyebilirsiniz :

git diff --color-words=.

Daha karmaşık:

git diff --color-words='[^[:space:]]|([[:alnum:]]|UTF_8_GUARD)+'

1

Emacs, ihtiyaçlarınızı karşılayacak ediff-patch-buffer fonksiyonuna sahiptir.

Düzeltilmemiş dosyayı emacs tipi ESC-x, ediff-patch-buffer'da açın.

Komut istemlerini izleyin ve dosyanızın yamalı ve orijinal sürümlerinin vurgulanmış bir karşılaştırmasını görmelisiniz.

Yorumunuza göre, aşağıdakiler size yalnızca dwdiff gerektiren bir bash çözümü verecektir:

#!/bin/bash
paste -d'\n' <(dwdiff -2 -L -c <(cat $2) <(patch $2 -i $1 -o -)) <(dwdiff -1 -L -c <(cat $2) <(patch $2 -i $1 -o -))| uniq

üzgünüm, emacs kullanmak istemiyorum, sadece bash, git veya vim
Nikolay Frantsev

Bu anlaşılabilir. Aklıma gelen diğer tek şey, renk sapmasını yamadan stdout ile kullanmaktır: colordiff -u <(patch original_file -i patch_file -o -) <(cat original_file) ancak bu, ısırıkları değil, yalnızca değişen çizgileri vurgulayacak ...
Finbar Crago

Sorununuzu biraz daha düşündüm ve sadece dwdiff gerektiren ikinci bir çözüm ekledim.
Finbar Crago

1
lütfen sorumu dikkatlice okuyunuz, dosyaları karşılaştırmak istemiyorum
Nikolay Frantsev

1
karışıklık için özür dilerim, bu yüzden bir diff dosyasının değiştirilmiş satırlarındaki değişen baytları vurgulamanın bir yolunu hemen mi arıyorsunuz? eğer öyleyse deneyindwdiff -c --diff-input diff_file
Finbar Crago

1

Zor

GitLab, GitHub'a benzer çıktılar elde etmek ve diff vurgulamak için Diffy https://github.com/samg/diffy (Ruby) kullanıyor :

görüntü açıklamasını buraya girin

Diffy, farkın kendisini aynı algoritma olan Git'i kullanarak yapar ve GitLab'ın kullandığı HTML çıktısı da dahil olmak üzere farklı çıktı türlerini destekler:

gem install diffy
echo '
  require "diffy"    
  puts Diffy::Diff.new("a b c\n", "a B c\n").to_s(:html)
' | ruby

Çıktı:

<div class="diff">
  <ul>
    <li class="del"><del>a <strong>b</strong> c</del></li>
    <li class="ins"><ins>a <strong>B</strong> c</ins></li>
  </ul>
</div>

strongDeğiştirilen baytlara nasıl eklendiğine dikkat edin.


0

Evet, Vim bunu satır içinde değiştirilen metnin vurgulanması dahil yapar.
Gör :h diffve:h 08.7Dosyaları nasıl ayırt edeceğiniz daha fazla ayrıntı için .

Vim, vurgulamak için oldukça basit bir algoritma kullanır. Satırı ilk değiştirilen karakteri ve ardından son değiştirilen karakteri arar ve aralarındaki tüm karakterleri vurgular.
Bu, satır başına birden fazla vurguya sahip olamayacağınız anlamına gelir - Vim'deki birçok tasarım kararı, verimliliği önceliklendirir.


maalesef, fark çıktısındaki değiştirilen baytları vurgulamıyor (set filetype = diff)
Nikolay Frantsev

1
Sanırım sorunuzu şimdi anlıyorum - sözdizimi, diff komutunun metin çıktısını vurgulamak, böylece satır içinde yapılan değişiklikleri vurgulamak istiyorsunuz. Bu metni Vim'de düzenlemek, satır farklarını vurgular ancak bir satır içinde yapılan değişiklikleri vurgulamaz.
PDug

Orijinal dosyayı yüklemek ve ardından yamalı sürümle karşılaştırmak için Vim'in: patchfile komutunu kullanabilir misiniz?
PDug

ne yazık ki hayır, birden çok dosya için özyinelemeli diff çıktısı kullanmak istiyorum
Nikolay Frantsev

0

vimdiff file1 file2 iki dosya arasındaki karakter açısından farkı gösterecektir.

vimdiff, vim'e dahil edilen bir diff aracıdır. (Vim, kontrol edebileceğinizden emin olmak için + diff seçeneğiyle derlenmiş olmalıdır :version)

Ayrıca vim içinden de başlatabilirsiniz. Daha :help difffazla bilgi ve komut için bakın .


Dosyaları karşılaştırmak istemiyorum, diff (yama) dosyasını vurgulamak istiyorum.
Nikolay Frantsev

Eğer perfomance umurumda değil ise @Nikolay Frantsev, sen benim yükleyebilir format.vim eklenti ve yapılacak vimdiff file.old file.new -c 'FormatCommand diffformat' -c 'w! file.diff.html' -c 'qa!'.
ZyX

Bir toplu iş modunda bir fark yapar ( uçbirimin yanıp sönmesini görmek istemezseniz başa ekleyin screen -D -mveya ekleyin &>/dev/null(/ dev / null değişken bazen garip hatalar üretir)) ve biçimlendirme tamamlandıktan sonra vim'den çıkar, ancak bu tamamen vimscript ve en iyileştirmelerimle bile büyük dosyalar için çok yavaş.
ZyX

0

Not : Bu, burada bulunanların bir kopyasıdır: git'in diff vurgulaması nasıl geliştirilir? . Cevabımı burada da yayınlamak, çünkü bu konuyu doğrudan bulan bazı insanlara yardımcı olabilir :)

Daha önceki bazı cevaplarda da söylendiği gibi, bu sadece git şeyler ile mümkündür. Sisteminize bağlı olarak talimatları takip etmek biraz daha kolay olabileceğinden bunu gönderiyorum, ancak bu diğer birkaç cevaba benziyor.

Tamamen Git'e ve onun katkılarına dayanan bir çözüm. Bu, git ile birlikte gelenlerden başka ek dosyalar gerektirmez . Tüm açıklamalar Ubuntu içindir (18.04LTS'de test edilmiştir), diğer linux sistemlerinde benzer şekilde çalışmalıdır:

  • Fark vurgulama katkısı git snippet'ini bulun:
find -L /usr -name diff-highlight -type f

sistemimde tek geçerli cevap şudur:

/usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • Karşılık gelen perl betiğini çalıştırılabilir yapın. Benim durumumda yapmam gerekiyordu:
sudo chmod +x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • ~/.gitconfigEkleyerek istediğiniz sonucu elde etmek için sayfanızı güncelleyin (bunların 4 boşluk değil SEKME olduğunu unutmayın):
[color "diff-highlight"]
    oldNormal = red
    oldHighlight = red 52
    newNormal = green
    newHighlight = green 22
  • Sonucun keyfini çıkarın (not: bu sadece farklı renklendirme + vurgulama içindir, burada başka şeyler de var tabii ki istem için :))

diff-vurgulayıcı

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.