diff를 git-diff처럼 작동시키는 방법?


148

의 출력 형식이 마음에 듭니다 git diff. 색상 및 +/ -선 사이의 변화의 표현은 GNU은 diff보다 쉽게 읽을 수 있습니다.

git repo 외부에서 플래그를 git diff사용하여 실행할 수 있으며 --no-index정상적으로 작동합니다. 그러나 --exclude재귀에서 파일이나 하위 디렉터리를 제외 하는 옵션 이없는 것으로 보입니다 diff.

두 세계를 모두 활용할 수있는 방법이 있습니까? ( GNU diff 의 색상 옵션 및 +/ -형식 git diff--exclude옵션).

나는 실험을 colordiff했지만 여전히 출력 형식을 선호합니다.git diff


1
녹색 추가, 변경에 대한 파란색 만들려면 newtext의를 /etc/colordiff. git이 녹색을 사용한다고 생각합니까?
Rudie

1
지금까지 --no-index 플래그에 대해 들어 본 적이 없습니다. 방금 git show의 출력을 두 파일의 diff와 비교하는 데 사용했습니다. 감사합니다!
AJM-Reinstate-Monica

답변:


175

나는 색상을 수행하는 방법을 모르지만 이것은 과 +/-대신에 할 것 입니다.<>

diff -u file1 file2

6
쿨, 이것은 colordiff와 결합하여 내가 원하는 것에 가깝게 만듭니다. 다음에 맨 페이지를 아래로 스크롤해야한다고 생각합니다 ... 감사합니다!
Mzzzzzz

13
diff -u를 사용하여 색상을 얻는 간단한 방법은 출력을 명령 줄 git repo viewer tig로 파이프하는 것 diff -u file1 file2 | tig입니다.
Samuel Lampa

3
colordiffapt / yum / pacman 저장소에서 설치 하여 사용하십시오.
iBug

설치 아마존 리눅스 엔터프라이즈 리눅스 (EPEL)에 대한 추가 패키지를 사용하는 데 필요한 colordiff: docs.aws.amazon.com/AWSEC2/latest/UserGuide/...
팻 마이런

1
게다가 colordiff, 당신은 또한 vim정의 하여 색상을 얻을 수 있습니다 cdiff() { diff -u $@ | vim -R -; }.
Syrtis Major

94

맨 페이지git diff --no-index -- A B 를 통해 사용할 수도 있습니다 .


1
+1이지만 슬프게도 파일 중 하나가 심볼릭 링크 인 경우 작동하지 않습니다.
Emil Lundberg

2
+1 이것은 두 개의 추적 파일이있는 곳에서 git 보고서를 작성하는 방법 A과 각 파일이 각각의 마지막 수정본에 대해 수정 된 위치 대신 서로B 비교 되는 방법을 보여 주므로 매우 유용합니다 .
J. Katzwinkel

@ EmilLundberg : Linux의 git 1.9.1에서 symlink와 함께 작동합니다. 이전 버전이 손상되었는지 여부를 모르겠습니다.
kkm

3
git diff --no-indexOP는 훌륭하지만 --exclude플래그 가 부족하기 때문에 유용성이 매우 제한적인 경우가 많습니다.
Ken Williams

25
  1. colordiff를 설치하십시오 .

  2. ~ / .colordiffrc를 업데이트하십시오 (필요한 경우 먼저 / etc / colordiffrc 복사).

    # be more git-like:
    plain=off
    newtext=darkgreen
    oldtext=darkred
    diffstuff=darkcyan
    
  3. colordiff -u file1 file2두 파일에 사용 하거나 colordiff -ruN path1 path2경로를 재귀 적으로 비교하는 데 사용하십시오 .

정확히 동일하지는 않지만 매우 가깝습니다.


18

이것은 내가 제안하는 것이고 꽤 가깝습니다.

diff -u FILE1 FILE2 | colordiff | less -R
  • colordiff: 이것을 설치해야합니다
    • brew install colordiff 내 Mac에서.
    • port install colordiff 일부 Mac에서는.
    • sudo apt-get install colordiff 데비안 또는 우분투에서
    • 다른 플랫폼의 경우 메인 페이지 또는 GitHub 에서 소스를 다운로드 하고 설치 지침을 따르십시오
  • -R: 이것은 원시 코드 대신 색상을 표시하도록 Less에 지시합니다.

나는 궁극적으로 사용 -w 공백의 차이를보고 싶지 않기 때문에 .

diff -w -u FILE1 FILE2 | colordiff | less -R

편집 : 의견에서 @Ciprian Tomoiaga가 제안한 것처럼이 기능을 만들어 ~/.bashrc파일에 넣을 수도 있습니다.

function gdiff () { diff -u $@ | colordiff | less -R; }

4
이를 위해 단일 bash 기능을 사용하려면 .bashrc에 다음을 추가하십시오.function gdiff () { diff -u $@ | colordiff | less -R; }
Ciprian Tomoiagă

4

Unix SE에 대한 이 답변 에 따르면 GNU diff--color2016 년 말 버전 3.4 이후 의 옵션을 가지고 있습니다. 그와 함께 다음의 출력을 모방하기에 충분해야합니다 .-ugit diff

diff -u --color=always file1 file2 | less -r

--color 이어야한다 always 파이프에 사용하는 경우, auto파이프의 색상이 꺼집니다.

나는 Windows에서 Git Bash로만 시도했지만 less -R, 덩어리의 첫 번째 줄만 채색합니다. less -r이 경우 나를 위해 고쳤습니다.


3

만을 사용하여 bash, diff, tput, 그리고 less, 우리가 밀접의 출력에 근접 할 수 있습니다 git diff. 그러나 근시로 인해 눈에 띄는 차이점이 있습니다.diff 프로그래머의 .

사용자 계정이 자동으로 제공하는 일부 파일에 다음 Bash 함수 정의를 넣으면 명령 줄에서 함수에 액세스 할 수 있습니다.

function gdiff()
{
    local REG=`tput op`
    local GRP=`tput setaf 6`
    local ADD=`tput setaf 2`
    local REM=`tput setaf 1`

    local NL=$'\n'
    local GRP_LABEL="${GRP}@@ %df,%dn +%dF,%dN @@${REG}"

    local UNCH_GRP_FMT=''

    [[ "${1}" == '@full' ]] && {

        UNCH_GRP_FMT="${GRP_LABEL}${NL}%="
        shift
    }

    diff \
        --new-line-format="${ADD}+%L${REG}" \
        --old-line-format="${REM}-%L${REG}" \
        --unchanged-line-format=" %L${REG}" \
        --new-group-format="${GRP_LABEL}${NL}%>" \
        --old-group-format="${GRP_LABEL}${NL}%<" \
        --changed-group-format="${GRP_LABEL}${NL}%<%>" \
        --unchanged-group-format="${UNCH_GRP_FMT}" \
            "${@}" | less -FXR
}

이 기능은 다음과 같이 작동합니다.

  1. 궁극적으로 diff 으로 다양한 서식 옵션을 사용하여 파일 내 변경 내용이 표시되는 방법을 지정합니다.
  2. tput이러한 형식화 옵션에 ANSI 색상 코드를 삽입하는 데 사용됩니다. ANSI 이외의 터미널을 사용하는 경우 다음 tput setaf과 같이 교체해야 할 수도 있습니다.tput setf .
  3. 의 출력은 diff로 파이프됩니다 less. -RANSI 색상을 유지합니다. 종료시 화면을 지우는 -X것을 방지합니다 less. -F방지less출력이 한 화면에 맞으면 호출기로 작동 .
  4. 첫 번째 매개 변수가 @full인 경우이 함수는 추가 및 제거 된 행 외에 변경되지 않은 모든 행을 표시합니다.

이 방법과 다음의 차이점을 참고하십시오 git diff.

  1. git diff각 변경 사항을 둘러싼 세 줄의 컨텍스트를보고합니다. 불행히도, diff컨텍스트 라인 수를 지정하고 동시에 서식 옵션을 지정하려는 경우 불평하고 종료하는 것처럼 보입니다. (적어도 Mac OS X Yosemite에서는 그렇습니다). diff프로그래머 감사 합니다. 따라서 각 변경을 둘러싼 컨텍스트 행 (기본 동작)을 요청하지 않거나 파일 내에서 변경되지 않은 모든 행도보고하도록 요청할 수 있습니다.@full 첫 번째 매개 변수로 .
  2. 상황에 git diff맞는 행이와 다르므로이 함수에 의해보고되는 행 번호는git diff .
  3. 단일 행 변경 사항이보고 될 수 있습니다. 이는 올바른 동작이지만 변경된 파일에 빈 줄이 하나라도 포함되어 있으면 성가신 일입니다. 나는 git diff문맥을 통해 이것을 더 잘 처리 한다고 생각 합니다. 원하는 diff경우 공백을 더 잘 처리 하기 위해 다른 옵션을 전달할 수 있습니다 .


2

당신의 .bashrc또는에 배치 .zshrc:

diff() { git diff --no-index "$1" "$2" | colordiff; }

한 요구 사항 : gitcolordiff전에 직접 설치해야합니다.

사용법 : diff file1 file2

예 : $diff .tmux.conf .zshrc.pre-oh-my-zsh

diff 함수 예제


0

다른 옵션은 리포지토리 외부에서 수행하여 git이 파일을 구분하는 것을 알 수 있습니다. 예. 쉘 함수는 다음과 같습니다.

gdiff() {
    (
        dir=`pwd`
        cd ./$(git rev-parse --show-cdup)/..
        git diff  $dir/$1 $dir/$2
    )
}

0

colordiff 사용 :

설치:

sudo apt-get install colordiff

용법:

colordiff -u file_one file_two

로 표시된 것과 정확히 동일한 차이를 제공합니다 git diff.


0

colordiff또는 이 없으면 git diff색상을 얻을 수 있습니다 vim.

cdiff() { diff -u $@ | vim -R -; }

또는 단순히

cdiff() { diff -u $@ | view -; }

0

박쥐 는 좋은 착색 기능을 가지고 있기 때문에 , 그것이 작동하는지 diff놀랍게도 실제로 상자 밖으로 잘 작동하는지 테스트 했습니다.

$ diff file1 file2 | bat 또는 $ diff -u file1 file2 | bat

따라서 다음과 같은 기능을보다 효율적으로 만들 수 있다고 가정합니다.

function bdiff () { diff -u $@ | bat;}


-2

구성 설정이 생각합니다.

[color]
     ui = true

"diff"명령의 --relative=<path>옵션 과 결합하여 원하는 것을 수행 할 수 있습니다. 시도해 보았 니 ?


3
이것은 diff에 대한 것입니다 git. 그는 diff프로그램 옵션 을 요구했다
tr33hous
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.