Development Tip

Git-선택한 파일에서 병합 충돌 및 수동 병합을 강제하는 방법

yourdevel 2020. 10. 10. 12:07
반응형

Git-선택한 파일에서 병합 충돌 및 수동 병합을 강제하는 방법


우리는 공통 마스터 브랜치와 많은 병렬 브랜치를 가지고있는 웹 애플리케이션을 유지합니다. 소스 코드는 git에서 관리되며 마스터 브랜치에서 병렬 브랜치로 전송 기능과 버그 수정이 필요할 때 훌륭한 도구입니다. 그러나 민감하고 자동 병합이 일반적으로 나쁜 결과를주는 파일은 거의 없습니다. 따라서 병합이 어떻게 든 표시 될 수 있고 모든 병합으로 인해 수동 병합이 필요한 충돌이 발생하면 훨씬 더 쉬울 것입니다.

나는 대답을 찾았다.

  1. 내가 사용하고 --no이 커밋--no-FF 병합 옵션을하지만 동일하지 않습니다.
  2. 여기여기 누군가가 같은 질문을하지만 해결책이 없습니다.
  3. 비슷한 경우는 somefile.php merge = ours를 포함하는 .gitattributes를 사용하여 파일이 병합되는 것을 방지하는 방법 인 것 같습니다 . 충돌을 생성하거나 수동 병합을 강제하는 병합 옵션을 찾으려고했지만 지금까지 아무것도 찾지 못했습니다.
  4. 다음을 포함하는 .gitattributes : somefile.php -merge 는 자동으로 병합되지 않으므로 강제로 병합됩니다. 90 % 해결책이지만 내가 추구하는 것은 자동 병합을 시도하고 성공 여부에 관계없이 충돌로 표시하는 것입니다. 그러나 이것은 지금까지 해결책에 가장 가깝습니다. (... 명확한 설명을 위해 Charles Bailey에게 감사드립니다 ...)
  5. 누군가 사용자 정의 병합 드라이버 ( 1 , 2 ) 를 작성하도록 제안 했지만 어떻게 수행하는지 명확하지 않습니다.

편집 : 변형 4. 설명


사용자 지정 병합 드라이버 인 옵션 5는 아마도 원하는 항목에 가장 근접하는 방법 일 것입니다. 의외로 쉽게 할 수 있습니다. 아래는 당신이 원하는 행동에 아주 가깝게 만들어야한다고 생각하는 예입니다.

먼저라는 병합 드라이버 스크립트를 만듭니다 merge-and-verify-driver. 실행 가능하게 만들고 적절한 위치에 넣으십시오 (저장소의 구성 파일이 의존 할 것이기 때문에이 스크립트를 저장소에 확인하는 것을 고려할 수 있습니다). Git은 민감한 파일의 병합을 수행하기 위해이 쉘 스크립트를 실행할 것입니다.

#!/bin/bash
git merge-file "${1}" "${2}" "${3}"
exit 1

이것은 Git 자체가 일반적으로 수행하는 기본 병합 동작을 수행합니다. 주요 차이점은 스크립트가 항상 0이 아닌 값을 반환한다는 것입니다 (병합이 실제로 충돌없이 해결 된 경우에도 충돌이 있음을 나타냄).

다음으로 사용자 지정 병합 드라이버의 존재를 Git에 알려야합니다. 저장소의 구성 파일 ( .git/config) 에서이 작업을 수행합니다 .

[merge "verify"]
        name = merge and verify driver
        driver = ./merge-and-verify-driver %A %O %B

이 예에서는 merge-and-verify-driver저장소의 최상위 디렉터리 ( ./)에 넣었 습니다 . 그에 따라 스크립트 경로를 지정해야합니다.

이제 중요한 파일에 적절한 속성을 지정하면 해당 파일을 병합 할 때 사용자 지정 병합 드라이버가 사용됩니다. 다음을 .gitattributes파일에 추가 하십시오.

*.sensitive merge=verify

여기서는 이름이 패턴과 일치하는 모든 파일 *.sensitive이 사용자 지정 병합 드라이버를 사용해야 한다고 Git에 지시했습니다 . 당연히 파일에 적합한 패턴을 사용해야합니다.


참고 :이 문서 " PO 파일 용 git 병합 드라이버 작성 "에서는 파일을 수동으로 병합 할 때 수행 할 수있는 종류의 조작을 설명합니다. 수동 병합에서 특정 데이터를 준비하기 위해 사전 처리 할 수 ​​있습니다.

git merge-file예를 들어 병합 (!) 하기 전에 파일DECRYPT (및 다시 암호화) 하는 데 사용할 수 있습니다 .

귀하의 경우 0이 아닌 상태로 병합 드라이버를 종료하면 병합이 수동으로 수행됩니다.


이 두 명령은 사용자 지정 병합 드라이버를 사용하는 것과 동일한 효과가있는 것 같습니다.

git merge --no-commit your_target_branch
git checkout --conflict merge .   (do not forget the . and run it in the top dir of the repository)

첫 번째 명령은 병합 커밋을 생성하기 전에 병합을 중지하고 두 번째 명령은 원래 충돌이 없더라도 해결할 충돌로 두 분기에서 수정 된 모든 파일을 표시합니다.

참고 URL : https://stackoverflow.com/questions/5074452/git-how-to-force-merge-conflict-and-manual-merge-on-selected-file

반응형