วิธี colorize แตกต่างในบรรทัดคำสั่ง?


503

เมื่อฉันมีความแตกต่างฉันจะทำสีให้มันดูดีได้อย่างไร? ฉันต้องการมันสำหรับบรรทัดคำสั่งดังนั้นโปรดไม่มีการแก้ปัญหา GUI


6
ระบบปฏิบัติการ / เชลล์ใดโดยเฉพาะ?
Rowland Shaw

4
ลองgithub.com/walles/riff ในฐานะโบนัสที่เพิ่มเข้ามามันจะเน้นว่าส่วนใดของบรรทัดที่เปลี่ยน
Johan Walles

คำตอบ:


608

หน้าคนสำหรับdiffแนะนำไม่มีทางออกสำหรับ colorization จากภายในตัวเอง colordiffโปรดพิจารณาใช้ มันเป็น wrapper รอบ ๆdiffที่สร้างเอาต์พุตเดียวกันกับ diff ยกเว้นว่ามันจะเพิ่มเอาท์พุตโดยใช้ไวยากรณ์ที่เน้นสีเพื่อเพิ่มความสามารถในการอ่าน:

diff old new | colordiff

หรือเพียงแค่:

colordiff old new

การติดตั้ง:

  • อูบุนตู / Debian: sudo apt-get install colordiff
  • OS X: brew install colordiffหรือport install colordiff

45
เพิ่งพบว่าตัวเอง :-) มันสามารถถูกทำให้เป็นท่อน้อยลงโดยใช้less -Rซึ่งจะแสดงลำดับการหลบหนีสำหรับสีได้อย่างถูกต้อง
daniel kullmann

34
สามารถใช้ไวยากรณ์: colordiff file1 file2
Felipe Alvarez

3
อนิจจามันไม่ทำงานสำหรับการส่งออกด้านข้าง( -yตัวเลือกในการเปิดใช้งาน)vimdiffข้อเสนอแนะดังต่อไปนี้อาจจะเป็นวิธีที่ดีกว่า
Hi-แองเจิล

8
colordiffทำงานได้ดีสำหรับsvn diff | colordiff(เช่นในสถานการณ์ที่คุณมีส่วนต่างเท่านั้นไม่ใช่ทั้งสองไฟล์ที่แตกต่างกัน)
Cornstalks

8
เป็นการอัปเดตความคิดเห็นของ @ Hi-Angel: colordiff ได้รับการอัปเดตและขณะนี้มี-yการสนับสนุนแบบเคียงข้างกัน ( )
Bailey Parker

333

ใช้เป็นกลุ่ม :

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

หรือยังดีกว่าVimDiff (หรือvim -dที่สั้นกว่าสำหรับพิมพ์) จะแสดงความแตกต่างระหว่างไฟล์สองสามหรือสี่ไฟล์เคียงข้างกัน

ตัวอย่าง:

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

7
@Jichao: ฉันชอบที่จะเรียนรู้คำสั่งมากกว่านามแฝงพวกเขาออกไป ด้วยวิธีนี้ฉันสามารถใช้งานได้ทุกที่แม้จะไม่สามารถใช้ dotfiles ได้
Johnsyweb

1
@AquariusPower: ctrl-cและctrl-xมีประโยชน์อื่น ๆ ใน Vim ctrl-qถูกจับโดยอาคารหลายแห่ง ดูการเขียนและการเลิกเพื่อหาวิธีที่เหมาะสมกับความต้องการของคุณมากที่สุด
Johnsyweb

1
อันดับแรกเปลือกหอยแบบนี้คืออะไร? zsh? ฉันไม่รู้จัก=(...)โครงสร้าง ประการที่สองฉันมีdiff -ur a bในใจ
x-yuri


1
โซลูชันนี้ดีกว่าคำตอบที่ยอมรับเนื่องจากคุณไม่จำเป็นต้องมีสิทธิ์ผู้ดูแลระบบและติดตั้งเครื่องมือเพิ่มเติม
amanzoor

173

ที่จริงดูเหมือนว่าจะมีตัวเลือกอื่น (ซึ่งฉันเพิ่งสังเกตเห็นเมื่อเร็ว ๆ นี้เมื่อพบปัญหาที่อธิบายข้างต้น):

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

หากคุณมี Git อยู่แล้ว (ซึ่งคุณอาจใช้อยู่แล้ว) คุณจะสามารถใช้เพื่อเปรียบเทียบได้แม้ว่าไฟล์เหล่านั้นจะไม่อยู่ภายใต้การควบคุมเวอร์ชัน หากไม่ได้เปิดใช้งานไว้สำหรับคุณตามค่าเริ่มต้นการเปิดใช้งานการสนับสนุนสีที่นี่น่าจะง่ายกว่าวิธีแก้ปัญหาที่กล่าวถึงก่อนหน้า


19
นี่เป็นระเบียบเรียบร้อย แต่น่าเศร้าที่ใช้ไม่ได้เมื่ออินพุตเป็นไพพ์ ตัวอย่างเช่นการเปรียบเทียบไฟล์ไบนารีผ่านgit diff <(xxd file1) <(xxd filed)ไม่ทำงาน
Michael Anderson

8
ผิดปกติอย่างน้อยหนึ่งของไฟล์ที่จะต้องมีการ git help diff'นอกพื้นที่เก็บข้อมูลในปัจจุบันตาม ดังนั้นหากความแตกต่างของคอมไพล์ของคุณว่างเปล่าลองcdจากที่ที่คุณอยู่
คำขอไม่ถูกต้อง

7
เพื่อเปิดใช้งานสีสำหรับคอมไพล์git config color.diff auto
diffit

2
ง่ายสุด ๆ และรวดเร็ว
EE33

31
หากทั้งสองไฟล์อยู่ในที่เก็บปัจจุบันให้ใช้git diff --no-indexเพื่อเปรียบเทียบสองไฟล์
Olivier 'Ölbaum' Scherler

94

diff --color เพิ่มตัวเลือกใน GNU diffutils 3.4 (2016-08-08)

นี่คือการdiffใช้งานเริ่มต้นสำหรับ distros ส่วนใหญ่ซึ่งจะได้รับในไม่ช้า

Ubuntu 18.04 มีdiffutils3.6 และดังนั้นจึงมี

ใน 3.5 ดูเหมือนว่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

การทดสอบ:

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

เพิ่มชัดเจนในการกระทำ c0fa19fe92da71404f809aafb5f51cfd99b1bee2 (มีนาคม 2015)

ระดับคำต่าง

กดdiff-highlightไลค์ ดูเหมือนจะเป็นไปไม่ได้คำขอคุณสมบัติ: https://lists.gnu.org/archive/html/diffutils-devel/2017-01/msg00001.html

หัวข้อที่เกี่ยวข้อง:

ydiff ทำมันแม้ว่าดูด้านล่าง

ydiff ความแตกต่างของระดับคำเคียงข้างกัน

https://github.com/ymattw/ydiff

นิพพานนี้หรือไม่

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

ผล:

ป้อนคำอธิบายรูปภาพที่นี่

หากบรรทัดแคบเกินไป (80 คอลัมน์เริ่มต้น) ให้พอดีกับหน้าจอด้วย:

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

เนื้อหาของไฟล์ทดสอบ:

a

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

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

ydiff ผสานรวมกับ Git โดยไม่ต้องกำหนดค่าใด ๆ

จากภายในที่เก็บ git git diffคุณสามารถทำได้เพียง:

ydiff -s

และแทนที่จะเป็นgit log:

ydiff -ls

ดูเพิ่มเติม: ฉันจะได้ความแตกต่างแบบเคียงข้างกันเมื่อฉันทำ "git diff" ได้อย่างไร?

ทดสอบบน Ubuntu 16.04, git 2.18.0, ydiff 1.1


นี่คือเอกสาร
Alexey

1
ในเธรดรายการจดหมาย: There is no word-highlighting, yet- การปรับปรุงใด ๆ นี่คือสิ่งที่ฉันมาถึงคำถามนี้สำหรับ (ฉันต้องการgrep --colorเอาท์พุท diff- เหมือน)
i336_

@ i336_ ไม่มีการอัปเดตหากฉันได้รับฉันจะอัปเดตคำถาม Ping ฉันถ้าคุณพบอะไร
Ciro Santilli 郝海东冠状病六四事件法轮功

โดยวิธีการgit diff --colorทำงานเกินไป มีประโยชน์เมื่อทำงานกับ ssh
Nagev

ใหญ่เกินไปหรือไม่ ใช้diff --color=always | less -R
inetphantom

69

และสำหรับโอกาสเหล่านั้นเมื่อ a yum install colordiffหรือa apt-get install colordiffไม่ใช่ตัวเลือกเนื่องจากข้อ จำกัด ที่บ้าเกินกว่าการควบคุมอย่างฉับพลันหรือคุณแค่รู้สึกบ้าคุณสามารถคิดค้นล้อใหม่ด้วยสายของ:

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

โยนมันลงในเชลล์สคริปและไพพ์เอาท์พุทdiff ที่รวมเป็นหนึ่งผ่านมัน

มันทำให้ตัวทำเครื่องหมายสีน้ำเงินและเน้นชื่อไฟล์ใหม่ / เก่าและเพิ่ม / ลบบรรทัดในพื้นหลังสีเขียวและสีแดงตามลำดับ 1 และมันจะทำให้พื้นที่ต่อท้าย2เปลี่ยนแปลงได้ชัดเจนกว่า colordiff can


1 โดยบังเอิญเหตุผลในการเน้นชื่อไฟล์เหมือนกับบรรทัดที่แก้ไขคือการแยกความแตกต่างระหว่างชื่อไฟล์และบรรทัดที่แก้ไขอย่างถูกต้องต้องแยกวิเคราะห์รูปแบบ diff อย่างถูกต้องซึ่งไม่ใช่สิ่งที่ต้องจัดการกับ regex การเน้นให้เห็นผลงานชิ้นเดียวกันคือ "ดีพอ" และทำให้เกิดปัญหาเล็กน้อย ที่กล่าวว่ามีบางอย่างที่น่าสนใจรายละเอียดปลีกย่อย

2แต่ไม่ใช่แท็บต่อท้าย เห็นได้ชัดว่าแท็บไม่ได้รับชุดพื้นหลังอย่างน้อยใน xterm ของฉัน มันทำให้การเปลี่ยนแปลงของแท็บ vs space มีความโดดเด่นเล็กน้อย


5
@ แมท: นี่เป็นวิธีที่โหดร้ายสำหรับ Mac: sed "s/^-/`echo -e \"\x1b\"`[41m-/;s/^+/`echo -e \"\x1b\"`[42m+/;s/^@/`echo -e \"\x1b\"`[34m@/;s/$/`echo -e \"\x1b\"`[0m/"(แม้ว่าฉันคาดหวังว่าจะมีวิธีที่ดีกว่า)
retracile

1
อืมมันใช้งานได้ ... ให้ขีดคั่น 3 อันระหว่างแต่ละอันมีพื้นหลังเป็นสีชมพู
Matt Montag

คู่มือวิธีที่อ่านไม่ได้และไม่สามารถระบายได้โดยไม่มีตัวเลือกในการเปลี่ยนสีเช่น

1
เพื่อนนี่มันยอดเยี่ยมมาก! ทางที่จะไป! นั่นคือเวทมนตร์คาถาที่ดี
fthinker

6
sed 's / ^ - / \ x1b [31m - /; s / ^ + / \ x1b [32m + /; s / ^ @ / \ x1b [34m @ /; s / $ / \ x1b [0m /' ดูดีเช่นกัน
Yura

16

คุณสามารถเปลี่ยนการกำหนดค่าการโค่นล้มเพื่อใช้ colordiff

~ / .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

ผ่าน: https://gist.github.com/westonruter/846524


svn: ไม่สามารถเริ่มต้นกระบวนการ 'colordiff': ทรัพยากรไม่สามารถใช้งานได้ชั่วคราว
niken

คุณติดตั้ง colordiff หรือไม่?
Azd325

ใช่ฉันพยายาม hardcoding เส้นทางเช่นกัน (ทำงานใน cygwin)
niken

การลองใช้ idk อาจsuperuser.com/questions/635995/…
Azd325

12

ouput สีระดับคำ diff

นี่คือสิ่งที่คุณสามารถทำได้ด้วยสคริปต์ด้านล่างและไฮไลต์ diff :

ภาพหน้าจอ diff สี

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

( คำตอบให้เครดิตกับ@ retracileสำหรับการsedเน้น)


ฉันจะใช้เอาต์พุตนี้ใน GVim ได้อย่างไร
Hemant Sharma

สำหรับการvimใช้ปลั๊กอินเช่นdiffchar
Tom Hale

10

ใช้ฉันgrc(ทั่วไป Colouriser) diffซึ่งช่วยให้คุณสามารถส่งออกสีของจำนวนคำสั่งรวมทั้ง

มันเป็นสคริปต์หลามซึ่งสามารถล้อมรอบคำสั่งใด ๆ ดังนั้นแทนที่จะกล่าวอ้างdiff file1 file2คุณจะเรียกใช้grc diff file1 file2เพื่อดูผลลัพธ์ colourised ฉันได้ใช้นามแฝงdiffในการgrc diffที่จะทำให้มันง่ายขึ้น


ไม่ทำงานบน Windows ด้วย mingw / cygwin เนื่องจากมีการfork()โทรถึงแม้ว่าจะทำงานกับ WSL ได้
Gabriel Devillers

6

นี่คือวิธีอื่นที่จะเรียกsedให้ใส่ลำดับหนี ANSI ที่เหมาะสมสำหรับสีที่จะแสดง+, -และ@สายสีแดง, สีเขียวและสีฟ้าตามลำดับ

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

ไม่เหมือนกับโซลูชันอื่น ๆ สำหรับคำถามนี้โซลูชันนี้ไม่ได้สะกดลำดับ ANSI escape อย่างชัดเจน แต่จะเรียกใช้คำสั่งtput setafและtput sgr0เพื่อสร้างลำดับ ANSI escape เพื่อตั้งค่าสีที่เหมาะสมและรีเซ็ตคุณสมบัติของเทอร์มินัลตามลำดับ

หากต้องการดูสีที่มีให้สำหรับแต่ละอาร์กิวเมนต์ให้tput setafใช้คำสั่งนี้:

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

นี่คือลักษณะที่เอาต์พุต:

ป้อนคำอธิบายรูปภาพที่นี่

นี่คือหลักฐานที่ว่าtput setafและtput sgr0คำสั่งสร้างลำดับ ANSI escape ที่เหมาะสม:

$ 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

เนื่องจากwdiffยอมรับ args ที่ระบุสตริงที่จุดเริ่มต้นและจุดสิ้นสุดของการแทรกและการลบคุณสามารถใช้ลำดับสี ANSI เป็นสตริงเหล่านั้น:

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

ตัวอย่างเช่นนี่เป็นผลลัพธ์ของการเปรียบเทียบสองไฟล์ CSV:

เอาต์พุต diff ของไฟล์ CSV

ตัวอย่างจากhttps://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html


1
colordiffตอนนี้ (1.0.16) เข้าใจเพื่อให้คุณสามารถก็เป็นเพียงแค่ท่อ:wdiff ควรรวมเป็น diffutils ...wdiff -n f1 f2 | colordiffwdiff
Ciro Santilli 法轮功冠状病六四事件法轮功

3

ฉันอยากจะแนะนำให้คุณลองทำdiff-so-fancy ฉันใช้มันในระหว่างการทำงานและมันก็ดูดีมากในตอนนี้ มันมาพร้อมกับตัวเลือกมากมายและเป็นเรื่องง่ายที่จะกำหนดค่า diffs ตามที่คุณต้องการ

คุณสามารถติดตั้งได้โดย:

sudo npm install -g diff-so-fancy

หรือบน Mac:

brew install diff-so-fancy

หลังจากนั้นคุณสามารถเน้นความแตกต่างดังนี้:

diff -u file1 file2 | diff-so-fancy


0

ใน git รุ่นล่าสุดบน Ubuntu คุณสามารถเปิดใช้งานการเน้นด้วย:

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

แล้วเพิ่มสิ่งนี้ใน.gitconfig:

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

มีความเป็นไปได้ที่สคริปต์จะอยู่ที่อื่นใน distros อื่น ๆ คุณสามารถใช้locate diff-highlightค้นหาว่าอยู่ที่ไหน


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.