GitHub에 잘못 올린 파일 히스토리까지 완벽하게 삭제하는 방법

개발 과정에서 실수로 민감 정보가 포함된 파일을 GitHub에 업로드 한 상황에서 히스토리까지 완벽하게 정리하는 방법을 소개한다.

문제 상황:

  • AWS 키 정보가 담긴 파일을 실수로 GitHub에 업로드했다.
  • git rm --cached -r <파일 경로> 명령은 현재 커밋만 삭제하기 때문에 히스토리에는 정보가 남아있다.

해결 방법: git filter-branch 명령 활용

1. git filter-branch 명령 사용:

모든 커밋에서 특정 파일을 제거하고 커밋을 재작성한다.

명령:

$ git filter-branch -force --index-filter 'git rm --cached --ignore-unmatch <파일 경로>' --prune-empty -- --all

옵션 설명:

  • 모든 커밋을 대상으로 (filter-branch)
  • git rm --cached --ignore-unmatch <파일 경로> 명령을 수행한다.
     - 삭제 대상 파일을 Untracked 상태로 만든다. (git rm --cached)
     - 파일이 존재하지 않으면 넘어간다. (--ignore-unmatch)
  • 명령 수행 결과를 기준으로 커밋을 재작성한다. (--index-filter)
  • 이 때, 빈 커밋은 삭제한다. (--prune-empty)
     - 빈 커밋 Ex: 기존 커밋에 대상 파일만 존재하는 경우, Untracked 상태로 만든 결과는 빈 커밋이 된다.
  • 이를 모든 브랜치에 적용한다. (--all)

작업 결과로 "was rewritten" 메세지가 출력되면 정상이다.

2. 원격 저장소에 강제 Push:

$ git push origin --force --all

주의 사항:

  • git filter-branch 명령은 커밋 히스토리를 다시 작성하기 때문에 시간이 오래 걸릴 수 있다.
  • 원격 저장소에 강제 Push를 하기 전에 백업을 권장한다.

추가로

작업 전과 후 히스토리를 대조해보면, 삭제 대상 파일이 포함된 커밋부터 hash 값이 달라지고, 빈 커밋은 삭제된 것을 확인할 수 있다.


REFERENCE