프로젝트를 진행하다 보면 개인 API Key나 DB 연결 URL, Secret Key 등을 사용하게 된다. 이것들은 결코 외부에 유출 되면 안 되는 것들이다. 하지만 이런 보안 사항에 대해 잘 모르거나 Private Repository로 진행하다 Public으로 변경할 때 문제가 생긴다.
지금 까지의 커밋을 지우기에는 아깝고 커밋 하나하나를 수정하는 것은 어렵다. 이럴때에는 git-filter-repo를 사용하면 간편하게 해결할 수 있다.
아래 링크의 공식 문서와 레파지토리에서 자세한 내용을 살펴 볼 수 있다.
레파지토리 : https://github.com/newren/git-filter-repo#simple-example-with-comparisons
문서 : https://htmlpreview.github.io/?https://github.com/newren/git-filter-repo/blob/docs/html/git-filter-repo.html#DISCUSSION
여기서는 전체 커밋에서 파일 삭제, 파일 편집 2가지 경우를 살펴 볼것이다.
작업전 백업 필수
먼저 설치 git-filter-repo를 설치한다. (macOS 기준)
brew install git-filter-repo
윈도우 같은 경우에는 Scoop를 이용하여 설치 가능할 것이다. 자세한 사항은 아래 링크에서 확인 가능하다.
https://github.com/newren/git-filter-repo/blob/main/INSTALL.md#installation-via-package-manager
그다음 새로운 폴더를 만들어 레파지토리를 클론한다. (기존 작업 폴더에 해도 상관 없지만 파일 안전을 위해 새로 만들었다)
git clone [리포지토리 URL]
프로젝트 폴더로 이동
cd [프로젝트 이름]
전체 레파지토리 기록 다운
git pull --all --tags
여기서 부터 2가지 방법으로 나뉜다.
아래 명령어 [FILENAME]에 삭제하고자 하는 파일명을 적으면 된다.
git filter-repo --use-base-name --path [FILENAME] --invert-paths
먼저 프로젝트 폴더에 replacements.txt 빈 파일은 만든다. 그리고 아래 형식과 같이 ('변경할 현재 코드'==>'변경할 코드') txt 파일을 작성한다. 예를들어 아래 형식은 abc를 ###으로 변경하는 것이다.
abc==>###
def==>***
작성후 아래 명령어를 실행하면 적용 된다.
git filter-repo --replace-text replacements.txt
잘 안 되면 더 강하게도 가능.(하지만 주의)
git filter-repo --replace-text replacements.txt --force
다 수정 했으면 깃허브에 푸쉬하면 된다. 푸쉬 하기전 이전 커밋으로 이동해 잘 변경 됐는지 확인하자.
git push --all --force