를 입력하면 git diff
선택한 시각적 차이 도구 (Windows의 SourceGear “diffmerge”)를 사용하여 출력을보고 싶습니다. 이를 위해 git을 어떻게 구성합니까?
답변
Git1.6.3부터 git difftool 스크립트를 사용할 수 있습니다 : 아래 내 답변을 참조하십시오 .
이 기사 가 도움 이 될 수 있습니다. 가장 좋은 부분은 다음과 같습니다.
외부 diff 도구를 지정하는 방법에는 두 가지가 있습니다.
첫 번째는 GIT_EXTERNAL_DIFF 변수를 설정하여 사용한 방법입니다. 그러나 변수는 실행 파일의 전체 경로를 가리켜 야합니다. 또한 GIT_EXTERNAL_DIFF에 의해 지정된 실행 파일은 고정 된 7 개의 인수 집합으로 호출됩니다.
path old-file old-hex old-mode new-file new-hex new-mode
대부분의 diff 도구에는 다른 순서의 인수가 필요하기 때문에 래퍼 스크립트를 지정해야 할 것입니다. 대신 래퍼 스크립트를 호출해야합니다.
두 번째 방법은 “git config”를 통해 외부 diff 도구를 구성하는 것 입니다. 여기 내가 한 일이 있습니다.
1) 래퍼 스크립트 “git-diff-wrapper.sh”를 작성하십시오.
-->8-(snip)--
#!/bin/sh
# diff is called by git with 7 parameters:
# path old-file old-hex old-mode new-file new-hex new-mode
"<path_to_diff_executable>" "$2" "$5" | cat
--8<-(snap)--
보다시피, 두 번째 ( “old-file”) 및 다섯 번째 ( “new-file”) 인수 만 diff 도구로 전달됩니다.
2) 종류
$ git config --global diff.external <path_to_wrapper_script>
명령 프롬프트에서 “git-diff-wrapper.sh”경로로 대체하여 ~ / .gitconfig에
-->8-(snip)--
[diff]
external = <path_to_wrapper_script>
--8<-(snap)--
올바른 구문을 사용하여 랩퍼 스크립트 및 diff 도구의 경로를 지정하십시오 (예 : 백 슬래시 대신 슬래시 사용). 내 경우에는
[diff]
external = \"c:/Documents and Settings/sschuber/git-diff-wrapper.sh\"
.gitconfig에서
"d:/Program Files/Beyond Compare 3/BCompare.exe" "$2" "$5" | cat
랩퍼 스크립트에서. 후행 “고양이”를 마음!
( ‘ | cat
‘는 적절하거나 일관된 반환 상태를 반환하지 않을 수있는 일부 프로그램에만 필요하다고 가정합니다 . diff 도구에 명시적인 반환 상태가 있으면 후행 고양이없이 시도해 볼 수 있습니다)
( Diomidis Spinellis 는 주석에 다음을 추가합니다 .
cat
명령 때문에, 필요한diff(1)
파일이 다른 경우, 오류 코드와 기본 종료에 의해.
Git은 실제 오류가 발생한 경우 (예 : 메모리 부족) 외부 diff 프로그램이 오류 코드와 함께 종료 될 것으로 예상합니다.
배관의 출력으로git
하는cat
비 – 제로 오류 코드가 마스크된다.
더 효율적으로 프로그램은exit
인수 0으로 실행될 수 있습니다. )
위의 기사는 환경 변수가 아닌 구성 파일을 통해 정의 된 외부 도구에 대한 이론입니다 .
실제로 (여전히 외부 도구의 구성 파일 정의를 위해) 다음을 참조 할 수 있습니다.
- msysgit / gitk로 DiffMerge를 어떻게 설정합니까? MsysGit 및 gitk에 대한 DiffMerge 및 WinMerge의 구체적인 설정을 보여줍니다.
- Windows에서 Git과 함께 작동하도록 편집기를 설정하려면 어떻게해야합니까? Notepad ++를 외부 편집기로 정의합니다.
답변
위의 이전 “diff.external”구성 답변 을 완료하려면
으로 야쿱 언급 , Git1.6.3 도입 자식 difftool , 원래 2008 년 9 월에 제안을 :
USAGE = '[--tool=tool] [--commit=ref] [--start=ref --end=ref] [--no-prompt] [file to merge]'
( --extcmd
이 답변의 마지막 부분 참조 )
$LOCAL
시작 개정판 $REMOTE
의 파일 내용을 포함하고 종료 개정판의 파일 내용을 포함합니다.
$BASE
wor에 파일 내용이 들어 있습니다.
기본적으로
git-mergetool
git index / worktree에서 작동하도록 수정되었습니다.당신도 개최 또는 unstaged 변경하고 나란히은 diff 뷰어의 변화 (예를 들어보고 싶습니다 때이 스크립트에 대한 일반적인 사용 사례는
xxdiff
,tkdiff
, 등).
git difftool [<filename>*]
또 다른 유스 케이스는 동일한 정보를보고 싶지만 임의의 커밋을 비교하는 경우입니다 (이것은 리바 그 구문 분석이 더 좋을 수있는 부분입니다)
git difftool --start=HEAD^ --end=HEAD [-- <filename>*]
마지막 사용 사례는 현재 작업 트리를 HEAD 이외의 다른 태그 (예 : 태그)와 비교하려는 경우입니다.
git difftool --commit=v1.0.0 [-- <filename>*]
참고 : Git 2.5 이후로 git config diff.tool winmerge
는 충분합니다!
” git mergetool winmerge “를 참조하십시오
그리고 힘내 1.7.11 이후 , 당신은 옵션이 --dir-diff
두 가지의 임시 디렉토리를 채우는 대신 파일 쌍에 한 번 외부 도구의 인스턴스를 실행 한 후 한 번에 두 개의 디렉토리 계층 구조를 비교할 수있는 외부은 diff 도구를 생성하기 위해.
힘내 2.5 전에 :
difftool
사용자 정의 diff 도구 로 구성 하는 실제 사례 :
C:\myGitRepo>git config --global diff.tool winmerge
C:\myGitRepo>git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\""
C:\myGitRepo>git config --global difftool.prompt false
PATH의 디렉토리 부분에 winmerge.sh가 저장되어있는 경우 :
#!/bin/sh
echo Launching WinMergeU.exe: $1 $2
"C:/Program Files/WinMerge/WinMergeU.exe" -u -e "$1" "$2" -dl "Local" -dr "Remote"
다른 도구 (kdiff3, P4Diff, …)가있는 경우 다른 쉘 스크립트와 적절한 difftool.myDiffTool.cmd
구성 지시문을 작성하십시오.
그런 다음 diff.tool
구성으로 도구를 쉽게 전환 할 수 있습니다 .
또한이 가지고 데이브에 의해 블로그 항목 기타 세부 사항을 추가 할 수 있습니다.
(또는 옵션에 대한 이 질문winmergeu
)
이 설정의 관심은 winmerge.sh
스크립트입니다 . 특수한 경우를 고려 하여 스크립트 를 사용자 정의 할 수 있습니다.
예를 들어 아래 의 David Marble 답변을 참조하십시오 .
- 출발지 또는 목적지에있는 새 파일
- 출발지 또는 목적지에서 파일을 제거했습니다.
Kem Mason 이 그의 답변 에서 언급 했듯이 다음 --extcmd
옵션 을 사용하여 래퍼를 피할 수도 있습니다 .
--extcmd=<command>
diff를보기위한 사용자 정의 명령을 지정하십시오.
git-difftool
구성된 기본값을 무시$command $LOCAL $REMOTE
하고이 옵션을 지정하면 실행 됩니다.
예를 들어, 도구 gitk
를 실행 / 사용하는 diff
방법 입니다.
답변
질문과 다소 다른 질문에 대답하는 정신. 이 솔루션을 사용해보십시오 :
$ meld my_project_using_git
Meld는 git을 이해하고 최근 변경 사항을 탐색합니다.
답변
새로운 git difftool을 사용하면 .gitconfig 파일에 이것을 추가하는 것만 큼 간단 합니다.
[diff]
tool = any-name
[difftool "any-name"]
cmd = "\"C:/path/to/my/ext/diff.exe\" \"$LOCAL\" \"$REMOTE\""
선택적으로 다음을 추가하십시오.
[difftool]
prompt = false
또한 확산을 확인하십시오 스크립트는 각각 직렬로 여는 성가신 (IMO) 기본 diff 동작을 확장하기 위해 작성했습니다.
Windows의 전역 .gitconfig가 %USERPROFILE%\.gitconfig
답변
git 버전 1.6.3부터 ” git difftool “이 있는데,이 그래픽 도구는 선호하는 그래픽 diff 도구를 사용하도록 구성 할 수 있습니다. 현재 지원되는 기본적으로 kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, spread 및 opendiff ; 사용하려는 도구가이 목록에없는 경우 언제든지 ‘ difftool.<tool>.cmd
‘구성 옵션을 사용할 수 있습니다 .
“git difftool”은 “git diff”와 동일한 옵션을 허용합니다.
답변
나는 이것에 하나의 추가가 있습니다. 기본 도구 (예 : 만화경) 중 하나로 지원되지 않는 diff 앱을 정기적으로 사용하고 싶습니다.
git difftool -t
또한 기본값을 diff
일반 명령 줄로 사용 하고 싶습니다 . 따라서 GIT_EXTERNAL_DIFF
변수 설정은 옵션이 아닙니다.
diff
이 명령으로 임의의 앱을 일회용으로 사용할 수 있습니다 .
git difftool --extcmd=/usr/bin/ksdiff
2 개의 파일을 지정한 명령으로 전달하기 때문에 래퍼가 필요하지 않을 수도 있습니다.
답변
파일 제거 및 추가를 처리하기위한 VonC의 답변을 바탕으로 다음 명령 및 스크립트를 사용하십시오.
> git config --global diff.tool winmerge
> git config --global difftool.winmerge.cmd "winmerge.sh \"$LOCAL\" \"$REMOTE\" \"$BASE\""
> git config --global difftool.prompt false
이것은 당신의 세계에 이것을 넣는 것과 .gitconfig
같습니다 :
[diff]
tool = winmerge
[difftool "winmerge"]
cmd = winmerge.bat "$LOCAL" "$REMOTE" "$BASE"
[difftool]
prompt = false
그런 다음 winmerge.sh
경로에 있어야 하는 다음을 입력하십시오 .
#!/bin/sh
NULL="/dev/null"
if [ "$2" = "$NULL" ] ; then
echo "removed: $3"
elif [ "$1" = "$NULL" ] ; then
echo "added: $3"
else
echo "changed: $3"
"C:/Program Files (x86)/WinMerge/WinMergeU.exe" -e -ub -dl "Base" -dr "Mine" "$1" "$2"
fi