명령 줄에서 diff를 색칠하는 방법은 무엇입니까?


답변:


608

매뉴얼 페이지 diff는 내부에서 채색에 대한 해결책이 없음 을 제안합니다. 사용을 고려하십시오 colordiff. diff가독성을 높이기 위해 색상이 지정된 구문 강조 표시를 사용하여 출력을 늘리는 것을 제외하고 diff와 동일한 출력을 생성 하는 래퍼 입니다.

diff old new | colordiff

또는 그냥 :

colordiff old new

설치:

  • 우분투 / 데비안 : sudo apt-get install colordiff
  • OS X : brew install colordiff또는port install colordiff

45
방금 저 자신을 발견했습니다 :-). less -R색상 을 사용 하여 이스케이프 시퀀스를 올바르게 표시하는 을 사용하여 덜 파이프로 파이프 할 수 있습니다 .
다니엘 쿨만

34
다음 구문을 사용할 수 있습니다 : colordiff file1 file2
Felipe Alvarez

3
아아,이 나란히 출력 작업을하지 않는 ( -y수 있도록 옵션)vimdiff아마 아래에 제안 더 나은 방법
하이 천사

8
colordiff잘 작동합니다 svn diff | colordiff(즉, 두 파일을 비교하는 것이 아니라 diff 만있는 상황).
Cornstalks

8
@ Hi-Angel의 의견에 대한 업데이트로 : colordiff가 업데이트되었으며 이제 나란히 ( -y) 지원됩니다.
Bailey Parker

333

Vim 사용 :

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

또는 VimDiff (또는 vim -d형식이 더 짧은)는 2 개, 3 개 또는 4 개의 파일을 나란히 표시합니다.

예 :

vim -d /path/to/[ab]

vimdiff file1 file2 file3 file4

7
@Jichao : 별명을 쓰지 않고 명령을 배우는 것을 선호합니다. 이렇게하면 내 도트 파일을 사용할 수없는 경우에도 어디서나 사용할 수 있습니다.
Johnsyweb

1
@AquariusPower : ctrl-c그리고 ctrl-xVim에서 다른 용도로 사용하십시오. ctrl-q많은 터미널에 의해 캡처됩니다. 필요에 가장 적합한 방법을 찾으려면 쓰기 및 종료 를 참조하십시오 .
Johnsyweb 2016 년

1
첫째, 이것은 어떤 종류의 껍질입니까? zsh? =(...)구문을 인식하지 못합니다 . 둘째, 나는 diff -ur a b생각했다.
x-yuri

3
과연. Zsh에서는 양식=(...)
Johnsyweb

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. 따라서 git diff가 비어 있으면 cd어디에서나 시도하십시오 .
나쁜 요청

7
git diff의 색상을 활성화하려면 :git config color.diff auto
JWhy

2
매우 간단하고
빠름

31
두 파일이 모두 현재 저장소에있는 경우 두 파일 git diff --no-index을 비교 하는 데 사용 하십시오.
Olivier 'Ölbaum'Scherler

94

diff --color 옵션이 GNU diffutils 3.4에 추가되었습니다 (2016-08-08)

이것은 diff대부분의 배포판 에서 기본 구현이며 곧 제공 될 것입니다.

우분투 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 년 3 월)에 추가되었습니다.

단어 수준의 차이

처럼 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

테스트 파일의 내용 :

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 힘내 통합

ydiff 별도의 구성없이 Git과 통합됩니다.

대신 git 저장소 내부 git diff에서 다음을 수행 할 수 있습니다.

ydiff -s

대신에 git log:

ydiff -ls

참조 : 나는 "자식은 diff"할 때 어떻게 나란히 DIFF을받을 수 있나요?

Ubuntu 16.04, git 2.18.0, ydiff 1.1에서 테스트되었습니다.


다음 은 설명서입니다.
Alexey

1
메일 링리스트 스레드에서 : There is no word-highlighting, yet-업데이트? 이것이 내가이 질문에 왔던 것입니다 (나는 grep --color같은 diff 출력을 원합니다 ).
i336_

@ i336_ 불행히도 업데이트가 없습니다.있는 경우 질문을 업데이트합니다. 당신이 뭔가를 찾으면 핑.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

그건 그렇고 git diff --color작동합니다. ssh를 통해 작업 할 때 유용합니다.
Nagev

너무 커요? 사용diff --color=always | less -R
inetphantom

69

그리고 즉각적인 통제를 넘어 미친 제약으로 인해 a yum install colordiff또는 an apt-get install colordiff이 옵션이 아니 거나 미친 느낌 이 드는 경우 sed 라인으로 휠을 다시 발명 할 수 있습니다.

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

그것을 쉘 스크립트에 던져 넣고 그것을 통해 통일 diff 출력을 파이프 하십시오.

그것은 덩어리 마커를 파란색으로 만들고 새 / 오래된 파일 이름과 녹색 / 빨간색 배경의 추가 / 제거 된 라인을 각각 강조 표시합니다. 1 그리고 이것은 후행 공간 2 변화가 colordiff보다 더 쉽게 드러날 것입니다.


1 수정 된 줄과 동일한 파일 이름을 강조 표시하는 이유는 파일 이름과 수정 된 줄을 올바르게 구분하기 위해 diff 형식을 올바르게 구문 분석해야하기 때문입니다. 그것들을 똑같이 강조하면 시각적으로 "충분히 잘"작동하며 문제를 사소하게 만듭니다. 즉, 몇 가지 흥미로운 미묘함이 있습니다.

2 그러나 후행 탭은 아닙니다. 분명히 내 xterm에서 탭이 배경을 설정하지 못합니다. 탭 대 공간 변경은 눈에 띄게 만듭니다.


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
야 이거 대단해! 잘 했어! 좋은 sed 마법사입니다.
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

그래, 나는 경로를 하드 코딩하려고 시도했다 (cygwin에서 실행)
niken

idk
시도이

12

컬러, 단어 수준 diff 출력

아래 스크립트와 diff-highlight로 할 수있는 작업은 다음과 같습니다 .

컬러 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색상이 지정된 출력을 볼 수 있습니다. 더 쉽게하기 위해 별칭 diff을 지정 grc diff했습니다.


fork()WSL에서 작동 할 가능성이 있지만 전화 로 인해 mingw / cygwin이있는 Windows에서는 작동하지 않습니다 .
가브리엘 데빌 러

6

여기에 원용는 또 다른 솔루션입니다 sed색상이 보여주기에 해당하는 ANSI 이스케이프 시퀀스를 삽입 +, -그리고 @각각 적색, 녹색, 청록색 라인.

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

이 질문에 대한 다른 솔루션과 달리이 솔루션은 ANSI 이스케이프 시퀀스를 명시 적으로 설명하지 않습니다. 대신, 호출 tput setaftput sgr0각각 적절한 색상을 설정하고 단말기 특성을 재설정 ANSI 이스케이프 시퀀스를 생성하는 명령을.

각 인수에 tput setaf사용 가능한 색상을 보려면 다음 명령을 사용하십시오.

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

출력 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하십시오

tput setaftput sgr0명령이 적절한 ANSI 이스케이프 시퀀스를 생성 한다는 증거는 다음 과 같습니다.

$ 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삽입과 삭제의 시작과 끝에 문자열을 지정하는 인수를 허용 하므로 ANSI 색상 시퀀스를 해당 문자열로 사용할 수 있습니다.

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

예를 들어 다음은 두 개의 CSV 파일을 비교 한 결과입니다.

CSV 파일의 diff 출력

https://www.gnu.org/software/wdiff/manual/html_node/wdiff-Examples.html의


1
colordiffnow (1.0.16)은 이해 wdiff하므로 파이프 : wdiff -n f1 f2 | colordiff. wdiffDiffutils의 병합해야 ...
치로 틸리는郝海东冠状病六四事件法轮功

3

나는 당신이 diff-so-fancy 를 시도해 볼 것을 제안합니다 . 나는 일하는 동안 그것을 사용하고 지금은 확실히 좋아 보인다. 많은 옵션이 포함되어 있으며 원하는 방식으로 diff를 구성하기가 정말 쉽습니다.

다음을 통해 설치할 수 있습니다.

sudo npm install -g diff-so-fancy

또는 Mac :

brew install diff-so-fancy

이후에 다음과 같이 차이점을 강조 표시 할 수 있습니다.

diff -u file1 file2 | diff-so-fancy


0

Ubuntu의 최신 버전의 git에서는 다음을 사용하여 diff-highlighting을 활성화 할 수 있습니다.

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

스크립트가 다른 배포판의 다른 곳에있을 수 있습니다 locate diff-highlight. 어디를 찾을 수 있습니까?


0

문자 수준의 색상 차이 : ccdiff 설치

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

ccdiff의 출력

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.