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