Git, 코드와 함께 설정이 움직인다!
Git은 `.gitignore`, `.gitattributes` 등 특수 파일을 통해 저장소의 동작을 제어함
`.gitignore`는 추적하지 않을 파일 패턴을 정의하며, 글로벌 설정도 가능함
`.gitattributes`는 파일 처리 방식을 설정하며, LFS, 줄 바꿈, 언어 감지 등을 지원함
`.gitmodules`는 서브모듈 설정을 관리하며, 종속성 관리에 활용됨
`.mailmap`은 커밋 작성자 정보를 통합하고, `.git-blame-ignore-revs`는 git blame 결과를 개선함
.gitignore 파일의 심층 분석
`.gitignore` 파일은 Git이 추적하지 않을 파일 패턴을 정의하는 데 사용되며, 각 디렉토리별로 설정할 수 있다. 특히, `node_modules/`, `*.log`, `.env`, `dist/` 등과 같이 프로젝트에 불필요한 파일을 제외하는 데 유용하다. 와일드카드, 디렉토리 마커, 부정 패턴을 지원하며, 글로벌 설정(`~/.config/git/ignore`)을 통해 OS 관련 파일(예: `.DS_Store`)을 모든 프로젝트에서 무시할 수 있다.
.gitattributes를 활용한 파일 처리
`.gitattributes` 파일은 파일의 속성을 정의하여 Git의 동작을 세밀하게 제어한다. LFS(Large File Storage) 필터, 줄 바꿈 정규화, 병합 전략, 언어 감지 등을 설정할 수 있다. 예를 들어, `*.psd filter=lfs` 설정을 통해 PSD 파일을 LFS로 관리하고, `*.sh text eol=lf` 설정을 통해 쉘 스크립트의 줄 바꿈을 LF로 통일할 수 있다. GitHub Linguist는 이 파일을 사용하여 언어 감지를 오버라이드한다.
Git LFS 설정과 .lfsconfig 파일
`.lfsconfig` 파일은 Git LFS(Large File Storage) 설정을 저장하며, 저장소 내에서 LFS 설정을 공유할 수 있게 해준다. LFS 엔드포인트 URL, 전송 설정 등을 포함하며, LFS 명령 실행 시 자동으로 로드된다. LFS를 사용하면 대용량 파일을 Git 저장소에서 효율적으로 관리할 수 있으며, `.gitattributes` 파일과 함께 사용하여 LFS로 관리할 파일을 지정한다. LFS 마이그레이션(Migration)을 통해 기존 파일을 LFS로 이전할 수 있다.
서브모듈(.gitmodules)과 메일맵(.mailmap)의 활용
`.gitmodules` 파일은 Git 서브모듈을 관리하며, 다른 Git 저장소를 종속성으로 포함하는 데 사용된다. 서브모듈의 경로, URL, 브랜치 정보를 설정하며, `git submodule update --init --recursive` 명령을 통해 서브모듈 내용을 가져올 수 있다. `.mailmap` 파일은 작성자 이름과 이메일 주소를 매핑하여 커밋 기록을 정리한다. GitHub 기여 그래프에서 중복된 작성자 정보를 통합하여 깔끔하게 표시할 수 있다.
git blame 결과 개선을 위한 .git-blame-ignore-revs
`.git-blame-ignore-revs` 파일은 `git blame` 명령에서 무시할 커밋을 지정하여 코드 변경 내역을 더 정확하게 추적할 수 있도록 돕는다. 대량의 포맷팅 변경, 린팅(Linting) 작업 등 의미 없는 커밋을 무시함으로써, 실제 코드 변경의 작성자를 파악하는 데 도움을 준다. GitHub, GitLab, Gitea 등에서 자동으로 지원되며, `git config blame.ignoreRevsFile` 설정을 통해 사용할 수 있다.