본문 바로가기

iOS/Project

[iOS] xcode pbxproj 충돌. pbxproj merge confilt를 자동으로 할 경우 문제와 해결 방법 파해치기!!! | # 자동 병합?!

728x90

 

안녕하세요.

 

이번 포스트에선 xcode 프로젝트에서 실행버튼이 막혔을 때, 그리고 pbxproj 자동 병합의 장 단점에 대해 소개하려고 합니다.

 

xcode 실행 버튼이 안열리는 이유

실행 버튼 제한!!

 

위 사진은 협업하다보면 자주 일어날 수 있습니다. 아니면 서로 다른 브랜치에서 혼자 만들었던 파일을 막 수정하거나 삭제한 후에 서로 다른 브랜치를 합칠 경우에도 발생될 수 있습니다.

 

이 경우는 pbxproj 파일 내부 코드에서 깃 충돌이 났을 때, 병합 충돌을 표시해주기 위해 추가적으로 삽입되는 코드들 때문에 실행이 안되는 것입니다. 

 

 

이 충돌을 해결하기 위해선 위와 같은 경로로 들어가서 project.pbxproj 파일의 코드를 수정하면 됩니다. ( 깃허브에서 제시한 충돌 내용을 제거하면 됩니다. )

 

project.pbxproj 사진

 

이렇게 충돌이 난 이유 중 제 경우를 예로 들겠습니다.

저는 temp파일이 있는 develop 브랜치에 두개의 새로운 브랜치(B, C)를 만들었습니다.  "temp 파일"을 B브랜치에서 이름을 변경하고 내부에 로직을 추가했습니다. 그리고 C브랜치에서는 temp파일을 그냥 삭제하고 새로운 파일을 만들었습니다. 이제 B브랜치에서 수행한 작업을 develop브랜치에 합치고, C브랜치에서는 곧바로 develop 브랜치의 내용을 pull 받아왔습니다.

 

이 떄 xcode에서 디렉터리와 파일들의 정보, 디렉터리 내부 디렉터리와 파일 구조를 관리하는 pbxproj에서는 동일한 파일에 대해 서로 다른 작업이 발생됬기에 당연히 충돌이 날 수 밖에 없습니다.

 

여기서 자동 병합, 충돌은 소스파일 내부에서 충돌난 것인데, 요 위의 경우 pbxproj에서 충돌이 났음을 알 수 있습니다.

Git Conflict! 와 터미널의 git pull 과정 충돌 내용 분석

충돌은 자동병합 과정에서 git이 서로 다르게 변경된 두 코드 중 어느 코드를 없애고 뭘 추가해야할지 결정하지 못할 때 충돌이 납니다.

 

깃 컨플릭트 사진

 

그리고 제 깃헙 컨플릭트인 위 내용을 이렇게 3개 내용으로 나눠봤습니다.

 

주황색 영역은 .swift 파일 내부에서 발생된 것입니다. 주황색 문구만 있다면, xcode 빌드는 되지만 실패합니다. 특정 ".swift 파일" 내부에서 충돌을 알려주는 문자열들이 추가됬기 때문입니다.

 

.swift 파일 충돌

 

파일을 보면 요 "<<<, ===, >>>"를 제거하고 cellItem(at:) vs categoryViewCellItem(at:) 함수중애서 어느 함수를 추가하거나 삭제할지 직접 하면 됩니다.

 


그리고 다시 위에 있는 깃 컨플릭트 사진에서 분홍색, 초록색은 파일 내부 소스코드에서도 충돌이나지만 pbxproj에서 충돌이 날 수 있습니다.

이 충돌은 파일 내부 내용의 변경도 변경이지만 pbxproj 파일 내부에서도 코드 정보가 변경으로 인해 발생한 것입니다. 한 쪽에서는 파일을 삭제하고, 다른 한 쪽에서는 파일의 이름을 변경하는 등의 작업이 이루어져서 발생한 충돌입니다. 이러한 내용의 충돌은 pbxproj 파일이 파일 및 프로젝트 구성과 관련된 정보를 추적하고 관리하기 때문에 발생합니다.

project.pbxproj 사진

 

 

그래서 포스트 맨 앞에 언급한 경로대로 project.pbxproj를 들어왔을 때 이런 충돌 내용이 있다면 정말 감사한 생각이듭니다..... 적어도 내가 직접 수정할 수 있기 때문입니다. 자세히보면 최근에 수정했거나, 삭제한 폴더들을 차례대로 제거해 나가면 됩니다 +_+

편하지만 문제가 된 .gitattributes : "*.pbxproj binary merge=union"

iOS 개발 초창기에 협업을 할 때 xocde.pbxproj 파일 충돌이 나거나, 다른 팀원이 파일을 추가했을 때마다 xcode.pbxproj에서 충돌이날 떄가 있었고, pbxporj는 깃에서 병합을 자동으로 해주지 않습니다.

 

그래서 알아낸 것이 .gitattributes 를 루트 디렉터리에 추가하고 내부에 *.pbxproj binary merge=union 코드를 추가하는 것입니다. 이러면 깃에서 거의 자동으로 새롭게 반영되는 pbxproj의 변경 사항을 자동으로 병합해줍니다...

 

이게 정말 좋다고 느꼈습니다. 그리고 프로젝트 만들어 협업할 때마다 추가했습니다. 그리고.... 협업을 하면서 원인 모를 문제를 마주했습니다: )

 

 

프로젝트 실행이 안되는 것은 무조건 pbxproj파일 충돌 때문에 일어난 것이고, xcodeproj -> 패키지 내용 보기 -> project.pbxproj를 들어가서 "cmd+f" 검색으로 ">>>" 나 "===" "<<<"를 입력했더니 충돌난 흔적이 없었습니다............. 수정하지 않았는데? 위에 추가한 바이너리 머지 덕에 자동으로 알아서 병합을 했고 위 흔적이 없었던 것입니다.

 

위 상황 뿐 아니라 때로는 자동 병합할때 pbxproj 파일 내부에 특정 디렉터리 그룹의 끝 키워드인  );  or  ) 등이 자동 병합 과정에서 사라져 인식을 못하는 경우가 있었습니다.

 

처음 .gitattributes가 어떻게 작동되는지 모르면서 사용했을 때.. 지난 협업때 자주 pbxproj 병합 오류가 나서 pbxproj를 열었지만, 병합 충돌이나 특정 범주를 지정하는 키워드들도 제대로 존재 했을 때,

도데체 뭐가 문제인지 원인을 몰라 정말 답답했었고 문득 .gitattributes 문구에서 자동 병합..?을 작성했던 문구가 떠올라 의심이 들어서 삭제했엇는데, 오늘에서야 확실히 확인하게 되었습니다. 

 

확인 방법은 그냥 특정 브랜치에 pull 한 후 프로젝트가 실행되지 않았을 때, 다시 되돌아간 후 .gitattributes를 지웠더니 pbxproj에서 자동병합이 안되고 수동으로 충돌을 해결할 수 있음을 추가적으로 확인했습니다.

 

 

편한게 결국 편한게 아니라는 것을,,, 수동으로 고치는게 훨씬 좋다는 것을 알게 되었고 pbxproj의 충돌을 볼 때 반갑 실증나지많은 않습니다. 오히려 자동으로 병합되어있으면 오류 찾기 정말 때문입니다.

 

결론: 수동으로 하는게 편하다.

728x90