Git에는 경로별로 파일이나 폴더를 어떻게 관리할 것인지 설정을 할 수 있다.
이것을 Git attribution이라고 한다.
이 설정은 .gitattribution이라는 파일에 저장해놓고 관리할 수 있다.
기본적으로 숨김 처리해서 사용하고 다음처럼 생겼다.
여기저기서 알아본 결과, 이 파일로 Merge 할 때 파일, 폴더를 선별하거나 텍스트가 아닌 파일을 Diff 할지 말지, checkin/out을 어떻게 필터링할지 정할 수 있다고 한다.
이 게시글에서는 바이너리 파일을 Diff 하지 않도록 설정하는 방법만 소개하고자 한다.
* Diff: 파일 충돌이 일어났을 때, 어떤 코드를 선택해서 적용할지 제시해주는 유틸리티
바이너리 파일은 이진수 혹은 16진수로 이루어진 파일을 말한다.
4CB2B14F292F2A90008F2A15,
4CB2B151292F2E44008F2A15 처럼 이루어진 프로그램 실행 파일이다.
이 파일들의 내용물은 텍스트 파일로 열어서 확인할 수 있다. 하지만 이 내용들이 무엇을 뜻하는지 우리는 알지 못한다.
100% 기계어이기 때문이다. 그렇다면 Git에게 '이 파일이 바이너리 파일이기 때문에 이렇게 다뤄줘'라고 알려줄 수 없을까?
왜냐하면 바이너리 파일은 내용물을 봐도 우리가 어떻게 Diff 해야하는지 알지 못한다.
나의 경우 iOS 앱 개발을 하고 있기 때문에 Xcode를 사용한다.
Xcode를 사용하다보면 팀원들과 종종 .pbxproj 파일에서 conflict가 발생하는데, Diff 하려고 내용을 보면 다 기계어로 되어있다.
이는 실행파일 즉, 바이너리 파일이므로 이것이 변경되어도 Git이 내용물까지 들어다봐서 '이 지점이 바뀌었어! Diff 로 해결해!'라고 지시하지 않도록 해줘야한다.
이 파일은 .gitignore에 지정해줄 수도 없다. 왜냐하면 .pbxproj 파일은 Xcode 구성 Bundle을 가지고 있는 중요한 파일이기 때문이다.
따라서 .gitattributes 에 지정해줘야하며 다음과 같이 지정해준다.
*.pbxproj binary merge=union
바이너리 파일로 인해서 git conflict를 피하고 싶다면 위와 같은 형식으로 파일을 .gitattributes에 지정해주자.