팀원분께서 예전에 aws key를 yml파일에 넣으셨다. 이때 문제를 인식하고 커밋이 안 쌓였을 때 지웠어야 하는데 이런저런 핑계를 대며 지우지 않았는데 오늘 레포를 public으로 변경했는데 문제가 터졌다.
보통 가장 최근 커밋은 git reset HEAD
로 지울 수 있는데 한참 전 기록이 발목을 잡았던 것이다. 이를 해결하는데 겪은 고난을 소개하고자 한다.
민감 정보를 지우는데는 2가지 방법이 있다.
- 전체 커밋 기록을 지우고 다시 push 하기
- git bfg를 사용하기 → 커밋 중 파일의 몇몇 부분을 변경할 수 있다.
1번은 개인적으로 커밋한 흔적은 어떻게보면 버전인데 버전을 모두 지우기에 risk가 너무 크다는 생각이 들었다.(고생한 흔적도 지워지고) 그렇기에 2번을 이용해 커밋 기록을 그대로 남기면서 어떻게 민감 정보를 변경했는지 소개하고자 한다.
brew를 사용할 수 있다는 가정하에 작성한다.
bfg는 git-filter-branch의 대안으로 나온 repo cleaner이다. scala로 작성돼 git filter branch보다 빠를 뿐더러 사용하기 매우 간편하다.
mac의 경우 brew를 이용해 간편히 설치할 수 있다.
1
brew install bfg
지우려는 기록은 다음과 같다.
이후 project의 root directory에서 password.txt라는 파일을 만든다.(다른 이름도 괜찮다.) regex 문법을 이용하는데, regex를 크게 몰라도 간편하게 사용할 수 있다. 다음과 같은 형식을 사용하면 된다.
1
{민감정보}==>{변경정보}
관련해서 구체적인 예시는 다음 사이트를 보면 이해가 더 잘된다.
이 때 yml파일 같은 경우 앞의 공백이 생기기 때문에 이를 맞춰주려면 공백도 그대로 포함해야 한다.
이를 저장하고 다음과 같은 커멘드를 입력한다.
1
bfg --replace-text password.txt
성공적으로 진행되면 다음과 같이 나온다.
민감 정보가 들어있는 yml 파일이 변경됬다고 잘 나온다. 그리고 마지막에 있는 command를 입력한다.
1
git reflog expire --expire=now --all && git gc --prune=now --aggressive
이후 다른 repo를 새로 만들어서 git push하면 된다.