Komut satırındaki fark nasıl renklendirilir?


Yanıtlar:


608

Man sayfaları, diffkendi içinden renklendirme için bir çözüm önermez. Lütfen kullanmayı düşünün colordiff. Farkı diffaynı çıktıyı üreten bir sarıcıdır, ancak okunabilirliği artırmak için çıktıyı renkli sözdizimi vurgulama kullanarak artırır:

diff old new | colordiff

ya da sadece:

colordiff old new

Kurulum:

  • Ubuntu / Debian: sudo apt-get install colordiff
  • OS X: brew install colordiffveyaport install colordiff

45
Sadece kendimi buldum :-). less -RRenkler için kaçış dizilerini doğru bir şekilde görüntüleyen kullanılarak daha az boruya bağlanabilir .
daniel kullmann

34
Sadece sözdizimini kullanabilirsiniz: colordiff file1 file2
Felipe Alvarez

3
Ne yazık ki, yan yana çıktı için çalışmıyor ( -yetkinleştirme seçeneği) ☹ Aşağıdaki vimdifföneri muhtemelen daha iyi bir yol
Hi-Angel

8
colordiffiçin iyi çalışır svn diff | colordiff(yani sadece diff sahip durumlarda, iki dosya diffed verilmemesi gibi).
Cornstalks

8
@ Hi-Angel'ın yorumuna bir güncelleme olarak: colordiff güncellendi ve şimdi yan yana ( -y) destek içeriyor .
Bailey Parker

333

Vim kullanın :

diff /path/to/a /path/to/b | vim -R -

Ya da daha iyisi, VimDiff (ya da yazmasıvim -d daha kısa olan) iki, üç ya da dört dosya arasında yan yana farklılıklar gösterecektir.

Örnekler:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

7
@Jichao: Komutları takma ad yerine öğrenmeyi tercih ederim. Bu şekilde, dotfiles dosyalarım olmasa bile onları her yerde kullanabilirim.
Johnsyweb

1
@AquariusPower: ctrl-cve Vim'de ctrl-xbaşka kullanımları var. ctrl-qbirçok terminal tarafından ele geçirilir. İhtiyaçlarınıza en uygun yolu bulmak için Yazma ve bırakma konusuna bakın .
Johnsyweb

1
İlk olarak, bu ne tür bir kabuk? zsh? Yapıyı tanımıyorum =(...). İkincisi, diff -ur a baklımdaydı.
x-yuri

3
Aslında. Zsh'de, formun=(...)
Johnsyweb

1
Bu çözüm, sistem yöneticisi haklarına sahip olmanızı ve herhangi bir ek araç yüklemenizi gerektirmediğinden, kabul edilen yanıttan daha iyidir
amanzoor

173

Aslında başka bir seçenek var gibi görünüyor (ki ben sadece son zamanlarda, yukarıda açıklanan sorunla karşılaştığımda fark):

git diff --no-index <file1> <file2>
# output to console instead of opening a pager
git --no-pager diff --no-index <file1> <file2>

Git'iniz varsa (zaten zaten kullanıyor olabilirsiniz), dosyaların kendileri sürüm kontrolü altında olmasa bile karşılaştırma için kullanabilirsiniz. Varsayılan olarak sizin için etkinleştirilmemişse, burada renk desteğini etkinleştirmek, daha önce belirtilen geçici çözümlerden çok daha kolay görünüyor.


19
Bu temiz, ama ne yazık ki girişler boru olduğunda bu işe yaramaz. Örneğin, ikili dosyaları üzerinden karşılaştırmak git diff <(xxd file1) <(xxd filed)işe yaramaz.
Michael Anderson

8
Tuhaf bir şekilde, dosyalardan en az birinin 'mevcut deponun dışında' olması gerekiyor git help diff. Eğer git farkınız boş çıkıyorsa cd, bulunduğunuz yeri deneyin .
Kötü İstek

7
Git diff için renkleri etkinleştirmek için:git config color.diff auto
JWhy

2
süper basit ve hızlı
EE33

31
Her iki dosya da geçerli havuzun içindeyse, git diff --no-indexiki dosyayı karşılaştırmak için kullanın .
Olivier 'Ölbaum' Scherler

94

diff --color seçeneği GNU diffutils 3.4'e eklendi (2016-08-08)

Bu varsayılan diff çoğu dağıtımda uygulamadır ve yakında kullanıma sunulacaktır.

Ubuntu 18.04 diffutils3.6 ve bu nedenle var.

3.5'de şöyle görünür:

resim açıklamasını buraya girin

Test:

diff --color -u \
  <(seq 6 | sed 's/$/ a/') \
  <(seq 8 | grep -Ev '^(2|3)$' | sed 's/$/ a/')

Görünüşe göre c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (Mar 2015) 'de eklendi.

Kelime seviyesi farkı

Gibi diff-highlight. Görünüşe göre mümkün değil, özellik isteği: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

İlgili konular:

ydiff olsa da, aşağıya bakın.

ydiff yan yana kelime seviyesi farkı

https://github.com/ymattw/ydiff

Bu Nirvana mı?

python3 -m pip install --user ydiff
diff -u a b | ydiff -s

Sonuç:

resim açıklamasını buraya girin

Çizgiler çok darsa (varsayılan 80 sütun), ekrana aşağıdakilerle sığdır:

diff -u a b | ydiff -w 0 -s

Test dosyalarının içeriği:

bir

1
2
3
4
5 the original line the original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the original line
16
17
18
19
20

b

1
2
3
4
5 the original line teh original line the original line the original line
6
7
8
9
10
11
12
13
14
15 the original line the original line the original line the origlnal line
16
17
18
19
20

ydiff Git entegrasyonu

ydiff herhangi bir yapılandırma gerekmeden Git ile bütünleşir.

Git deposunun içinden git diff, sadece şunları yapabilirsiniz:

ydiff -s

yerine git log:

ydiff -ls

Ayrıca bkz: "git diff" i yaptığımda yan yana fark nasıl edinebilirim?

Ubuntu 16.04, git 2.18.0, ydiff 1.1 üzerinde test edilmiştir.


İşte belgeler.
Alexey

1
Bu posta listesi iş parçacığında: There is no word-highlighting, yet- herhangi bir güncelleme? Bu soruya geldiğim şey bu (I grep --colorlike-like diff output).
i336_

@ i336_ maalesef güncelleme yok, eğer alırsam soruyu güncelleyeceğim. Bir şey bulursan bana ping at.
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

Bu arada da git diff --colorçalışıyor. SSH üzerinde çalışırken kullanışlıdır.
Nagev

Fark çok mu büyük? kullanımıdiff --color=always | less -R
inetphantom

69

Ve hemen kontrolünüzün ötesinde bazı çılgın kısıtlamalar nedeniyle a yum install colordiffveya apt-get install colordiffan'ın bir seçenek olmadığı veya sadece çılgın hissettiğiniz durumlarda, tekerleği bir dizi sed ile yeniden icat edebilirsiniz:

sed 's/^-/\x1b[41m-/;s/^+/\x1b[42m+/;s/^@/\x1b[34m@/;s/$/\x1b[0m/'

Bir kabuk betiği ve boru birleştirilmiş dif çıkışını içinden atın .

Yığın işaretleyicileri mavi yapar ve sırasıyla yeşil ve kırmızı arka planda yeni / eski dosya adlarını ve eklenen / kaldırılan çizgileri vurgular. 1 Ve sondaki alanı 2 değişiklikleri kolordifin yapabileceğinden daha belirgin hale getirecektir.


1 Bu arada, dosya adlarını değiştirilen satırlarla aynı şekilde vurgulamanın nedeni, dosya adları ile değiştirilen satırlar arasında doğru bir şekilde ayrım yapılmasının, bir regex ile uğraşacak bir şey olmayan fark biçimini düzgün şekilde ayrıştırmayı gerektirmesidir. Bunları vurgulamak görsel olarak "yeterince iyi" çalışır ve sorunu önemsiz kılar. Bununla birlikte, bazı ilginç incelikler var .

2 Ancak sondaki sekmeler değil. Görünüşe göre sekmeler en azından xterm'de arka plan ayarını alamıyor. Bu sekme vs boşluk değişiklikleri biraz göze çarpıyor yapar.


5
@Matt: İşte Mac için kaba kuvvet yaklaşımı: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(daha iyi bir yol olmasını bekliyorum).
çekilme

1
Hmm, bir çeşit işe yaradı ... her parça arasındaki 3 tirene pembe bir arka plan verdi.
Matt Montag

Manuel olarak okunamayan, sürdürülemez bir şekilde renkleri kolayca değiştirme seçeneği yoktur.

1
Dostum bu harika! Gitme zamanı! Bu güzel bir sed sihirbazı.
fthinker

6
sed 's / ^ - / \ x1b [31m - /; s / ^ + / \ x1b [32m + /; s / ^ @ / \ x1b [34m @ /; s / $ / \ x1b [0m /' de harika görünüyor
Yura

16

Colordiff kullanmak için subversion yapılandırmasını değiştirebilirsiniz

~ / .Subversion / config.diff

 ### Set diff-cmd to the absolute path of your 'diff' program.
 ###   This will override the compile-time default, which is to use
 ###   Subversion's internal diff implementation.
-# diff-cmd = diff_program (diff, gdiff, etc.)
+diff-cmd = colordiff

yoluyla: https://gist.github.com/westonruter/846524


svn: 'colordiff' işlemi başlatılamıyor: Kaynak geçici olarak kullanılamıyor
niken

Colordiff'i kurdun mu?
Azd325

Evet, ben de yol
kodlama

idk deneyin olabilir bu superuser.com/questions/635995/…
Azd325

12

Renkli, kelime düzeyinde diff çıkış

Aşağıdaki komut dosyası ve diff-vurgulama ile yapabilecekleriniz :

Colored diff ekran görüntüsü

#!/bin/sh -eu

# Use diff-highlight to show word-level differences

diff -U3 --minimal "$@" |
  sed 's/^-/\x1b[1;31m-/;s/^+/\x1b[1;32m+/;s/^@/\x1b[1;34m@/;s/$/\x1b[0m/' |
  diff-highlight

(Kredi @ retracile cevabı için sedvurgulama)


Bu çıktıyı GVim'de nasıl kullanırım?
Hemant Sharma

İçin vimbir eklenti kullanın, örneğin diffchar .
Tom Hale

10

Ben grcde dahil olmak üzere bir dizi komutun çıktı renklendirmek için izin verir (Generic Colouriser), kullanın diff.

Herhangi bir komutun etrafına sarılabilen bir python betiğidir. Bunun yerine başvurmalarında diff file1 file2, sen çağırmak istiyorum grc diff file1 file2renklendirilmiş çıkış görmek. Ben Aliased gelmiş diffetmek grc diffdaha kolay hale getirmek için.


fork()WSL ile çalışmasına rağmen , aramalar nedeniyle mingw / cygwin yüklü Windows'ta çalışmaz.
Gabriel Devillers

6

İşte çağırdığı başka çözüm sedrenkleri göstermek için uygun ANSI çıkış sırasını eklemek için +, -ve @sırasıyla kırmızı, yeşil ve mavi çizgiler.

diff -u old new | sed "s/^-/$(tput setaf 1)&/; s/^+/$(tput setaf 2)&/; s/^@/$(tput setaf 6)&/; s/$/$(tput sgr0)/"

Bu sorunun diğer çözümlerinden farklı olarak, bu çözüm ANSI kaçış dizilerini açıkça belirtmez. Bunun yerine, sırasıyla uygun bir renk ayarlamak ve terminal özniteliklerini sıfırlamak için ANSI kaçış dizilerini oluşturmak üzere tput setafve tput sgr0komutlarını çağırır .

Her bağımsız değişken için kullanılabilir renkleri görmek için tput setafşu komutu kullanın:

for i in {0..255}; do tput setaf $i; printf %4d $i; done; tput sgr0; echo

Çıktı şöyle görünür:

resim açıklamasını buraya girin

İşte tput setafve tput sgr0komutlarının uygun ANSI kaçış dizilerini oluşturduğuna dair kanıtlar :

$ tput setaf 1 | xxd -g1
00000000: 1b 5b 33 31 6d                                   .[31m
$ tput setaf 2 | xxd -g1
00000000: 1b 5b 33 32 6d                                   .[32m
$ tput setaf 6 | xxd -g1
00000000: 1b 5b 33 36 6d                                   .[36m
$ tput sgr0 | xxd -g1
00000000: 1b 28 42 1b 5b 6d                                .(B.[m

5

Yana wdiffbaşında ve hem eklemeler ve silmeler sonunda dize belirterek args kabul eder o dizeleri olarak ANSI renk dizilerini kullanabilirsiniz:

wdiff -n -w $'\033[30;41m' -x $'\033[0m' -y $'\033[30;42m' -z $'\033[0m' file1 file2

Örneğin, bu iki CSV dosyasını karşılaştırma çıktısıdır:

CSV dosyalarının diff çıktısı

Https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html sayfasından örnek


1
colordiffŞimdi (1.0.16) anlar wdiff, bu nedenle Ayrıca sadece boruyu: wdiff -n f1 f2 | colordiff. wdiffdiffutils ile birleştirilmelidir ...
Ciro Santilli 法轮功 冠状 病 六四 事件 法轮功

3

Diff-so-fancy'yi denemenizi öneririm . Çalışmam sırasında kullanıyorum ve şu andan itibaren harika görünüyor. Birçok seçenekle birlikte gelir ve farklarınızı istediğiniz şekilde yapılandırmak gerçekten kolaydır.

Yükleyebilirsiniz:

sudo npm install -g diff-so-fancy

veya Mac'te:

brew install diff-so-fancy

Daha sonra farklarınızı şöyle vurgulayabilirsiniz:

diff -u file1 file2 | diff-so-fancy


0

Ubuntu'daki git'in son sürümlerinde, fark vurgulamayı aşağıdakilerle etkinleştirebilirsiniz:

sudo ln -s /usr/share/doc/git/contrib/diff-highlight/diff-highlight /usr/local/bin
sudo chmod a+x /usr/share/doc/git/contrib/diff-highlight/diff-highlight

Ve sonra bunu sizin için ekleyin .gitconfig:

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

Senaryo başka dağıtımlarda başka bir yerde bulunuyor olabilir, locate diff-highlightnerede bulmak için kullanabilirsiniz .


0

Karakter seviyesi renk farkı: ccdiff yükleyin

ccdiff -r /usr/share/dict/words /tmp/new-dict

Ccdiff çıkışı

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.