태그 보관물: git-difftool

git-difftool

선호하는 diff 도구 / 뷰어로 ‘git diff’출력을 보려면 어떻게합니까? git diff선택한

를 입력하면 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으로 실행될 수 있습니다. )


위의 기사는 환경 변수가 아닌 구성 파일을 통해 정의 된 외부 도구에 대한 이론입니다 .
실제로 (여전히 외부 도구의 구성 파일 정의를 위해) 다음을 참조 할 수 있습니다.


답변

위의 이전 “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의 파일 내용을 포함하고 종료 개정판의 파일 내용을 포함합니다.
$BASEwor에 파일 내용이 들어 있습니다.

기본적으로 git-mergetoolgit 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, spreadopendiff ; 사용하려는 도구가이 목록에없는 경우 언제든지 ‘ 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