본문 바로가기
Ect

git 저장소에 민감 정보 올라갔을 때 조치 | 특정 커밋만 삭제

by 고막고막 2021. 7. 4.

주니어라면 한번쯤은 겪을 상황이지만? 다시는 겪고 싶지 않은 상황... 바로 git에 secret key를 올려버린 것이다... 아찔! 급하게 레파지토리를 비공개로 전환하고 수습을 해야했다.

 

문제의 파일을 .gitignore에 추가하고 다시 push를 했으나 어림도 없지! 그대로 남아있다. 원격 저장소에는 이미 과거에 올린 문제의 파일에 대한 cash가 남아있기 때문.

 

재빨리 아래 명령어를 통해 cash를 날려주고,

git rm -m —cached [문제의파일명]
cs
 
다시 한번 더 push를 해주면! cash가 삭제되고 .gitignore에 파일명이 반영되어 있기 때문에 최신 커밋에는 더 이상 문제의 파일이 보이지 않게 된다.

 

 

 

그러나! 

문제의 파일이 존재하는 과거 커밋들이 문제. 여전히 누구나 history를 통해 문제의 파일에 접근이 가능한 상태.

그렇다면 최소 1개 이상의 과거 커밋을 reset 또는 rebase 해야 한다는 말인데, 문제의 파일을 push한 시점에서 최대한 빨리 이 사태를 알아차릴 수록 reset 또는 rebase 해야할 커밋 수가 줄어든다.

 

나의 경우는 7개 정도의 커밋을 reset 해야하는 상황이었다... 그나마 혼자 작업하는 레파지토리라서 천만 다행.

 

만약 문제의 파일이 포함된 커밋에 다른 팀원의 커밋도 포함되어 있는 상황이라면... 협의 후에 rollback 해야할 필요가 없는 커밋들이라고 판단된 후에... reset을 진행해야할 것 같다.

 

 

여기서 우리가 하고싶은 일은 4, 5, 6번 커밋을 모두 날리고 3번 커밋 뒤에 정상적인 상태인 7번 커밋을 이어 붙히는 것!

 

먼저 7번 커밋을 git clone을 통해 별도의 디렉토리에 백업해두고 시작한다. 그리고 다시 레파지토리로 돌아와 checkout을 한다. 그러면 HEAD가 3번 커밋으로 옮겨질 것이다.

git checkout [3번 커밋 ID]
cs

그리고는 과감하게! hard 옵션으로 reset을 진행한다. 위 그림의 예시에서는 총 4개의 커밋을 reset 해야 하므로, HEAD~4

Git reset —hard HEAD~4[reset할 수량]
cs

 

reset을 하니 위와 같은 상태가 되었다. 이제 아까전에 정상 상태의 7번 커밋을 이어붙힐 차례이다.

먼저 임시로 새로운 branch를 만들고, 그곳으로 이동한다.

git checkout -b fix
Switched to a new branch 'fix'
cs

 

그리고는 임시 branch 'fix'에 clone 해두었던 7번 커밋 파일을 덮어쓰기 할 것이다.

 

이때 중요한 것은, 디렉토리에서 숨김파일을 해제해 .git 폴더를 완전히 삭제해 이전의 커밋 로그들을 없앤 순수 소스코드 파일을 붙여넣어야 한다는 것 !!

이제 다시 master 브랜치로 돌아와 fix 파일을 merge 하고, 그냥 push를 하면 충돌이 발생하기 때문에 force 옵션으로  pull을 할 것이다.

git checkout master
git merge fix
git commit -m "latest commit merge"
git -f push origin master
cs

자! 이제 거의 다 왔다 ㅠㅠㅠㅠ 깔끔하게 fix 브랜치를 제거하고 제거한 fix 브랜치를 push 해주기만 하면, 원격 저장소에서 fix 브랜치가 말끔하게 지워지는 것을 확인할 수 있다.

git branch -d fix
git push origin :fix
cs

이렇게 해서 secret key가 나의 레파지토리의 모든 곳에서 사라진 상태가 되었다!

 

+) 2시간 동안 같이 삽질하며 도와준 친구 M 정말 고맙다... 이 글이 같은 문제로 삽질한 누군가에게도 도움이 되었으면 한다... 배포 시 민감정보 주의 또 주의

 

 

📌 요약

1. 문제의 파일이 포함된 커밋이 완전히 사라져도 프로젝트에 영향을 미치지 않을 때에만 사용 가능한 방법
2. .gitignore에 문제의 파일명을 추가, 해당 파일의 캐시를 삭제, 최신 상태의 커밋을 백업해놓는다
3. 문제의 파일이 포함된 커밋 직전 커밋으로 이동해 그 이후의 커밋들을 모두 reset
4. 임시 브랜치를 만들어 최신 상태의 파일을 덮어쓰기
5. 원래 브랜치에 merge 후 강제 push
6. 임시 브랜치 삭제

 

'Ect' 카테고리의 다른 글

SVN repository 생성 및 커밋하기  (0) 2019.12.16
Git Repository 생성 & 업로드  (0) 2019.06.18
마크다운 용법  (0) 2019.05.17
UNIX 자주 쓰는 명령어 모음  (0) 2019.02.08
LINUX 자주 쓰는 명령어 모음  (0) 2018.11.27