Git 내부에서 Winmerge를 사용하여 diff 파일 저장
문제
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
그러나 그것은 개방으로 만 작동합니다 N 창 N 파일 (사용하려는 경우 -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 개의 장소에서 첫 번째 부분을 사용하는 데 어려움을 겪고 다음과 같이 고쳤습니다.
Winmerge.cmd를 설정하기위한 두 번째 명령은 CMDLINE ($ local 및 $ remote 이전)에 추가 슬래시가 필요했고, 그렇지 않으면 Cygwin은 cmdline의 변수를 대체했습니다.
C:\myGitRepo>git config --replace --global difftool.winmerge.cmd "winmerge.sh \"\$LOCAL\" \"\$REMOTE\""
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 매뉴얼: "매개 변수는 전방 슬래시 ( /) 또는 대시 ( -) 문자로 접두사입니다."