git 과거 커밋 내용 삭제/수정 (커밋내역에 secret 값들이 올라가있을 때 대처법)

julia·2022년 1월 7일
2
post-thumbnail

교훈 먼저 - secret 값 관리는 무조건 처음부터 잘하자😂😓

동아리에서 시작한 프로젝트를 이어서 빌드업 + 리팩토링 해보는 과정에 들어갔다.
얼마 전, 같은 백엔드 파트를 맡은 언니와 만나 얘기를 하던 중 우리의 repository를 public으로 돌리려고 했는데 생각해보니 우리가 전에 미래 걱정 없이 올렸던 secret 값들이 있었던 것..

커밋 내역에 그대로 남아있는 민감한 비밀 값들을 어떻게 가릴 것인지

고민하면서 겪은 시행착오와 경험을 남기려 한다.

  1. 중간 커밋 삭제
    이 방법은 너무 위험해보였다. 물론 rebase 로 하는 방식이 있겠지만 "중간" 커밋을 삭제하는 일은 아무래도 용기가 필요한 것 같다,, 무엇보다! secret key가 포함된 특정 파일에 관련된 내역만 지우고 싶은 것인데 만약 해당 커밋에서 다른 파일들도 수정했었다면 삭제 시 문제가 생길 수도 있어서 이 방법은 패스했다.
  2. git filter-repo / BFG repo-cleaner
    구글에 remove secrets from git history 라고만 검색해도 다양한 방법들이 나왔다. 그 중 https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/removing-sensitive-data-from-a-repository 이 문서를 보면 굉장히 쉽게 따라할 수 있게끔 정리가 되어있는데, 마지막에 보면 Fully removing the data from GitHub 단계에서 깃헙에 컨택해야 한다는 글이 있어 결국 다른 방법을 찾아보게 되었다.. (사실 어찌보면 우리가 마지막에 사용한 방법도 완전한 해결방법이 아닐 수도 있다.)

3. git filter-branch

우리가 결국 사용한 해결방법이다.

삭제든 수정이든 시크릿이 포함되어있던 파일 경로를 먼저 알아내야 한다.

우선 git log -S [노출된 시크릿 값] 으로 찾고자 하는 시크릿 값이 포함된 커밋 내역을 검색한다.
이후 git log -S "[노출된 시크릿 값]" [브랜치 이름] --name-only --pretty=format: | sort -u 명령어로 해당 시크릿 값이 어떤 파일에 포함되어 있었는지 확인한다.

과거 커밋에서 특정 내용이 포함된 파일 삭제

git filter-branch --index-filter \
    'git rm -rf --cached --ignore-unmatch path_to_file' HEAD
git push --all

다만 이 커맨드를 입력하면 커밋에서도 삭제가 되지만 로컬에서도 삭제가 될 수 있기 때문에, 로컬에서의 삭제 또한 의도하지 않는다면 커맨드를 입력하기에 앞서 백업은 필수다.

과거 커밋 내용 수정

git filter-branch -f --tree-filter "if [ -f [파일 이름] ]; then sed -i s/[노출된 시크릿 값]/[바꾸고자 하는 값]/g [파일 이름];fi"

을 입력해 커밋 내역에서 노출되었던 시크릿 값들을 전부 특정 값으로 바꿔준다.

예를 들어 파일 이름(경로)이 settings/prod.py 이고 노출된 시크릿 값이 12345 인데 이를 @@@@@로 바꾸고 싶다면
git filter-branch -f --tree-filter "if [ -f settings/prod.py ]; then sed -i s/12345/@@@@@/g settings/prod.py;fi" 라고 입력하면 된다.

커밋에 올라가있던 시크릿 값을 * 6개로 바꾼 결과

++ 참고 : git filter-branch 명령 되돌리기

출처 - https://ndb796.tistory.com/273

git filter-branch 명령은 프로젝트의 특정 내용을 전부 바꿀 수 있기 때문에 주의해서 사용해야 한다고 한다. filter-branch를 사용하기 전에는 git 프로젝트를 다시 clone 받아놓거나 어떤 방식으로든 백업해놓자!! 조심해서 나쁠 건 없다ㅎㅎ

git filter-branch 명령을 사용하면 깃 프로그램을 자동으로 백업을 수행해준다.

  • master 브랜치에서 명령을 수행한 경우 백업 파일 생성 경로:
    .git/refs/original/refs/heads/master

  • 백업본으로 되돌리는 커맨드:
    git reset --hard refs/original/refs/heads/master

profile
Move Forward

1개의 댓글

comment-user-thumbnail
2024년 1월 4일

macos에서는 sed 사용이 달라서 아래 처럼 수정해야해요. 참고해주세요!
git filter-branch -f --tree-filter "if [ -f [파일 이름] ]; then sed -i \"\" s/[노출된 시크릿 값]/[바꾸고자 하는 값]/g [파일 이름];fi"

답글 달기