- Git은 저장소 내 특정 파일들을 통해 동작 방식을 제어하며, 이들은 .git/ 내부 설정이 아닌 커밋되어 코드와 함께 이동하는 파일임
-
.gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap 등은 각각 파일 추적 제외, 속성 정의, LFS 설정, 서브모듈 관리, 작성자 통합을 담당
-
.git-blame-ignore-revs와 .gitmessage는 코드 포맷팅 커밋 무시 및 커밋 메시지 템플릿을 제공해 협업 품질을 높임
- GitHub, GitLab, Gitea 등은 .github/, .gitlab/, .gitea/ 같은 포지별 설정 폴더를 통해 CI/CD, 리뷰어 지정 등 기능을 확장함
- 이러한 구조는 Git을 넘어 EditorConfig, Docker, 언어 버전 관리 도구 등에서도 동일하게 적용되어, 도트파일 기반 자동 설정 생태계를 형성함
Git의 주요 매직 파일
- Git은 .gitignore, .gitattributes, .lfsconfig, .gitmodules, .mailmap 등 여러 특수 파일을 인식해 저장소 동작을 제어함
- 이 파일들은 .git/ 내부 설정이 아닌 커밋되어 공유되는 구성 요소로, 협업 시 일관된 동작을 보장함
.gitignore
- Git이 추적하지 않아야 할 파일 패턴을 정의
- 와일드카드(*.log), 디렉터리(dist/), 부정(!important.log) 등을 지원
-
.gitignore, .git/info/exclude, 전역 설정(~/.config/git/ignore) 순으로 적용
- 이미 추적된 파일은 .gitignore 추가 후에도 계속 추적되며, git rm --cached로 제거 가능
- GitHub, GitLab, Gitea 등은 무시된 패턴의 파일도 경고 없이 커밋 가능
- GitHub는 언어별 .gitignore 템플릿을 공식 저장소에서 제공
.gitattributes
- 파일별 필터, diff, merge, 줄바꿈, 언어 감지 등을 제어
- 예: *.psd filter=lfs, *.png binary, *.sh text eol=lf
-
text는 줄바꿈 정규화, binary는 diff/merge 비활성화, merge=ours는 충돌 시 로컬 버전 유지
- GitHub Linguist는 .gitattributes를 읽어 언어 통계 제외, 생성 코드 접기, 문서 제외 등을 수행
- 각 디렉터리별 .gitattributes와 .git/info/attributes를 함께 인식
.lfsconfig
-
Git LFS 설정을 저장소와 함께 공유
-
.gitattributes에서 LFS 처리 파일을 지정하고, .lfsconfig는 서버 위치 등 세부 설정을 담당
- 기존 커밋 파일을 LFS로 이동하려면 git lfs migrate 명령 필요
.gitmodules
-
서브모듈 구성 정보를 저장
-
git submodule add 시 생성, git submodule update 시 참조
-
git clone 시 자동으로 서브모듈을 가져오지 않으며, --recurse-submodules 옵션 필요
- 버전 범위 추적 불가, 중첩 .git 디렉터리 생성 등 단점 존재
.mailmap
-
작성자 이름과 이메일을 통합 관리
- 예:
Jane Developer <[email protected]> <[email protected]>
-
git log, git shortlog, git blame 등에서 통합된 이름으로 표시
- GitHub의 기여자 그래프는 mailmap을 반영하지 않음
-
.mailmap 또는 mailmap.file 설정으로 위치 지정 가능
.git-blame-ignore-revs
-
git blame에서 무시할 커밋 목록을 지정
- 포맷터 실행, 린트 적용 등 의미 없는 변경을 제외
- 예:
# Ran prettier on entire codebase
a1b2c3d4e5f6g7h8i9j0...
-
git config blame.ignoreRevsFile .git-blame-ignore-revs로 활성화
- GitHub, GitLab(15.4+), Gitea는 자동 인식
- 파일이 없을 경우 오류 발생 가능하므로 빈 파일 유지 권장
.gitmessage
-
커밋 메시지 템플릿을 정의
- 예:
# <type>: <subject>
#
# Types: feat, fix, docs, style, refactor, test, chore
-
git config commit.template .gitmessage로 설정 필요
- 클론 후 수동 설정이 필요하며, 일부 팀은 husky 등으로 자동화
- 대안으로 commit-msg 훅이나 prepare-commit-msg 훅 사용 가능
포지별 확장 폴더
- GitHub, GitLab, Gitea, Forgejo, Bitbucket 등은 자체 설정 폴더를 사용
-
.github/, .gitlab/, .gitea/, .forgejo/, .bitbucket/
- CI/CD 워크플로, 이슈·PR 템플릿, CODEOWNERS 파일 등을 포함
- Forgejo는 .forgejo/ → .gitea/ → .github/, Gitea는 .gitea/ → .github/ 순으로 폴백
- SourceHut은 .build.yml 또는 .builds/*.yml을 사용
기타 관례적 파일
-
.gitkeep: Git이 빈 디렉터리를 추적하지 않기 때문에, 디렉터리 유지용 더미 파일로 사용
-
.gitconfig: 프로젝트별 Git 설정 예시를 제공하지만 자동 로드되지 않음
-
.gitsigners: GPG/SSH 서명 키 목록을 관리, gpg.ssh.allowedSignersFile로 지정 가능
-
.gitreview: Gerrit 코드 리뷰 서버 설정 파일
- 예:
[gerrit]
host=review.opendev.org
port=29418
project=openstack/nova.git
defaultbranch=master
-
.gitlint: 커밋 메시지 린팅 규칙 정의
- 예:
[general]
ignore=body-is-missing
[title-max-length]
line-length=72
-
.jj/: Git 호환 VCS인 Jujutsu의 상태 디렉터리, .git/과 함께 존재 가능
Git을 넘어선 도트파일 생태계
-
.editorconfig: 에디터 간 일관된 코드 스타일 유지
- 들여쓰기, 줄바꿈, 인코딩, 공백 제거 등을 정의
- VS Code, Vim, Emacs 등 주요 에디터가 지원
-
.ruby-version, .node-version, .python-version: 언어 버전 관리 도구(rbenv, nodenv, pyenv 등)가 읽어 자동 전환
-
.tool-versions: asdf의 다언어 버전 관리 파일
-
.dockerignore: Docker 빌드 시 제외할 파일 목록 지정
-
.gitignore와 동일한 패턴 문법 사용, 빌드 속도 향상 및 비밀정보 제외
Git 연동 도구 개발 시 고려사항
- Git 저장소를 다루는 도구는 다음 파일들을 반드시 인식해야 함
-
.gitignore: 파일 탐색 시 무시 패턴 적용
-
.gitattributes: 바이너리·생성 파일 구분
-
.mailmap: 작성자 정보 통합 표시
-
.gitmodules: 서브모듈 처리
- Git 설정 파일 형식은 [section "subsection"] key = value 구조이며, git config 명령으로 읽기·쓰기 가능
- 대부분의 언어용 Git 라이브러리는 이 형식을 파싱하는 기능을 제공