DB정보나 중요한 설정 파일 등을 실수로 올려서, git의 commit history에서까지 완전히 지우고 싶을 때 사용합니다.
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch [지우고 싶은 특정 파일의 경로]" HEAD
git push origin --force --all
만약, 지우고 싶은 파일이 또 있거나, 이미 backup이 있다고 뜨는 경우, 다음과 같이 실행해주면 됩니다.
git update-ref -d refs/original/refs/heads/[현재 backup이 있는 브랜치 이름]
예를 들어 master 브랜치에서 a.java 파일과 b.java 파일을 지우고자 하는 경우, 다음과 같이 실행합니다.
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch ./src/main/resources/a.java" HEAD
git push origin --force --all
git update-ref -d refs/original/refs/heads/master
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch ./b.java" HEAD
git push origin --force --all
결과적으로,
Github에서 지금까지 해당 파일들이 포함되었던 commit의 메세지는 보이지만,
파일 자체는 삭제 전 모습도 보이지 않도록 처리됩니다.
참고로, git push origin 에서 force를 해주지 않으면 commit 메세지들이 중복되어 두 배로 늘어날 수 있으니 주의해야 합니다.
우와 대박