Nice programing

선호하는 diff 도구 / 뷰어로 'git diff'출력을 보려면 어떻게해야합니까?

nicepro 2020. 9. 29. 18:42
반응형

선호하는 diff 도구 / 뷰어로 'git diff'출력을 보려면 어떻게해야합니까?


을 입력 할 때 git diff선택한 시각적 비교 도구 (Windows의 SourceGear "diffmerge")를 사용하여 출력을보고 싶습니다. 이 작업을 수행하도록 git을 어떻게 구성합니까?


Git1.6.3부터 git difftool 스크립트를 사용할 수 있습니다 . 아래 내 대답을 참조하십시오 .


기사 가 도움 될 수 있습니다. 다음은 가장 좋은 부분입니다.

외부 비교 도구를 지정하는 방법에는 두 가지가 있습니다.

첫 번째는 GIT_EXTERNAL_DIFF 변수를 설정하여 사용한 방법입니다. 그러나 변수는 실행 파일의 전체 경로를 가리켜 야합니다. 또한 GIT_EXTERNAL_DIFF로 지정된 실행 파일은 고정 된 7 개의 인수 집합으로 호출됩니다.

path old-file old-hex old-mode new-file new-hex new-mode

대부분의 diff 도구는 인수의 다른 순서 (일부만)를 필요로하기 때문에 대신에 실제 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)--

보시다시피 두 번째 ( "이전 파일") 및 다섯 번째 ( "새 파일") 인수 만 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>*]

또 다른 사용 사례는 동일한 정보를보고 싶지만 임의 커밋을 비교하는 경우입니다 (이것은 revarg 구문 분석이 더 좋을 수있는 부분입니다).

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 "를 참조하십시오.

그리고 Git 1.7.11--dir-diff 이후에는 파일 쌍당 한 번씩 외부 도구의 인스턴스를 실행하는 대신 두 개의 임시 디렉터리를 채운 후 한 번에 두 개의 디렉터리 계층 구조를 비교할 수있는 외부 비교 도구를 생성 하는 옵션 이 있습니다.


Git 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구성으로 도구를 쉽게 전환 할 수 있습니다 .

다른 세부 사항을 추가하기 위해 Dave 의이 블로그 항목 도 있습니다 .
(또는 옵션에 대한 이 질문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 버전 1.6.3부터는 선호하는 그래픽 비교 도구를 사용하도록 구성 할 수있는 " git difftool "이 있습니다. 현재 기본적으로 지원되는 것은 kdiff3, kompare, tkdiff, meld, xxdiff, emerge, vimdiff, gvimdiff, ecmerge, diffuseopendiff입니다 . 사용하려는 도구가이 목록에 없으면 항상 ' difftool.<tool>.cmd'구성 옵션을 사용할 수 있습니다 .

"git difftool"은 "git diff"와 동일한 옵션을 허용합니다.


새로운 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 동작을 확장하기 위해 작성한 간단한 스크립트 인 diffall을 확인하십시오 .

Windows의 전역 .gitconfig는 %USERPROFILE%\.gitconfig


이것에 하나의 추가가 있습니다. 기본 도구 (예 : 만화경) 중 하나로 지원되지 않는 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

Windows / msys git 용 솔루션

답변을 읽은 후 하나의 파일 만 변경하는 더 간단한 방법을 발견했습니다.

  1. 인수 2와 5를 사용하여 diff 프로그램을 호출하는 배치 파일을 만듭니다.이 파일은 경로에 있어야합니다. (그 위치를 모르는 경우 c : \ windows에 넣으십시오). 예를 들어 "gitdiff.bat"라고합니다. 내 것은 :

    @echo off
    REM This is gitdiff.bat
    "C:\Program Files\WinMerge\WinMergeU.exe" %2 %5
    
  2. 배치 파일을 가리 키도록 환경 변수를 설정합니다. 예 : GIT_EXTERNAL_DIFF=gitdiff.bat. 또는을 입력하여 powershell을 통해 git config --global diff.external gitdiff.bat.

    따옴표를 사용하지 않거나 경로 정보를 지정하지 않는 것이 중요합니다. 그렇지 않으면 작동하지 않습니다. 이것이 gitdiff.bat가 경로에 있어야하는 이유입니다.

이제 "git diff"를 입력하면 외부 diff 뷰어가 호출됩니다.


cygwin을 통해이 작업을 수행하는 경우 cygpath 를 사용해야 할 수 있습니다 .

$ git config difftool.bc3.cmd "git-diff-bcomp-wrapper.sh \$LOCAL \$REMOTE"
$ cat git-diff-bcomp-wrapper.sh
#!/bin/sh
"c:/Program Files (x86)/Beyond Compare 3/BComp.exe" `cygpath -w $1` `cygpath -w $2`

이것은 Windows 7에서 나를 위해 작동합니다. 중개 sh 스크립트가 필요하지 않습니다.

.gitconfig의 내용 :

    [diff]
      tool = kdiff3

    [difftool]
       prompt = false

    [difftool "kdiff3"]
      path = C:/Program Files (x86)/KDiff3/kdiff3.exe
      cmd = "$LOCAL" "$REMOTE"

다른 외부 비교 도구를 살펴본 결과 diffIntelliJ IDEA (및 Android Studio)의보기가 나에게 가장 적합 하다는 것을 알았 습니다.

1 단계-IntelliJ IDEA가 명령 줄에서 실행되도록 설정

IntelliJ IDEA를 diff 도구로 사용하려면 먼저 IntelliJ IDEA가 다음 지침에 따라 명령 줄에서 실행되도록 설정해야 합니다 .

macOS 또는 UNIX :

  1. IntelliJ IDEA가 실행 중인지 확인하십시오.
  2. 주 메뉴에서을 선택합니다 Tools | Create Command-line Launcher. 실행기 스크립트의 제안 된 경로 및 이름과 함께 실행기 스크립트 만들기 대화 상자가 열립니다. 기본값을 수락하거나 자신의 경로를 지정할 수 있습니다. 나중에 필요하므로 확인하십시오. IntelliJ IDEA 외부에서 실행기 스크립트의 경로와 이름을 경로에 추가합니다.

Windows의 경우 :

  1. Path 시스템 환경 변수에 IntelliJ IDEA 실행 파일의 위치를 ​​지정합니다. 이 경우 모든 디렉토리에서 IntelliJ IDEA 실행 파일 및 기타 IntelliJ IDEA 명령을 호출 할 수 있습니다.

2 단계-IntelliJ IDEA를 difftool로 사용하도록 git 구성

이 블로그 게시물 의 지침을 따르십시오 .

세게 때리다

export INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
PATH=$IDEA_HOME $PATH

물고기

set INTELLIJ_HOME /Applications/IntelliJ\ IDEA\ CE.app/Contents/MacOS
set PATH $INTELLIJ_HOME $PATH

이제 git 구성에 다음을 추가하십시오.

[merge]
   tool = intellij
[mergetool "intellij"]
   cmd = idea merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED")
   trustExitCode = true
[diff]
   tool = intellij
[difftool "intellij"]
   cmd = idea diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE")

당신은 그것을 시도 할 수 git difftool또는git difftool HEAD~1


위의 훌륭한 답변에 대한 간략한 요약 :

git difftool --tool-help
git config --global diff.tool <chosen tool>
git config --global --add difftool.prompt false

그런 다음 입력하여 사용합니다 (선택적으로 파일 이름도 지정).

git difftool

소개

참고로 VonC의 답변에 내 변형을 포함하고 싶습니다. 수정 된 PATH와 함께 Git의 MSys 버전 (현재 1.6.0.2)을 사용하고 있으며 Bash 셸이 아닌 Powershell (또는 cmd.exe)에서 Git 자체를 실행하고 있습니다.

새로운 명령 인 gitdiff. 이 명령을 실행하면 git diff선택한 시각적 차이 프로그램을 사용하도록 일시적으로 리디렉션 됩니다 (영구적으로 수행하는 VonC의 솔루션과 반대). 이를 통해 기본 Git diff 기능 ( git diff)과 시각적 diff 기능 ( gitdiff) 을 모두 가질 수 있습니다 . 두 명령 모두 동일한 매개 변수를 사용하므로 예를 들어 입력 할 수있는 특정 파일의 변경 사항을 시각적으로 비교하기 위해

gitdiff path/file.txt

설정

참고 $GitInstall힘내가 설치되어있는 디렉토리에 대한 자리 표시로 사용됩니다.

  1. 새 파일을 만듭니다. $GitInstall\cmd\gitdiff.cmd

    @echo off
    setlocal
    for /F "delims=" %%I in ("%~dp0..") do @set path=%%~fI\bin;%%~fI\mingw\bin;%PATH%
    if "%HOME%"=="" @set HOME=%USERPROFILE%
    set GIT_EXTERNAL_DIFF=git-diff-visual.cmd
    set GIT_PAGER=cat
    git diff %*
    endlocal
    
  2. 새 파일을 만듭니다 $GitInstall\bin\git-diff-visual.cmd( [visual_diff_exe]선택한 diff 프로그램의 전체 경로로 자리 표시자를 대체 ).

    @echo off
    rem diff is called by git with 7 parameters:
    rem path old-file old-hex old-mode new-file new-hex new-mode
    echo Diffing "%5"
    "[visual_diff_exe]" "%2" "%5"
    exit 0
    
  3. 이제 끝났습니다. gitdiff이제 Git 저장소 내에서 실행 하면 변경된 모든 파일에 대해 시각적 diff 프로그램이 호출됩니다.


다음은 Windows에서 작동하는 배치 파일입니다. DiffMerge가 기본 위치에 설치되어 있다고 가정하고 x64를 처리하고 필요에 따라 백 슬래시 교체를 처리하며 자체 설치 기능이 있습니다. DiffMerge를 선호하는 diff 프로그램으로 쉽게 대체 할 수 있어야합니다.

설치하기 위해서:

gitvdiff --install 

gitvdiff.bat :

@echo off

REM ---- Install? ----
REM To install, run gitvdiff --install

if %1==--install goto install



REM ---- Find DiffMerge ----

if DEFINED ProgramFiles^(x86^) (
    Set DIFF="%ProgramFiles(x86)%\SourceGear\DiffMerge\DiffMerge.exe"
) else (
    Set DIFF="%ProgramFiles%\SourceGear\DiffMerge\DiffMerge.exe"
)



REM ---- Switch forward slashes to back slashes ----

set oldW=%2
set oldW=%oldW:/=\%
set newW=%5
set newW=%newW:/=\%


REM ---- Launch DiffMerge ----

%DIFF% /title1="Old Version" %oldW% /title2="New Version" %newW%

goto :EOF



REM ---- Install ----
:install
set selfL=%~dpnx0
set selfL=%selfL:\=/%
@echo on
git config --global diff.external %selfL%
@echo off


:EOF

Mac을 사용하고 XCode가있는 경우 FileMerge가 설치되어 있습니다. 터미널 명령은 opendiff이므로 다음과 같이 할 수 있습니다.git difftool -t opendiff


meld 설치

 # apt-get install meld

그런 다음 difftool로 선택하십시오.

 $ git config --global diff.tool meld

콘솔 유형에서 실행하려면 다음을 수행하십시오.

 $ git difftool

그래픽 모드 유형을 사용하려는 경우 :

 $ git mergetool

출력은 다음과 같습니다.

 'git mergetool' will now attempt to use one of the following tools:
 meld opendiff kdiff3 tkdiff xxdiff tortoisemerge gvimdiff diffuse
 diffmerge ecmerge p4merge araxis bc3 codecompare emerge vimdiff
 Merging:
 www/css/style.css
 www/js/controllers.js

 Normal merge conflict for 'www/css/style.css':
   {local}: modified file
   {remote}: modified file
 Hit return to start merge resolution tool (meld):

그래서 그냥 enter를 눌러 meld (기본값)를 사용하면 그래픽 모드가 열리고 매직 저장을하고 병합을 해결하는 것을 누릅니다. 그게 다야


For a linux version of how to configure a diff tool on git versions prior to 1.6.3 (1.6.3 added difftool to git) this is a great concise tutorial,

in brief:

Step 1: add this to your .gitconfig

[diff]
  external = git_diff_wrapper
[pager]
  diff =

Step 2: create a file named git_diff_wrapper, put it somewhere in your $PATH

#!/bin/sh

vimdiff "$2" "$5"

On Mac OS X,

git difftool -t diffuse 

does the job for me in the git folder. For installing diffuse, one can use port -

sudo port install diffuse

you can use git difftool.

for example if you have meld, you can edit the branchs master and devel by:

git config --global diff.external meld
git difftool master..devel

The following can be gleaned from the other answers here, but for me it's difficult, (too much information), so here's the 'just type it in' answer for tkdiff:

git difftool --tool=tkdiff <path to the file to be diffed>

You can substitute the executable name of your favorite diffing tool for tkdiff. As long as (e.g. tkdiff), (or your favorite diffing tool) is in your PATH, it will be launched.


I tried the fancy stuff here (with tkdiff) and nothing worked for me. So I wrote the following script, tkgitdiff. It does what I need it to do.

$ cat tkgitdiff
#!/bin/sh

#
# tkdiff for git.
# Gives you the diff between HEAD and the current state of your file.
#

newfile=$1
git diff HEAD -- $newfile > /tmp/patch.dat
cp $newfile /tmp
savedPWD=$PWD
cd /tmp
patch -R $newfile < patch.dat
cd $savedPWD
tkdiff /tmp/$newfile $newfile

I've been using this bit in ~/.gitconfig for a long time:

[diff]
    external = ~/Dropbox/source/bash/git-meld

With git-meld:

#!/bin/bash
if [ "$DISPLAY" = "" ];
then
    diff $2 $5
else
    meld $2 $5
fi

But now I got tired of always using meld in graphical environment, and it's not trivial to invoke the normal diff with this setup, so I switched to this:

[alias]
    v =  "!sh -c 'if [ $# -eq 0 ] ; then git difftool -y -t meld ; else git difftool -y $@ ; fi' -"

With this setup, things like this work:

git v
git v --staged
git v -t kompare
git v --staged -t tkdiff

And I still get to keep the good old git diff.


I use kompare on ubuntu:

sudo apt-get install kompare

To compare two branches:

git difftool -t kompare <my_branch> master

If you happen to already have a diff tool associated with filetypes (say, because you installed TortoiseSVN which comes with a diff viewer) you could just pipe the regular git diff output to a "temp" file, then just open that file directly without needing to know anything about the viewer:

git diff > "~/temp.diff" && start "~/temp.diff"

Setting it as a global alias works even better: git what

[alias]
    what = "!f() { git diff > "~/temp.diff" && start "~/temp.diff"; }; f"

If you're not one for the command line then if you install tortoise git you can right click on a file to get a tortoisegit submenu with the "Diff later" option.

When you select this on the first file you can then right click on the second file, go to the tortoisegit submenu and select "Diff with ==yourfilehere==" This will give the tortoisegitmerge gui for the result.


GIT / SVN diff 용 GUI 래퍼 인 xd http://github.com/jiqingtang/xd 를 사용해 볼 수 있습니다 . diff 도구 자체가 아닙니다. 실행 xd하고 싶을 때 실행 git diff하거나 svn diff파일 목록, 미리보기 창을 표시하고 tkdiff, xxdiff, gvimdiff, emacs (ediff), xemacs (ediff), meld 등 원하는 모든 diff 도구를 실행할 수 있습니다. diffuse, kompare 및 kdiff3. 사용자 지정 도구를 실행할 수도 있습니다.

불행히도이 도구는 Windows를 지원하지 않습니다.

공개 : 나는이 도구의 저자입니다.

참고 URL : https://stackoverflow.com/questions/255202/how-do-i-view-git-diff-output-with-my-preferred-diff-tool-viewer

반응형

'Nice programing' 카테고리의 다른 글

MySQL에서 중복 값 찾기  (0) 2020.09.29
빈 배열 요소 제거  (0) 2020.09.29
malloc과 calloc의 차이점은 무엇입니까?  (0) 2020.09.29
Objective-C에서 난수 생성  (0) 2020.09.29
차이  (0) 2020.09.29