2013-03-10 4 views
27

어떻게하면 항상 mergetool GUI를 강제로 표시하고 자동 해결을 비활성화 할 수 있습니까? 이 병합하는 동안 충돌이 내가이 mergetool를 사용할 때이 문제에 입력 "병합 해상도 도구 (kdiff3를) 시작하는 수익을 히트 '히트 더 GUI가 표시되지 않고 이후mergetool GUI (kdiff3)가 항상 표시되도록하려면 어떻게해야합니까?

때때로, 단순히 immediatelly 반환 갈등이 해결 된 것으로 보입니다.

나는 지금 mergetool로 kdiff3를 사용하도록 구성했지만, mergetool이 지정된 mergetool로 codecompare를 사용했을 때도 발생했다. "충돌없이 병합시 자동 저장 및 종료"의 kdiff3이 이론적으로 설명 된 동작을 일으킬 수 있지만이 옵션은 항상 비활성화/선택 해제되어 있습니다.

또한 trustExitCode 옵션을 git mergetool gitconfig에서 직접 설정할 수 있습니다.이 옵션은 true로 설정했지만 false로 설정하더라도 GUI가 표시되지 않습니다.

어쨌든 누가 자동 해결을하는지 잘 모르겠습니다. 일부 사전 처리 또는 kdiff3에서 Mergetool?

Windows에서 실행 중이고 Git 확장 프로그램이 설치되어 있습니다. kdiff3 특정

Simillar 질문도 여기에 질문을 받았다 : Kdiff3 won't open with mergetool command

답변

31

망할 놈의 하드 모든 충돌이 자동 분해 kdiff3에 의한 경우 표시하지 않도록 GUI가 발생 kdiff3하는 명령 줄 옵션으로 코딩 --auto 있습니다. kdiff3 설정에서 무시할 명령 행 옵션을 지정할 수 있지만 --auto을 입력하면 작동하지 않습니다.

는 해결 방법으로 나는 병합 도구로 kdiff3 내 자신의 변형을 구성 :

git config --global mergetool.kdiff3NoAuto.cmd "kdiff3 --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\"" 

이 매우 유사하다 kdiff3 기본적으로 사용하지만 --auto 플래그없이 어떤 자식에.

git mergetool -t kdiff3NoAuto을 호출하거나 kdiff3NoAuto을 mergetool로 전역 적으로 구성 할 수 있으며 충돌을 해결할 때 kdiff3이 항상 표시됩니다.

업데이트 : 당신이 정말 해결 어떠한 자동을 사용하지 않으려면, 당신의 질문의 두 번째 부분에 대한, 바로 위의 kdiff3 명령 줄에 --qall을 추가합니다. 하지만 수동으로 파일의 모든 변경 사항을 수동으로 해결해야합니다. 심지어 git 충돌이 발생하지 않은 경우에도 마찬가지입니다. 가장 좋은 시나리오는 다음과 같습니다. kdiff3은 파일을 병합하는 방법을 보여 주며 사용자가 선택할 수 있도록 충돌을 유지합니다. 누구든지 그렇게하는 법을 알고 있습니까?

git config merge.kdiff.driver 'kdiff3 "%O" "%A" "%B" -o "%A" --L1 "Nearest Common ancestor" -L2 "Working Copy" --L3 "Version from Other Branch"' 

당신은 --global 추가하여이 드라이버는 글로벌 만들 수 있습니다 충돌, 간단하게 설치 kdiff와 병합 드라이버가있는 경우에만 호출 대신 mergetool를 구성

+0

와우, 훌륭합니다. 감사! 링크 된 질문에 대한 대답을 고려하거나 끝 부분에 정확히 동일한 문제 일 수 있으므로 의견을 추가하십시오. –

+0

감사합니다. 나는이 질문에 다른 대답과 관련이있다. – PiQuer

+1

무시한 명령 줄 옵션에 '--auto'를 추가하면 KDiff3 0.9.98 (64 비트)에서 작동했습니다. 설정 메뉴 -> KDiff3 구성 -> 통합 탭. 자동으로 해결 된 정보 대화 상자가 나타나지만 추가 병합이 표시되어 추가 편집이 가능합니다. –

0

. 은 그러나 당신은 당신의 repo에 .gitattribute을 추가해야합니다

* merge=kdiff 
0

git mergetool의 동작이 선택한 병합 도구 힘내 그것을 전달하는 명령 행에 전적으로 의존한다.따라서 동작을 변경하려면 원하는 것을 수행하는 명령 줄을 찾아 그 명령 줄을 사용하도록 Git을 구성해야합니다.

나는이 질문을 직접 (특히 KDiff3와 관련하여) 가지고 있었고 PiQuer's answer은 나를 길로 데려 갔지만 생각 나게했다. --auto 옵션 (KDiff3가 GUI를 표시하지 않는 원인)을 제외하고는 KDiff3에 대해 Git의 기본 동작을 정확히 복제하는 방법이 있어야합니다.

kdiff3 병합 도구의 기본 명령 소스가 git/mergetools/kdiff3 파일에있는 것처럼 보입니다. 쉘 스크립트처럼 보이므로 정확하게 복사 할 수 있어야합니다! 한 줄에 씌우고 --auto을 제거하고 일을 탈출하는 것은 우리에게주는이 :

git config --global mergetool.kdiff3.cmd "if \"\$base_present\"; then \"\$merge_tool_path\" --L1 \"\$MERGED (Base)\" --L2 \"\$MERGED (Local)\" --L3 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$BASE\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; else \"\$merge_tool_path\" --L1 \"\$MERGED (Local)\" --L2 \"\$MERGED (Remote)\" -o \"\$MERGED\" \"\$LOCAL\" \"\$REMOTE\" >/dev/null 2>&1; fi" 

base_presentmerge_tool_path 변수가 구체적으로 어떤에서 가능하므로, mergetool.<tool>.cmd에서 사용 가능한 것으로 망할 놈의 문서에 언급되지 않은 앞으로이 명령은 그대로 작동하지 않을 수도 있습니다. 그러나 이들은 쉽게 BASE이 존재하는 파일을 참조하는지 여부와 KDiff3의 하드 코딩 된 경로를 나타내는 지 여부를 테스트하는 명령으로 쉽게 대체 될 수 있습니다.

위의 명령은 Git의 kdiff3 병합 도구에 별도의 명령을 작성하는 대신 기본 명령을 대체합니다. 원래의 질문에 다른 점 몇 가지에 대해서

:

  • trustExitCode 설정은 병합 도구의 종료 코드가 병합 성공 여부의 적절한 표시가 있는지 여부 힘내을 알려줍니다. 병합 도구의 동작에는 영향을 미치지 않지만 병합 도구가 종료되면 Git의 동작에는 영향을 미치지 않습니다. manual for git-mergetool을 참조하십시오.
  • git mergetool을 입력 한 후 표시되는 자동 해상도는 모두 병합 도구로 수행됩니다. git mergetool은 병합해야하는 파일 버전에서 외부 도구를 호출하기 만합니다.