Git 내부에서 Winmerge를 사용하여 파일 비교


답변:


113

6 년 후인 2015 년 6 월 업데이트 :

" git mergetool winmerge " 에서 자세히 설명했듯이 간단한 git config diff.tool winmerge것으로 충분합니다.

Git 2.5+ (2015 년 2 분기)는 이제 Winmerge를 diff 또는 merge 도구로 인식합니다!


원문 답변 (2009-2012)

(msysgit, 1.6.5, DOS 세션)

첫 번째 부분 (winmerge 사용)은 " visual diff 프로그램으로 'git diff'출력을 보는 방법은 무엇입니까? "에 설명되어 있습니다.

C:\myGitRepo>git config --replace --global diff.tool winmerge
C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --replace --global difftool.prompt false

으로 winmerge.sh당신의 디렉토리 부분에 저장 PATH:

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -u -dl "Local" -dr "Remote" "$1" "$2"

( WinMerge 명령 줄 옵션 참조 )

git difftool

이제 WinMerge가 시작됩니다. WinMerge를 시작
하려면 다음을 git diff설정하십시오.

set GIT_EXTERNAL_DIFF=winmerge.sh

그러나 진정한 부가가치는 동일한 diff 도구를 사용하여 모든 차이점을 순차적으로 표시하는 대신 한 배치 로 표시 하는 기능에서 비롯됩니다. 따라서 diff 도구 창을 한 번에 하나씩 닫아야합니다.

2012 년 6 월 업데이트 (2 년 반 후) :

파일 별 대신 디렉토리를 비교하는 것은 곧 사용할 수있을 것입니다 :
참조가 망할 놈의 1.7.11.rc1을 [ANNOUNCE] :

" git difftool" 는 파일 쌍당 한 번 외부 도구 인스턴스를 실행하는 대신 두 개의 임시 디렉토리를 채운 후 한 번에 두 개의 디렉토리 계층 구조비교할--dir-diff 수있는 외부 비교 도구를 생성 하는 " "옵션을 배웠습니다 .

자세한 내용은 " Patch difftool: difftool디렉토리 차이를 처리하도록 가르치기 "및 " Git 분기의 디렉토리 비교 "답변 을 참조하십시오.


디렉토리 스크립트 별 원본 difftool (2009 년 12 월)

으로 스바 Illingworth가 에 언급 그의 대답 , 스크립트 git-diffall.sh (또한 경로에 넣어) 그냥 할 수 있습니다 :

#!/bin/sh
git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename" &
done

그러나 그것은 n 개의 파일에 대해 n 개의 창을 열 때만 작동 합니다 ( WinMerge 옵션 을 사용하려고 하면 difftool에 의해 너무 일찍 삭제되는 임시 파일 때문에 작동하지 않습니다)-s


그렇기 때문에 GitDiff.bat-power-diffing with GI 접근 방식을 좋아합니다.이 방식 을 사용하면 내부 차이점을 검사하기 위해 하나를 선택하기 전에 차이점이있는 파일 목록을 검토 할 수 있습니다.
DOS 명령 만 사용하도록 조정했습니다.

@echo off

setlocal

if "%1" == "-?" (
    echo GitDiff - enables diffing of file lists, instead of having to serially
    echo diff files without being able to go back to a previous file.
    echo Command-line options are passed through to git diff.
    echo If GIT_FOLDER_DIFF is set, it is used to diff the file lists. Default is windff.
    goto END
)

if "%GIT_DIFF_COPY_FILES%"=="" (
    rd /s /q %TEMP%\GitDiff
    mkdir %TEMP%\GitDiff
    mkdir %TEMP%\GitDiff\old
    mkdir %TEMP%\GitDiff\new

    REM This batch file will be called by git diff. This env var indicates whether it is
    REM being called directly, or inside git diff
    set GIT_DIFF_COPY_FILES=1

    set GIT_DIFF_OLD_FILES=%TEMP%\GitDiff\old
    set GIT_DIFF_NEW_FILES=%TEMP%\GitDiff\new

    set GIT_EXTERNAL_DIFF=%~dp0\GitDiff.bat
    echo Please wait and press q when you see "(END)" printed in reverse color...
    call git diff %*

    if defined GIT_FOLDER_DIFF (
        REM This command using GIT_FOLDER_DIFF just does not work for some reason.
        %GIT_FOLDER_DIFF% %TEMP%\GitDiff\old %TEMP%\GitDiff\new
        goto END
    )

    if exist "%ProgramFiles%\Beyond Compare 2\BC2.exe" (
        set GIT_FOLDER_DIFF="%ProgramFiles%\Beyond Compare 2\BC2.exe"
        "%ProgramFiles%\Beyond Compare 2\BC2.exe" %TEMP%\GitDiff\old %TEMP%\GitDiff\new
        goto END
    )

    "%ProgramFiles(x86)%\WinMerge\WinMergeU.exe" -r -e -dl "Local" -dr "Remote"  %TEMP%\GitDiff\old %TEMP%\GitDiff\new
    goto END
)

REM diff is called by git with 7 parameters:
REM     path old-file old-hex old-mode new-file new-hex new-mode
copy %TEMP%\%~nx2 %GIT_DIFF_OLD_FILES%\%1
copy %5 %GIT_DIFF_NEW_FILES%

:END

서로 다른 디렉토리에서 동일한 이름을 가진 파일을 처리 할만큼 강력하지는 않지만 가능한 일에 대한 일반적인 아이디어를 제공합니다.
여기서 내부 차이점이있는 파일 목록과 함께 하나의 WinMerge 만 열립니다. 검사하려는 항목을 클릭 ESC하면 모든 WinMerge-diff세션 이 종료됩니다 .


1
git 버전 1.6.5.1.1367.gcd48로 이것을 시도하면 해당 임시 폴더에 파일을 생성하지 않는 것 같습니다. 문제를 찾을 수있는 곳이 있습니까? 감사!
Art

@Art :이 디버그의 경우 스크립트를 단순화하여 문제를 분리하려고합니다. 1 / 스크립트가 7 매개 변수 (파일을 복사하기 위해 git diff의 첫 번째 패스)로 호출 된 경우 2 / 적어도 콜백 된 스크립트입니다. 끝에 git diff?
VonC

1
@Erik : 옵션과 관련하여 WinMerge FAQ를-ub 참조하십시오. 다음과 같습니다. WinMerge에 MRU에 파일을 추가하지 않도록 지시합니다. -u
VonC

1
@Erik : ' '가 아닌 c:\Temp\GitDiff\old및 의 파일 비교를 확인해야합니다 . bash 세션이 아닌 DOS 세션에서이 DOS 프로그램을 실행하고 있습니까? c:\Temp\GitDiff\new/tmp
VonC

1
@coffeemakr ""제 경우에는 평가하지 않았습니다 ( git configWindows CMD에서 명령을 실행합니다 .하지만 당신이 옳습니다 : ""bash 쉘에서 실행되면 평가됩니다 .
VonC

19

첫 번째 부분을 2 개소에서 사용하는데 어려움을 겪었고 다음과 같이 수정했습니다.

  1. winmerge.cmd를 설정하는 두 번째 명령은 cmdline ($ LOCAL 및 $ REMOTE 앞에)에 추가 슬래시가 필요했습니다. 그렇지 않으면 cygwin이 cmdline에서 변수를 대체했습니다.

    C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
    
  2. winmerge.sh 파일을 다음과 같이 변경했습니다 (이 없이는 오른쪽 경로 잘못된 오류가 발생했습니다).

    #!/bin/sh
    echo Launching WinMergeU.exe: "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
    "$PROGRAMFILES/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$(cygpath -aw "$1")" "$(cygpath -aw "$2")"
    

3
VonC가 지시 한대로 정확히 수행했지만 winmerge.sh 스크립트에서 빈 인수를 받았습니다. 추가 슬래시를 사용하면 문제가 해결되었습니다. 감사합니다!
ashagi 2011

6

스레드가 혼란스럽고 분기되기 때문에 msysgit Git Windows 용 디렉토리 목록 "--dir-diff"WinMerge 메소드에 대한 통합 지침이 있습니다.

1 단계 -경로에 액세스 할 수있는 위치 (예 : /home/bin/winmerge.sh)에 다음 내용으로 winmerge.sh라는 파일을 만듭니다.

#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"$PROGRAMFILES/WinMerge/WinMergeU.exe" -r -ub -dl "Remote" -dr "Local" "$1" "$2"

2 단계 -Git Bash에 다음 명령을 입력하여 git이 winmerge.sh를 difftool로 사용하도록 지시합니다 (이 옵션은 /home/.gitconfig에 저장 됨).

git config --replace --global diff.tool winmerge
git config --replace --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
git config --replace --global difftool.prompt false

3 단계 -이제 Git Bash에 다음 명령을 입력하여 WinMerge diff를 시작하여 테스트 할 수 있습니다.

git difftool --dir-diff

4 단계 -더 빠른 액세스를 위해이 줄을 홈 폴더의 .bashrc에 추가하여이 명령의 별칭을 만듭니다 (또는 파일이 아직없는 경우이 줄로 .bashrc 파일을 만듭니다).

alias diffdir='git difftool --dir-diff'

5 단계 -이제 Git Bash에 다음 명령을 입력하여 WinMerge에서 diff를 빠르게 확인할 수 있습니다.

diffdir

누군가에게 $LOCAL및 의 의미를 설명하는 것이 도움이 될 것 $REMOTE입니다.
Tola Odejayi

6

별도의 .sh 파일이 필요하지 않은 적절한 매개 변수를 사용하여 Git 구성에 Diff 및 Merge 도구를 설정하는 스크립트가 있습니다. 나를 위해 잘 작동하는 것 같습니다.

git config --global diff.tool winmerge
git config --global difftool.prompt false
git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""

git config --global merge.tool winmerge
git config --global mergetool.prompt false
git config --global mergetool.winmerge.trustExitCode true
git config --global mergetool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\" \"\$BASE\" \"\$MERGED\""

참고 -전체 .cmd 부분이 인용되어 매개 변수가 .gitconfig에 올바르게 나열됩니다.


1
다음 명령이 작동하지 않았습니다. git config --global difftool.winmerge.cmd "\"\$PROGRAMFILES\"/WinMerge/WinMergeU.exe -r -u -e -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\"" 참고 :이 명령은 powershell이 ​​아닌 명령 프롬프트에서 실행해야합니다. 내 .gitconfig [difftool "winmerge"]섹션에 다음을 수동으로 추가하면 효과 cmd = 'C:/Program Files (x86)/WinMerge/WinMergeU.exe' -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\"
Josh

1
작동하지 않았지만 약간 변경하면 작동합니다. 관리자 권한으로 cmd를 열고 다음을 실행 git config --global mergetool.winmerge.cmd "\"C:\Program Files (x86)\WinMerge\WinMergeU.exe\" -r -u -e -dl \"Local\" -dr \"Remote\" \"$LOCAL\" \"$REMOTE\" \"$BASE\" \"$MERGED\""합니다.. 잘못된 이스케이프 문자열이 몇 개있었습니다 (이스케이프 할 필요가없는 $것 같습니다 $). 또한, 최종 없어진 "후를 WinMergeU?.exe. git config --get mergetool.winmerge.cmd실제로 무엇이 설정되었는지 확인하기 위해 실행 하십시오. 어쨌든, 비 .sh버전 감사합니다 : +1!
falsarella 2015 년

5

Windows에서는 다음과 같이 할 수 있습니다.

1) .gitconfig 파일을 엽니 다. 홈 디렉토리에 있습니다 : c : \ users \ username.gitconfig

2) 아래 줄을 추가하십시오. winmerge 경로를 감싸는 작은 따옴표에주의하십시오.

[diff]
    tool = winmerge
[difftool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" -e "$LOCAL" "$REMOTE"
[difftool]
    prompt = false
[merge]
    tool = winmerge
[mergetool "winmerge"]
    cmd = "'C:/Program Files (x86)/WinMerge/WinMergeU.exe'" \"$MERGED\" \"$REMOTE\"
[mergetool]
    keepBackup = false
    trustExitCode = false

또한주의를 기울여야 앞으로 대신 명령 경로에서 백 슬래시 슬래시.
wisbucky

5

구성 없음 :

git difftool --tool winmerge

가정 :

  • Winmerge가 설치되었습니다.
  • Windows 용 Git은 "git version 2.12.0.windows1"이상에서 설치됩니다 (이전 버전의 git에서 명령을 도입했을 수 있음).

감사합니다. 이것이 가장 간단한 해결책입니다
code4j

2

Git 설치에 bash 셸이 함께 제공 되었기 때문에 솔루션이 DOS 배치 파일로 표시되는 이유에 대해 혼란 스러웠습니다. 또한 bash에서 실행되는 DOS 컨텍스트를 가져올 수 없었으므로 이전에 bash 컨텍스트에서 공유 된 내용을 조정하려고 시도했습니다.

git diff각 파일에 대해 지정된 명령을 한 번 실행하는 것처럼 보이기 때문에 솔루션을 두 개의 bash 스크립트로 분할했습니다.

먼저 gitprepdiff.sh앞서 언급 한 것처럼 difftool이되도록 구성 합니다.

#!/bin/sh
#echo ...gitprepdiff.sh
cp -v $1 "$TMP/GitDiff/old/$2"
cp -v $2 "$TMP/GitDiff/new"

또한 git configure명령 의 결과는 다음 에서 직접 찾아서 편집 할 수 있습니다.C:\Users\<username>\.gitconfigure

gitdiff.sh 그런 다음 일반적으로 호출하는 명령 줄에서 실행됩니다. git diff

#!/bin/sh
#echo Running gitdiff.sh...

DIFFTEMP=$TMP/GitDiff

echo Deleting and re-creating $DIFFTEMP...
rm -rf $DIFFTEMP;
mkdir $DIFFTEMP;

echo Creating $DIFFTEMP/old...
mkdir $DIFFTEMP/old;

echo Creating $DIFFTEMP/new...
mkdir $DIFFTEMP/new;

git diff --name-only "$@" | while read filename; do
    git difftool "$@" --no-prompt "$filename";
done

"$PROGRAMFILES\WinMerge\WinMergeU.exe" -r -e -dl "Repository" -dr "Working" $LOCALAPPDATA\\Temp\\1\\GitDiff\\old $LOCALAPPDATA\\Temp\\1\\GitDiff\\new

또한 주목할 가치가있는 것은 내 설치에서 /tmp(bash에서) %LOCALAPPDATA%\Temp\1\(Windows에서 ) 매핑 되었기 때문에 WinMerge에 대한 호출에서 후자를 사용하고 있습니다.


2
나는 변화 gitprepdiff.sh에 대한 #!/bin/sh #echo ...gitprepdiff.sh mkdir -vp "$TMP/GitDiff/old/$(dirname $2)" cp -v $1 "$TMP/GitDiff/old/$2" cp -v --parents $2 "$TMP/GitDiff/new"감사합니다!
dobau

이 작업을 수행하기 위해 너무 많은 농구를 뛰어 넘는 것은 우스꽝 스럽지만 실제로는 그렇습니다. 모든 파일 차이점을 한 번에 가져옵니다. 하위 디렉터리의 파일을 제대로 처리하려면 @dobau에서 언급 한 변경 사항도 만들어야했습니다.
Tom

1
git config --global diff.tool winmerge
git config --global difftool.winmerge.cmd "\"$PROGRAMFILES\\WinMerge\\WinMergeU.exe\" -u -dl \"Local\" -dr \"Remote\" \"\$LOCAL\" \"\$REMOTE\""
git config --global difftool.prompt false

당으로 WinMerge는 명령 행 설명서 : "매개 변수 중 하나를 슬래시 (/) 또는 대시로 시작하는 (-) 문자"

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