변경된 각 행에서 변경된 행 및 변경된 바이트 강조 표시


93

오픈 소스 프로젝트 Trac 은 훌륭한 diff 하이 라이터 를 가지고 있습니다. 변경된 각 라인에서 변경된 라인 과 변경된 바이트를 강조 합니다! 여기 또는 여기 를 참조 하십시오 .

bash 터미널 에서 또는 diff 출력 (패치 파일)에 동일한 색상 강조 표시 (예 : 변경된 행 및 변경된 바이트도 ) 를 사용하는 방법이 있습니까?gitvim


강조하고 싶은 것은 무엇입니까? 바이트 변경을 강조하는 diff 도구를 원하십니까? (매우 도움이 될 것입니다). 내 기억에 vim은 프로그래밍 언어 템플릿 (및 기타)을 사용할 때 이미 많은 색상 조작을 수행합니다. 어떻게 바꾸시겠습니까? VT100으로 정의 된 터미널 창에서 색상을 변경하는 데 사용할 수있는 몇 가지 기술이 있습니다 (또한 색상 이스케이프 시퀀스를 지원하는 수십 가지 다른 정의가 있습니다). 더 구체적인 사항을 부탁드립니다. 또는 en.wikipedia.org/wiki/VT100 및 관련 링크를 읽으십시오 . 도움이 될 수 있습니다.
shellter 2011 년

나는 당신이 오픈 소스 도구와 터미널에만 관심이 있다는 것을 알고 있습니다. 그러나 참조 점으로 slickedit의 diffzilla를보고 싶을 수 있습니다. 내가 사용한 몇 가지 diff 도구 중 항상 문자 차이를 가장 잘 나타내는 것처럼 보였습니다 (하지만 diff가 복잡한 곳 (포맷과 코드 변경의 조합, 항상 나쁜 생각 임)
nhed


참고 : GitHub는 이제 웹 GUI에서 다음과 같은 diff 도구를 제공합니다. stackoverflow.com/a/25723584/6309
VonC 2014 년

나는 쉽게 1) 관련 diff-highlight 파일을 찾고, 2) 실행 가능하게 만들기 위해 3) .gitconfig에 필요한 매개 변수를 설정하기 위해 튜토리얼과 함께 '아직 다른'순수 git, diff-highlight 기반 솔루션을 게시했습니다. 한번 봐주세요. 지침은 Ubuntu 18.04 용이지만 Linux 시스템에서 광범위하게 작동합니다.
Zorglub29

답변:


59

diff-highlight펄있는 contrib 스크립트는 이 가능성 Trac에 그것을 사용하고 있다는 Trac의 스크린 샷과 유사하므로 출력을 생성합니다 :

여기에 이미지 설명 입력

다음으로 설치 :

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

파일 diff-highlight~/bin/디렉토리 (또는 어디에 있든) 로 이동 한 $PATH후 다음을 추가하십시오 ~/.gitconfig.

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

@cirosantilli가 제안한 단일 복사 붙여 넣기 설치 :

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

이. 이것은 훌륭합니다. 감사합니다. 그러나 일부 지역에서는 약간 보수적 인 것처럼 보이며 분명히 대부분의 텍스트가 공통된 일부 줄이 누락되었습니다. 버그 추적기가 있습니까?
naught101

21
아,이 핵심 자식의 부분은 지금 : github.com/git/git/tree/master/contrib/diff-highlight
naught101

2
그것은 지금 모듈로 전환하고,에 그 변경 전의 바로 하나에서 나는 다운로드 가장 쉬운 버전을 생각하고 있어요 raw.githubusercontent.com/git/git/...이
크리스 Midgley을

4
이 부분은 핵심 git의 일부일뿐만 아니라 git과 함께 배포되며 아마도 이미 시스템에있을 것입니다. 아래 답변에 활성화 방법에 대한 세부 정보를 추가했습니다. ↓
Cory Klein

2
이것은 당신이 통해 보는 diff를 놓친다 git add -p. 또한 추가하십시오 :git config --global interactive.diffFilter diff-highlight
josch

40

git diff또는 git log다른 것을 사용하는 동안 옵션을 사용하십시오 --word-diff=color(단어 차이 BTW에 대한 다른 모드도 있음)


2
--word-diff=color더 나은 (특히와 정말 git config color.diff.old "red reverse"하고 git config color.diff.new "green reverse")하지만, 내가 :( 원하는 것이 아니다
니콜라이 Frantsev

4
그래서 당신이 놓친 유일한 것은 색상으로 표시하는 것입니다 / 어떻게 든 변경된 줄과 바이트를 동시에?
anydot 2011 년

7
Trac에서와 같이 변경된 각 행에서 변경된 행과 변경된 바이트를 강조 표시하고 싶습니다. 변경된 바이트뿐만 아니라 동일하지 않습니다.
Nikolay Frantsev 2011 년

다음과 함께 사용할 수도 있습니다 git add --patch. stackoverflow.com/questions/10873882/…
naught101

의 장점은 diff-highlight단어 차이와 선 차이 모두에서 잘 작동한다는 것입니다.
치로 틸리는郝海东冠状病六四事件法轮功

21

diff-so-fancyA는 diff인간의 시선을 위해 설계 -highlighter.

잘라 내기 / 붙여 넣기에 짜증나 는 선행 +/ -를 제거하고 파일 사이에 명확한 섹션을 만듭니다.

컬러 git(왼쪽) 대 diff-so-fancy(오른쪽-캐릭터 레벨 하이라이트에 유의) :

diff-so-fancy 출력

당신이 원하는 경우 diff-so-fancy(오른쪽) 출력을하지만에있는 파일에 제한되지 git저장소, 당신에 다음 함수를 추가 .bashrc모든 파일에 그것을 사용하기 :

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

예 :

dsf original changed-file

문자 수준 강조 및 표준 diff형식

당신의 비 표준 포맷 마음에 들지 않으면 diff-so-fancy여전히 있지만, 캐릭터 레벨을 원하는 git사용 강조 diff-highlight소요됩니다 git의 출력과 정말 꽤 표준 생산 diff-format 출력 :

diff-highlight 스크린 샷

에서 기본적으로 사용하려면 다음을 git추가하십시오 .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

[pager]섹션은 git이미 채색 된 출력을 diff-highlight문자 수준에서 채색 한 다음 기본을 사용하는 대신 (필요한 경우) 더 적은 페이지로 출력하도록 지시 합니다 less.


이것은 매우 흥미 롭습니다. 이러한 gitconfig옵션 에 대해 조금 설명해 주 시겠습니까?
caesarsol

업데이트되었으며 기능도 추가되었습니다 dsf().
Tom Hale

15

원하는 동작은 이제 git 자체에서 사용할 수 있습니다 (naught101의 주석에서 지적했듯이). 이를 활성화하려면 호출기를 다음으로 설정해야합니다.

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

/usr/share/doc/git/contrib/diff-highlight/diff-highlightUbuntu 13.10에서 형광펜 스크립트의 위치는 어디에 있습니까 (왜 doc폴더 에 있는지 모르겠습니다 ). 시스템에 없으면를 사용 locate diff-highlight하여 찾으십시오. 강조 표시 스크립트는 실행 가능하지 않으므로 (적어도 내 컴퓨터에서) perl.

다양한 diff와 유사한 명령에 항상 형광펜을 사용하려면 ~/.gitconfig파일에 다음을 추가 하십시오.

[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

나는 이것을 새로운 대답으로 추가했습니다 .naught101의 코멘트가 묻혀 있고 설정이 그렇게 사소하지 않고 적어도 우분투 버전에서는 README 의 지침이 작동하지 않기 때문입니다.


나는 이것이 git add -p(대화 형 모드) 내에서 diff에 대한 강조 표시를 활성화하지 않는다는 것을 알았습니다 . 그래도 어떻게 고칠 수 있는지 모르겠지만 단순히 목록에 추가를 추가하면 중단됩니다.
dshepherd

5
이제 git 2.9.0에서 작동합니다.git config interactive.diffFilter diff-highlight
Thomas

^ 이것! 불행히도 diff-highlight내 길에 있지 않았기 때문에 먼저 찾아야했습니다. 아래 내 대답의 세부 사항.
Cory Klein

11

바이트 기반 diff를위한 유틸리티는 v1.7.8 1 이후 공식 Git과 함께 배포되었습니다 . 컴퓨터에서 설치된 위치를 찾아 활성화하면됩니다.

Git이 설치된 위치 찾기

  • Homebrew 를 통해 Git이 설치된 MacOS :/usr/local/opt/git
  • Windows 용 Git이있는 Windows : 실행 cd / && pwd -W하여 설치 디렉토리를 찾습니다.
  • Linux : 대단합니다. 힘내가 설치된 위치를 당신이 이미 알고하지 않으면, ll $(which git)또는 locate git도움이 될 것입니다.

diff-highlightPATH에서 찾을 수 있도록 bin 디렉토리에 링크 하십시오.

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 구성에서 활성화

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 여기 v1.7.8 버전 이 있지만 그 이후로 많은 변경 이 이루어졌습니다.


1
git과 함께 배포되기 시작한 버전을 지정하는 것이 좋습니다. 또한 배포판이 기본적으로 PATH에 넣을 것이라고 생각하므로 심볼릭 링크 단계가 필요하지 않습니까? 그리고 which git처음부터 PATH에 있어야하므로 그렇지 않으면 작동하지 않습니다. :-)
Ciro Santilli 郝海东 冠状 病 六四 事件

2
좋을거야! 해당 정보를 자유롭게 추가하십시오. Git은 번들을 제공하지만 diff-highlight실제로 설치 하지는 않으므로 심볼릭 링크 단계가 실제로 필요합니다 (최소한 macOS에서는). 플랫폼에 필요하지 않다고 생각되면 다시 자유롭게 답변을 업데이트하십시오. 한편 which gitGit git 경로 어딘가에 바이너리를 설치 하기 때문에 일반적으로 작동 합니다.
Cory Klein

데비안 불안정 상태에서는이 파일을 "컴파일"해야했습니다 .perl.. 컴파일은 간단합니다. 디렉토리 sudo make에서 실행 하면 diff-highlight됩니다.
tobiasBora

10

나는 --color-words옵션을 사용 하고 그것은 나를 위해 잘 작동합니다.

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

5
아니요, 이것은 단어의 차이 보여줍니다. OP (및 I)가 원하는 것은 단어 차이가 강조 표시된 일반 라인 별 차이입니다 (따라서 다른 라인은 컬러 텍스트이고 해당 라인 내의 단어 차이는 컬러 하이라이트 또는 어떤 것). 지금 질문에서 예제 링크를 참조하십시오.
naught101

1
pastebin.com/1JrhYHRt 실제로 vimdiff를 difftool로 사용하고 vimdiff를 molokai colorscheme과 함께 사용하여 질문에서 설명하는대로 멋진 강조 표시를 얻습니다. 1- git config --global diff.tool vimdiff 2- in vim ": colo molokai"* Molokai @ github.com/tomasr/molokai * ~ / .vimrc로 가능한 자동 색상 표 : if & diff set background = dark colorscheme molokai endif
amized

4

같은 @dshepherd는 말합니다 :

이제 원하는 동작을 git 자체에서 사용할 수 있습니다.

그러나 diff-highlightDOC에 있으며 셸에서 사용할 수 없습니다.
설치하려면 diff-highlight사용자로 ~/bin디렉토리하여 다음 단계를 (이것은 당신의 입력을 저장합니다)에 따라 :

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

그런 다음 .gitconfig공식 문서로 구성하십시오 .

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

UPD
또한 git설치하지 않고 최신 버전에서 다음을 시도 할 수 있습니다 .

git diff --color-words=.

더 복잡한:

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

1

Emacs에는 사용자의 요구를 충족시킬 ediff-patch-buffer 기능이 있습니다.

emacs 유형 ESC-x, ediff-patch-buffer에서 패치되지 않은 파일을 엽니 다.

프롬프트에 따라 패치 된 파일과 원본 버전의 비교를 강조 표시해야합니다.

귀하의 의견에 따라 다음은 dwdiff 만 필요한 bash 솔루션을 제공합니다.

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

미안 해요, 내가 사용 이맥스 만 bash는, 자식이나 정력에 싶지 않아
니콜라이 Frantsev

이해가 되네요. 내가 생각할 수있는 유일한 다른 점은 패치에서 표준 출력으로 colordiff을 사용하는 것입니다 colordiff -u <(patch original_file -i patch_file -o -) <(cat original_file) 하지만 이것은 단지 변경 라인하지 물기를 강조하는 것입니다 ...
핀바 Crago

나는 당신의 문제를 조금 더 생각하고 dwdiff 만 필요한 두 번째 솔루션을 추가했습니다.
Finbar Crago 2011 년

1
조심스럽게 내 질문을 읽어 보시기 바랍니다, 나는 파일을 비교하고 싶지 않아요
니콜라이 Frantsev에게

1
혼란을 드려 죄송합니다. diff 파일의 변경된 행에서 변경된 바이트를 강조 표시하는 방법이 얼마 남지 않았습니다. 그렇다면 시도dwdiff -c --diff-input diff_file
핀바 Crago

1

디피

GitLab은 Diffy https://github.com/samg/diffy(Ruby )를 사용하여 GitHub 및 diff-highlight와 유사한 출력을 얻습니다.

여기에 이미지 설명 입력

Diffy는 동일한 알고리즘 광고 Git을 사용하여 diff 자체를 만들고 GitLab에서 사용하는 HTML 출력을 포함하여 다양한 유형의 출력을 지원합니다.

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

산출:

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

strong변경된 바이트에 어떻게 추가 되었는지 확인하십시오 .


0

예, Vim은 한 줄 내에서 변경된 텍스트 강조 표시를 포함하여이 작업을 수행합니다.
참조 :h diff:h 08.7방법은 diff로 파일에 대한 자세한 내용은.

Vim은 하이라이트를 위해 상당히 간단한 알고리즘을 사용합니다. 줄에서 첫 번째로 변경된 문자를 검색 한 다음 마지막으로 변경된 문자를 검색하고 그 사이의 모든 문자를 강조 표시합니다.
즉, 라인 당 여러 개의 하이라이트를 가질 수 없습니다. Vim의 많은 디자인 결정은 효율성을 우선시합니다.


불행히도 diff 출력에서 ​​변경된 바이트를 강조 표시하지 않습니다 (set filetype = diff)
Nikolay Frantsev 2011 년

1
나는 지금 귀하의 질문을 이해했다고 생각합니다. diff 명령의 텍스트 출력을 구문 강조 표시하여 행 내부의 변경 사항을 강조 표시하고 싶습니다. Vim에서이 텍스트를 편집하면 줄 차이가 강조 표시되지만 한 줄 내에서 변경된 내용은 표시되지 않습니다.
PDug

Vim의 : patchfile 명령을 사용하여 원본 파일을로드 한 다음 패치 된 버전과 비교할 수 있습니까?
PDug

불행히도 아니오, 여러 파일에 대해 재귀 diff 출력을 사용하고 싶습니다
Nikolay Frantsev 2011 년

0

vimdiff file1 file2 두 파일 간의 차이를 문자별로 표시합니다.

vimdiff는 vim에 포함 된 diff 도구입니다. (Vim은 + diff 옵션으로 컴파일되어 있어야 확인할 수 있습니다 :version)

vim 내부에서 실행할 수도 있습니다. 자세한 :help diff정보 및 명령은를 참조하십시오 .


파일을 비교하고 싶지 않고 diff (패치) 파일을 강조 표시하고 싶습니다.
Nikolay Frantsev 2011 년

@Nikolay Frantsev 성능에 신경 쓰지 않는다면, 내 format.vim 플러그인을 설치 하고 vimdiff file.old file.new -c 'FormatCommand diffformat' -c 'w! file.diff.html' -c 'qa!'.
ZyX 2011 년

배치 모드 (앞에 추가 screen -D -m또는 추가 &>/dev/null(/ dev / null 변형은 때때로 이상한 버그를 생성 함) 에서 diff 를 수행하고 포맷이 완료된 후 vim을 종료합니다. 내 최적화에도 불구하고 대용량 파일의 경우 매우 느립니다.
ZyX 2011 년

0

참고 : 이것은 여기에있는 내용의 중복입니다 : git의 diff 강조 표시를 개선하는 방법? . 이 스레드를 직접 찾는 일부 사람들에게 도움이 될 수 있으므로 여기에도 내 대답을 게시하십시오. :)

이전 답변에서 말했듯이 이것은 git에서만 가능합니다. 시스템에 따라 지침을 따르기가 더 쉬울 수 있으므로 이것을 게시하지만 다른 여러 답변과 유사합니다.

순전히 git과 그 기여에 의존하는 하나의 솔루션입니다. 이것은 git 과 함께 제공되는 것 외에 추가 파일이 필요하지 않습니다 . 모든 설명은 Ubuntu (18.04LTS에서 테스트 됨)에 대한 것이며 다른 Linux 시스템에서도 유사하게 작동해야합니다.

  • diff-highlight contrib git 스 니펫을 찾습니다.
find -L /usr -name diff-highlight -type f

내 시스템에서 유효한 대답은 다음과 같습니다.

/usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • 해당하는 perl 스크립트를 실행 가능하게 만드십시오. 제 경우에는 다음을 수행해야했습니다.
sudo chmod +x /usr/share/doc/git/contrib/diff-highlight/diff-highlight
  • 다음 ~/.gitconfig을 추가하여 원하는 결과를 얻으려면 업데이트하십시오 (공백 4 개가 아니라 TABS 임).
[color "diff-highlight"]
    oldNormal = red
    oldHighlight = red 52
    newNormal = green
    newHighlight = green 22
  • 결과를 즐기십시오 (참고 : 이것은 diff 컬러링 + 하이라이트에만 해당됩니다. 물론 프롬프트를 위해 여기에도 다른 기능이 있습니다. :)).

diff-highligh

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