Error

Git attribution

elisha0103 2022. 11. 28. 18:46

Git에는 경로별로 파일이나 폴더를 어떻게 관리할 것인지 설정을 할 수 있다.

이것을 Git attribution이라고 한다.

이 설정은 .gitattribution이라는 파일에 저장해놓고 관리할 수 있다. 

기본적으로 숨김 처리해서 사용하고 다음처럼 생겼다.

.gitattributes

여기저기서 알아본 결과, 이 파일로 Merge 할 때 파일, 폴더를 선별하거나 텍스트가 아닌 파일을 Diff 할지 말지, checkin/out을 어떻게 필터링할지 정할 수 있다고 한다.

이 게시글에서는 바이너리 파일을 Diff 하지 않도록 설정하는 방법만 소개하고자 한다.

* Diff: 파일 충돌이 일어났을 때, 어떤 코드를 선택해서 적용할지 제시해주는 유틸리티

 

 

바이너리 파일은 이진수 혹은 16진수로 이루어진 파일을 말한다.

4CB2B14F292F2A90008F2A15,

4CB2B151292F2E44008F2A15 처럼 이루어진 프로그램 실행 파일이다.

이 파일들의 내용물은 텍스트 파일로 열어서 확인할 수 있다. 하지만 이 내용들이 무엇을 뜻하는지 우리는 알지 못한다.

100% 기계어이기 때문이다. 그렇다면 Git에게 '이 파일이 바이너리 파일이기 때문에 이렇게 다뤄줘'라고 알려줄 수 없을까?

왜냐하면 바이너리 파일은 내용물을 봐도 우리가 어떻게 Diff 해야하는지 알지 못한다.

(Diff 할 수 있도록 설정할 수도 있지만 특수한 작업환경, 다른 운영체제나 프로그램 실행 환경이나 버전이 다른 경우가 아니라면 Diff 할 경우가 거의 없다.)

나의 경우 iOS 앱 개발을 하고 있기 때문에 Xcode를 사용한다. 

Xcode를 사용하다보면 팀원들과 종종 .pbxproj 파일에서 conflict가 발생하는데, Diff 하려고 내용을 보면 다 기계어로 되어있다.

이는 실행파일 즉, 바이너리 파일이므로 이것이 변경되어도 Git이 내용물까지 들어다봐서 '이 지점이 바뀌었어! Diff 로 해결해!'라고 지시하지 않도록 해줘야한다.

이 파일은 .gitignore에 지정해줄 수도 없다. 왜냐하면 .pbxproj 파일은 Xcode 구성 Bundle을 가지고 있는 중요한 파일이기 때문이다.

따라서 .gitattributes 에 지정해줘야하며 다음과 같이 지정해준다.

 

*.pbxproj binary merge=union

 

바이너리 파일로 인해서 git conflict를 피하고 싶다면 위와 같은 형식으로 파일을 .gitattributes에 지정해주자.