gitattributes

.gitattributes

Git은 단순히 파일 버전 관리만 하는 것이 아니라, 각 파일의 처리 방식을 세밀하게 제어할 수 있는 강력한 기능을 제공합니다. 그 중 하나가 바로 .gitattributes 파일입니다. 이 파일은 특정 파일이나 파일 집합에 대해 diff, merge, 문자 인코딩, 줄바꿈 변환 등 다양한 속성을 지정할 수 있어 협업 환경에서 코드 일관성을 유지하고, 충돌을 최소화하는 데 큰 도움이 됩니다.


문법

.gitattributes 파일은 리포지토리 루트나 하위 디렉토리에 위치하며, 각 줄마다 패턴과 속성(attribute)을 정의합니다. 기본 문법은 다음과 같습니다.

  • 패턴: 적용할 파일 이름이나 경로, 와일드카드(*, ?)를 사용하여 지정합니다.

  • 속성 설정: 패턴 뒤에 속성을 공백으로 구분해 나열합니다.

  • 주석 처리: # 기호로 시작하는 줄은 주석으로 간주됩니다.

예를 들어, 다음 코드는 모든 .sh 파일을 텍스트 파일로 인식하고, LF(Line Feed) 줄바꿈을 강제합니다.

# 모든 쉘 스크립트는 텍스트 파일로 취급하고 LF로 줄바꿈 설정
*.sh text eol=lf

이처럼 text 속성은 Git이 파일을 텍스트로 다루도록 하며, eol 옵션은 줄바꿈 형식을 강제할 때 사용합니다.


예시

  1. 줄바꿈 제어 (eol)

    • 예시: Windows와 Unix 간 줄바꿈 형식 차이로 인한 문제를 방지하기 위해, 소스 코드 파일은 항상 LF로 저장하도록 강제할 수 있습니다.

      # C/C++ 소스코드는 LF 줄바꿈 적용
      *.c text eol=lf
      *.h text eol=lf
  2. 이진 파일 처리 (binary)

    • 이진 파일은 diff나 자동 병합 대상에서 제외하기 위해 binary 속성을 지정합니다.

      # 이미지 파일은 이진 파일로 처리
      *.png binary
      *.jpg binary
  3. 커스텀 merge 전략

    • 충돌 해결이 필요 없는 파일(예: 잠금 파일 등)은 병합 시 항상 현재 버전을 유지하도록 설정할 수 있습니다.

      # .lock 파일은 항상 ours 전략 사용
      *.lock merge=ours
  4. 사용자 정의 diff 드라이버

    • 특정 파일 형식에 대해 Git이 내장된 diff 알고리즘 대신 커스텀 비교 도구를 사용하도록 지정할 수 있습니다.

      # Markdown 파일에 커스텀 diff 사용 (추가 설정은 .git/config에서)
      *.md diff=markdown
  5. Git LFS 연동

    • 대용량 파일은 Git LFS를 통해 관리하는 경우, 관련 속성을 지정하여 자동 필터링 및 병합 처리를 할 수 있습니다.

      # PSD 파일은 Git LFS로 처리하고, diff/merge는 사용하지 않음
      *.psd filter=lfs diff=lfs merge=lfs -text

  • 여러 패턴 한 줄에 지정하기: 여러 확장자를 한 번에 지정하려면 중괄호를 사용할 수 있습니다.

    # JPG, PNG, GIF 파일은 모두 이진 파일로 처리
    *.{jpg,png,gif} binary
  • 이미 추적 중인 파일: .gitattributes로 속성을 변경해도 이미 Git이 추적 중인 파일에는 즉시 반영되지 않을 수 있습니다. 이 경우, 파일을 재추적하거나 캐시를 클리어(git rm --cached <파일>)한 후 다시 추가해야 합니다.

  • 협업 시 통일성 유지: .gitattributes 파일은 저장소에 포함되므로, 모든 팀원이 동일한 파일 처리 규칙을 적용받게 됩니다. 이를 통해 협업 과정에서 발생할 수 있는 불필요한 충돌이나 포맷 차이를 줄일 수 있습니다.

Last updated