git 내부에서 Winmerge를 사용하여 Diff를 수행하는 방법이 있습니까?
git 내부에서 Winmerge를 사용하여 Diff를 수행하는 방법이 있습니까?
답변:
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"
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
세션 이 종료됩니다 .
git diff
?
c:\Temp\GitDiff\old
및 의 파일 비교를 확인해야합니다 . bash 세션이 아닌 DOS 세션에서이 DOS 프로그램을 실행하고 있습니까? c:\Temp\GitDiff\new
/tmp
""
제 경우에는 평가하지 않았습니다 ( git config
Windows CMD에서 명령을 실행합니다 .하지만 당신이 옳습니다 : ""
bash 쉘에서 실행되면 평가됩니다 .
첫 번째 부분을 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 단계 -경로에 액세스 할 수있는 위치 (예 : /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
입니다.
별도의 .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에 올바르게 나열됩니다.
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\"
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!
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 설치에 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에 대한 호출에서 후자를 사용하고 있습니다.
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"
감사합니다!
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는 명령 행 설명서 : "매개 변수 중 하나를 슬래시 (/) 또는 대시로 시작하는 (-) 문자"