우리는 공통 마스터 브랜치와 많은 병렬 브랜치가있는 웹 애플리케이션을 유지합니다. 각 설치마다 하나씩, 각각 특정 변경 사항이 거의 없습니다. 소스 코드는 git에서 관리되며 마스터 브랜치에서 병렬 브랜치로 전송 기능과 버그 수정이 필요할 때 훌륭한 도구입니다. 그러나 민감하고 자동 병합이 일반적으로 나쁜 결과를 제공하는 파일은 거의 없습니다. 따라서 병합이 어떻게 든 표시 될 수 있고 모든 병합으로 인해 수동 병합이 필요한 충돌이 발생하면 훨씬 더 쉬울 것입니다.
나는 대답을 찾았다.
- 내가 사용하고 –no이 커밋 및 –no-FF 병합 옵션을하지만 동일하지 않습니다.
- 여기 와 여기 누군가가 같은 질문을하지만 해결책이 없습니다.
- 비슷한 경우는 somefile.php merge = ours를 포함하는 .gitattributes를 사용하여 파일이 병합되는 것을 방지하는 방법 인 것 같습니다 . 충돌을 생성하거나 수동 병합을 강제하는 병합 옵션을 찾으려고했지만 지금까지 아무것도 찾지 못했습니다.
- 다음을 포함하는 .gitattributes : somefile.php -merge 는 자동으로 병합되지 않으므로 강제로 병합됩니다. 90 % 해결책이지만 내가 추구하는 것은 자동 병합을 시도하고 성공 여부에 관계없이 충돌로 표시하는 것입니다. 그러나 이것은 지금까지 해결책에 가장 가깝습니다. (… 명확한 설명을 위해 Charles Bailey에게 감사드립니다 …)
- 누군가 사용자 지정 병합 드라이버 ( 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에 지시했습니다 . 당연히 파일에 적합한 패턴을 사용해야합니다.
답변
이 두 명령은 사용자 정의 병합 드라이버를 사용하는 것과 동일한 효과를 갖는 것 같습니다.
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)
첫 번째 명령은 병합 커밋을 생성하기 전에 병합을 중지하고 두 번째 명령은 원래 충돌이 없었더라도 해결할 충돌로 두 분기에서 수정 된 모든 파일을 표시합니다.
답변
참고 :이 문서 ” PO 파일 용 git 병합 드라이버 작성 “에서는 파일을 수동으로 병합 할 때 수행 할 수있는 종류의 조작을 설명합니다. 수동 병합에서 특정 데이터를 준비하기 위해 사전 처리 할 수 있습니다.
git merge-file
예를 들어 병합 (!) 전에 파일 을 DECRYPT (및 다시 암호화) 하는 데 사용할 수 있습니다 .
귀하의 경우 0이 아닌 상태로 병합 드라이버를 종료하면 병합이 수동으로 수행됩니다.