문제

git 내부에서 Winmerge를 사용하여 Diff를 수행할 수 있는 방법이 있습니까?

도움이 되었습니까?

해결책

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

자세한 내용은 "git grgetool winmerge", 간단한 git config diff.tool winmerge 충분할 것입니다.

GIT 2.5+ (Q2, 2015)는 이제 Winmerge를 Diff 또는 병합 도구로 알고 있습니다!


원래 답변 (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를 시작합니다.
네가 원한다면 git diff Winmerge를 시작하려면 다음과 같이 설정하십시오.

set GIT_EXTERNAL_DIFF=winmerge.sh

그러나 실제 부가 가치는 동일한 Diff 도구를 사용하는 기능에서 비롯됩니다. 하나의 배치에 모든 차이를 제시합니다 순차적으로 제시하는 대신 한 번에 Diff Tool Windows 파일을 닫도록 강요합니다.

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

파일 별 파일 대신 디렉토리 비교가 곧 제공 될 예정입니다.
보다 발표] git 1.7.11.rc1:

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

보다 "반점 difftool: 가르치다 difftool 디렉토리를 처리하려면 차이가 있습니다", 그리고 대답"git 브랜치의 디렉토리 비교" 자세한 사항은.


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

처럼 세바 일링 워스 언급 그의 대답, 스크립트 git-diffall.sh (또한 경로에 넣음)는 다음과 같이 할 수 있습니다.

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

그러나 그것은 개방으로 만 작동합니다 NN 파일 (사용하려는 경우 -s Winmerge의 옵션, Difftool에 의해 너무 일찍 삭제되는 온도 파일로 인해 작동하지 않습니다)


그것이 내가 접근을 좋아하는 이유입니다 gitdiff.bat- 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 세션.

다른 팁

나는 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")"
    

스레드가 혼란스럽고 분기되어 있기 때문에 다음은 MSYSGIT GIT Windows의 디렉토리 목록 "-DIR-DIFF"WinMerge 메소드에 대한 통합 지침이 있습니다.

1 단계 - 다음 내용이있는 경로에 액세스 할 수있는 위치에서 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에게 difftool으로 Winmerge.sh를 사용하도록 지시합니다 (이 옵션은 /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

Diff를 설정하고 GIT 구성의 도구를 별도의 .SH 파일이 필요하지 않은 적절한 매개 변수로 설정하는 스크립트가 있습니다. 그것은 나를 위해 잘 작동하는 것 같습니다.

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에 올바르게 나열되도록 인용됩니다.

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

구성없이 :

git difftool --tool winmerge

가정 :

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

내 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를 호출할 때 후자를 사용하고 있습니다.

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 Command Line 매뉴얼: "매개 변수는 전방 슬래시 ( /) 또는 대시 ( -) 문자로 접두사입니다."

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top