.gitignore 사용법

소개

.gitignore 파일은 Git에서 무시할 파일을 지정하는 데 사용되어 프로젝트에서 필요하지 않은 파일을 버전 관리에서 제외할 수 있도록 한다.

Git으로 관리할 자원 고려하기

Git에서 관리할 파일과 무시할 파일을 명확히 구분하는 것은 프로젝트 관리에 매우 중요하다.

gitignore.io 사이트에서 각 프로젝트나, IDE 등에 필요한 .gitignore 파일들을 자동으로 생성할 수 있다.

  1. Java 프로젝트의 .class 파일

컴파일 시 자동으로 생성되므로 Git에서 관리할 필요가 없다.

  1. Maven의 target 폴더 및 Gradle의 build 디렉토리

빌드 과정에서 생성된 파일은 버전 관리에서 제외해야 한다.

  1. IDE 자동 생성 파일 (예: IntelliJ IDEA의 .idea 폴더, Eclipse의 .metadata 폴더)

IDE가 자동 생성하므로 버전 관리 대상에서 제외하는 것이 좋다.

  1. 보안 파일 (예: .env 파일, AWS 비밀 키 파일)

보안상의 이유로 반드시 무시해야 한다.

  1. Python 프로젝트의 venv 폴더

가상 환경 폴더는 프로젝트와의 연관성이 적으므로 버전 관리에서 제외하는 것이 좋다.

  1. 운영체제 임시 파일 (예: macOS의 .DS_Store, Windows의 Thumbs.db)

프로젝트와 직접적 관련이 없으므로 무시하는 것이 좋다.

.gitignore 파일 작성법

.gitignore 파일은 프로젝트 루트 디렉토리에 위치하며, Git이 버전 관리에서 무시할 파일과 폴더를 정의한다.

기본 규칙

구분 설명 예시
파일 특정 파일을 무시할 때 사용 filename.txt
폴더 특정 폴더를 무시할 때 경로 뒤에 / foldername/
확장자 특정 확장자를 가진 모든 파일을 무시 .log
와일드카드 여러 파일이나 패턴을 한꺼번에 무시 temp*
주석 주석을 달 때는 # 기호 사용 # This is a comment
예외 처리 무시하지 않고 싶은 파일은 ! 사용 !important-file.txt

동작 과정

Git은 작업 트리에서 .gitignore 파일을 참조하여 추적할 파일과 무시할 파일을 결정한다.

  1. 작업 디렉토리에서 .gitignore 참조

Git은 작업 디렉토리에서 .gitignore 파일을 확인하여 어떤 파일을 추적할지를 결정한다. 예를 들어, 아래와 같이 C.txtF/ 디렉토리는 무시된다.

$ cat .gitignore
    C.txt
    F/
  1. Staging Area로 파일 추가 시 무시 파일 제외

git add 명령어를 통해 파일을 Staging Area로 추가할 때, .gitignore에 명시된 파일은 Staging Area에 포함되지 않는다.

$ git status
    On branch main
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
        .gitignore
        A.txt
        B.txt

이미 push된 파일 무시하기

원격 저장소에 이미 push된 파일을 무시하려면 다음 절차를 따른다. 예를 들어, A.txt 파일이 원격 저장소에 커밋된 상태라고 가정하자.

  1. Git 인덱스에서 파일 제거

먼저, git rm --cached <파일명> 명령어로 작업 디렉토리에서 해당 파일을 Git의 추적 대상에서 제거한다.

$ git rm --cached A.txt
    rm 'A.txt'
  1. .gitignore 파일에 파일 추가

이후, .gitignore 파일에 A.txt를 추가하여 Git이 해당 파일을 다시 추적하지 않도록 설정한다.

$ echo "A.txt" >> .gitignore

.gitignore 파일에 해당 내용을 추가한 후, 상태를 확인하면 A.txt파일이 삭제된다는 것을 알 수 있다.

$ git status
    On branch main
    Your branch is up to date with 'origin/main'.
    
    Changes to be committed:
      (use "git restore --staged <file>..." to unstage)
            deleted:    A.txt
    
    Untracked files:
      (use "git add <file>..." to include in what will be committed)
            .gitignore
            B.txt

이미 push된 파일 완전히 제거하기

보안 키가 포함된 파일이 원격 저장소에 push된 경우 단순히 .gitignore에 추가하는 것만으로는 기존 커밋 기록에서 제거되지 않는다. 이를 위해 Git Filter-Branch 명령어를 사용해 기록을 재작성할 수 있다.

Git Filter-Branch 사용하기

Git Filter-Branch는 Git의 히스토리를 재작성하여 특정 파일을 모든 커밋 기록에서 완전히 제거할 수 있다.

  1. Git Filter-Branch 명령어 실행

예를 들어, A.txt 파일을 Git의 모든 커밋에서 제거하려면 다음과 같은 명령어를 실행한다.

git filter-branch --force --index-filter \
    'git rm --cached --ignore-unmatch A.txt' \
    --prune-empty --tag-name-filter cat -- --all
  1. 변경 사항 강제 푸시

기록이 수정된 후, git push origin --force --all 명령어로 원격 저장소에 변경된 기록을 강제로 푸시하여 기존 기록을 덮어쓴다.

  1. Garbage Collection 수행

git gc --aggressive --prune=now 명령어로 Git에서 과거 데이터를 완전히 제거한다.

이 과정을 통해 보안 키와 같은 민감한 파일을 원격 저장소에서 완전히 제거할 수 있다.

주의사항

이 방법은 Git 히스토리를 재작성하기 때문에, 팀 프로젝트 중이라면 반드시 팀원들과 충분히 논의 후 진행해야 하며, 강제 푸시는 신중하게 사용하는 것이 좋다.

위로 스크롤