repo 에서 api key와 같은 민감한 정보 지우기

이라운·2023년 1월 12일
0

⚠️ 민감한 정보를 실수로 같이 레포에 올렸을 때

구글 API 키 같은 것을 실수로 레포에 올리는 경우가 있다. 급하게 바꿔서 .gitignore 에 올렸다고 하더라도 이미 커밋 기록에 해당 파일이 같이 올라가 있어서 결국은 키가 공개되는 것은 따로 조치를 해줘야 한다.

git filter-branch

깃에는 이미 이와 같은 처리를 도와주는 명령어가 있다. git-filter-branch 를 사용하면 따로 인스톨할 필요없이 처리가 가능하다.
다만 이건 브랜치 기준으로 정리를 해주기 때문에 필자처럼 이미 모든 프로젝트가 마무리되어 master만 남아있는 상황이 아니라면 모든 브랜치에 대해서 처리를 해줘야 하기 때문에 불편할 수 있다.

1. 기존 프로젝트를 fork 해온다.

프로젝트 자체에 해도 되기는 하지만, 그러다가 혹시라도... 맘아픈 상황이 올 수도 있으니 원본을 fork 해놓고 해당 레포를 처리해주는 것이 좋다.

깃랩에서는 저렇게 fork 버튼을 누르면 할 수 있다.

2. 로컬에 빈 폴더를 만들고 fork 한 레포를 연결한다.

// 연결해주고
$ git clone '저장소 링크' 

// 아래 레포 폴더로 이동한다.
$ cd '폴더'

3. filter branch 명령어 입력

아래의 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 만 쓰면 제대로 동작하지 않아서 그대로 남아있는 걸 보게 된다.
위의 명령어를 해석하자면

  • filter-branch 를 사용해서 트리를 뒤질건데 강제로 뒤질 것이며 --index-filter 를 사용하여 더욱 빠르게 처리할 수 있도록 한다.
  • filename 과 관련된 것들을 지울 것인데, 트리에서 관련된게 없으면 에러를 발생시키는 것이 아닌 무시를 해주면 된다.
  • 비어있는 커밋이 생기게 될텐데 그 커밋을 지우거나 새로 쓰는 방법은 --tag-name-filter cat 방식에 따르며 모두에 적용시킨다.

이런 뜻이다.

4. 확인

이렇게 처리를 한 다음에는 제대로 지워졌는지 확인하는 과정이 필요하다.

// 현재 커밋의 추적 대상 확인
$ git ls-tree -r HEAD

// 현재 브랜치의 추적 대상 확인
$ git ls-tree -r master

이와 같은 명령어를 입력하면 레포안에 있는 추적되는 모든 파일이 터미널에 뜰 것이다.
이 목록에서 내가 지우고자 했던 파일이 없다면 성공적으로 지워진 것이다.

5. gitignore 처리

만약 이미 .gitignore 에 해당 파일을 넣었다면 상관없지만 아직 처리하지 않았다면 꼭 챙겨서 실수를 방지하자.

$ echo '파일이름' >> .gitignore

$ git add .gitignore

$ git commit -m "Add '파일이름' to .gitignore"

6. 원격 레포 업데이트

커밋을 덮어씌우기 때문에 --force 를 해서 하는 것이 맘 편할 것이다.

$ git push origin master --force

이렇게 잘 따라왔다면 정리가 되었을 것이다.
필자는 이렇게 처리한 레포를 깃허브로 미러링해서 퍼블릭으로 업로드했다.

😭 그냥 앞으로는 미리미리 예민한 정보는 잘 처리해두기로 하자...

profile
Programmer + Poet = Proet

0개의 댓글