GitHub 리포지토리에 보안정책에 위반되거나 민감한 정보를 실수로 업로드하는 경우가 있다. 해당 브랜치를 지우거나 커밋 히스토리를 밀어버려도 이미 머지된 Pull Request라면, 깃허브 UI의 closed request 탭에서 파일 히스토리를 확인하면 해당 내용이 그대로 남아 있어 별도의 조치가 필요하다.
1. 민감정보 파일 완전 삭제 (리포지토리 복제 및 재생성)
1-1. 기존 리포지토리 클론 및 민감 정보 제거
git clone --mirror https://github.com/username/repo.git
cd repo.git
# BFG Repo-Cleaner 다운로드
curl -L -o bfg.jar https://repo1.maven.org/maven2/com/madgag/bfg/1.13.0/bfg-1.13.0.jar
# 민감한 파일 깃 히스토리에서 완전 제거
java -jar bfg.jar --delete-files 'test.properties(삭제파일명)'
# Git Garbage Collection 수행 ( Git reflog를 만료 시키고, 쓰지 않는 객체 삭제 )
git reflog expire --expire=now --all
git gc --prune=now --aggressive
1-2. 기존 리포지토리에 클린 된 히스토리 강제 푸시
git push --force --all
git push --force --tags
1-3. 주의사항
- git push --force는 기존 히스토리를 덮어쓰기에 원격 리포지토리를 백업 권고
- 모든 협업자들에게 영향이 갈 수 있어 모든 협업자에게 변경사항을 공지하고 로컬 저장소를 다시 클론 하도록 안내 권고
1-4. 효과
이 과정을 거치면 다음과 같은 효과를 볼 수 있다.
- 기존 파일 히스토리에 민감한 정보가 포함된 파일을 완전히 제거
- 깃 히스토리의 각 객체를 정리하고 최적화하여 저장소 용량을 줄임
- 강제 푸시를 통해 수정된 내용을 원격 리포지토리에 적용하여 최종적으로 민감함 정보가 포함된 파일을 삭제
2. GitHub 지원팀에 문의
1번 방법을 사용하더라도 깃허브 UI를 통해 closed pull request의 파일 히스토리는 여전히 볼 수가 있다. 깃허브의 기본 작동 방식으로, 깃허브에서 pull request를 통해 추가된 변경 사항은 해당 PR이 머지되더라도, 깃허브에서 볼 수가 있다. 그러므로 민감정보 히스토리를 완전히 제거하려면 PR이 머지되기 전에 민감정보를 삭제하는 것이 중요하다.
완전히 제거하는 기능은 깃허브에서 기본적으로 제공하진 않는다. 이 경우 지원팀에 문의하여 해결하는 방법을 알아보도록 하자.
2-1. 깃허브 지원 페이지로 이동
https://support.github.com/requesthttps://support.github.com/request
https://support.github.com/request
2-2. 문의 유형 선택
"Remove data from a repository I own or control"
2-3. "Remove pull requests" 선택
comment에 업로드한 파일이나 이미지, 그 외 데이터를 삭제하려면 그에 맞는 옵션을 선택하면 된다.
2-4. 단일, 여러 개 PR 선택
2-5. 원하는 Pull request의 주소 입력
https://github.com/#https://github.com/#{owner}/#{repo}/pull/#{requestId} 형태
2-6. 깃 히스토리에서 이미 민감 정보를 제거했는지 확인
1번 스탭에서 제거를 했다면 Yes 선택
2-7. 히스토리 삭제로 문제가 해결됐는지 확인
No 선택
2-8. 깃허브 서포트 답변 확인
과정을 완료하고 기다리면 github support(https://support.github.com/https://support.github.com/)에 서포트 답변이 추가된다.
2-9. PR 중에 정확히 민감정보를 가지고 있는 히스토리의 SHA 히스토리 제공
Pull Reqest에서 민감 정보가 들어있는 파일을 찾아... 부분을 선택한다.
해당 파일의 히스토리 리스트에서 원하는 Pull Request의 SHA를 찾는다. (복사 버튼을 통해서 Full SHA를 제출해야 한다.)
2-10. 깃허브 서포트에 답변을 남긴다.
2-11. 해당 SHA와 연관된 전체 Pull Request 삭제, 혹은 민감 정보 부분만 삭제를 선택
전체 Pull Request 삭제 : 민감 정보가 노출될 여지없이 연관된 Pull Request 자체를 모두 삭제한다. 위험 요소를 모두 삭제하고 싶을 때 적용하면 되지만, 관련된 comment / history가 모두 삭제되기에 큰 프로젝트에서 중요한 변경 사항을 추적하기 힘들 수 있다.
내부 참조만 삭제 : comment / history를 남겨 민감 정보의 내부 참조만 삭제를 한다. 모든 참조가 삭제되지 않으면 데이터에는 여전히 접근 가능할 수 있기에 보안에 완전한 확신을 가질 순 없지만, Pull Request 자체는 남아있어 프로젝트 진행 상황을 추적할 수 있다.
이번 경우 “전체 Pull Request 삭제"를 선택하여 회신하였고, 정삭적으로 연관 Pull Request들이 모두 삭제됨을 확인할 수 있었다.