구글 API 키 같은 것을 실수로 레포에 올리는 경우가 있다. 급하게 바꿔서 .gitignore
에 올렸다고 하더라도 이미 커밋 기록에 해당 파일이 같이 올라가 있어서 결국은 키가 공개되는 것은 따로 조치를 해줘야 한다.
깃에는 이미 이와 같은 처리를 도와주는 명령어가 있다. git-filter-branch 를 사용하면 따로 인스톨할 필요없이 처리가 가능하다.
다만 이건 브랜치 기준으로 정리를 해주기 때문에 필자처럼 이미 모든 프로젝트가 마무리되어 master만 남아있는 상황이 아니라면 모든 브랜치에 대해서 처리를 해줘야 하기 때문에 불편할 수 있다.
프로젝트 자체에 해도 되기는 하지만, 그러다가 혹시라도... 맘아픈 상황이 올 수도 있으니 원본을 fork 해놓고 해당 레포를 처리해주는 것이 좋다.
깃랩에서는 저렇게 fork 버튼을 누르면 할 수 있다.
// 연결해주고
$ git clone '저장소 링크'
// 아래 레포 폴더로 이동한다.
$ cd '폴더'
아래의 2가지 링크를 참고해서 진행했었는데, 자세하게 각 명령어가 무슨 역할을 하는지 알고 싶다면 공식문서를 보고 일단 그냥 따라하고 싶다면 아래의 참고블로그를 보면 된다.
git-filter-branch 공식문서
한국어로 된 참고블로그
$ git filter-branch --force --index-filter \
'git rm --cached --ignore-unmatch filename' \
--prune-empty --tag-name-filter cat -- --all
✅ 여기서 filename 의 부분에는 정확한 경로까지 다 써줘야 한다. 그냥 filename 만 쓰면 제대로 동작하지 않아서 그대로 남아있는 걸 보게 된다.
위의 명령어를 해석하자면
이런 뜻이다.
이렇게 처리를 한 다음에는 제대로 지워졌는지 확인하는 과정이 필요하다.
// 현재 커밋의 추적 대상 확인
$ git ls-tree -r HEAD
// 현재 브랜치의 추적 대상 확인
$ git ls-tree -r master
이와 같은 명령어를 입력하면 레포안에 있는 추적되는 모든 파일이 터미널에 뜰 것이다.
이 목록에서 내가 지우고자 했던 파일이 없다면 성공적으로 지워진 것이다.
만약 이미 .gitignore 에 해당 파일을 넣었다면 상관없지만 아직 처리하지 않았다면 꼭 챙겨서 실수를 방지하자.
$ echo '파일이름' >> .gitignore
$ git add .gitignore
$ git commit -m "Add '파일이름' to .gitignore"
커밋을 덮어씌우기 때문에 --force 를 해서 하는 것이 맘 편할 것이다.
$ git push origin master --force
이렇게 잘 따라왔다면 정리가 되었을 것이다.
필자는 이렇게 처리한 레포를 깃허브로 미러링해서 퍼블릭으로 업로드했다.
😭 그냥 앞으로는 미리미리 예민한 정보는 잘 처리해두기로 하자...