방법 1: git filter-branch를 사용하여 파일 영구 삭제
1. 로컬 저장소 준비
- 작업할 로컬 저장소로 이동합니다.
- 최신 상태로 업데이트합니다.
git fetch --all
2. git filter-branch 명령 실행
git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch 경로/삭제할파일명" \ --prune-empty --tag-name-filter cat -- --all
- 예시
git filter-branch --force --index-filter \ "git rm --cached --ignore-unmatch secrets.txt" \ --prune-empty --tag-name-filter cat -- --all
3. 불필요한 객체 제거
git reflog expire --expire=now --all && git gc --prune=now --aggressive
4. 원격 저장소에 강제 푸시
git push origin --force --all
git push origin --force --tags
방법 2: BFG Repo-Cleaner 사용
1. 저장소를 복제하기 위한 새로운 디렉토리 생성 후 해당 위치에 BFG 파일 삽입
- BFG Repo-Cleaner 공식 사이트에서 .jar 파일을 다운로드합니다.
2. 저장소를 mirror 모드로 복제
git clone --mirror https://github.com/사용자명/저장소명.git
3. 저장소로 이동
cd 저장소명.git
4. BFG 실행하여 파일 삭제
java -jar bfg-X.X.X.jar --delete-files 삭제할파일명 저장소명.git
- 예시:
java -jar bfg.jar --delete-files secrets.txt my-repo.git
5. Garbage Collection 실행
git reflog expire --expire=now --all && git gc --prune=now --aggressive
6. 변경 사항을 원격 저장소에 강제 푸시
git push origin --force --all
git push origin --force --tags
주의
BFG Repo-Cleaner의 --delete-files 옵션이 파일의 이름만을 기준으로 매칭하며, java -jar bfg-1.14.0.jar --delete-files 'folder\file.py' repo.git
와 같이 파일 경로(디렉토리 포함)를 사용할 수 없습니다. 즉, --delete-files 옵션에서는 '/'나 '\'와 같은 디렉토리 구분자를 사용할 수 없습니다.
옵션 1: --delete-files 옵션에서 파일명만 사용하기
- 제한사항: 이 방법은 저장소 내 모든 file.py 파일을 삭제합니다.
- 명령어:
java -jar bfg-1.14.0.jar --delete-files 'file.py' repo.git
- 주의사항: 저장소 내 다른 디렉토리에 있는 file.py 파일도 모두 삭제됩니다.
옵션 2: --delete-folders 옵션을 사용하여 특정 폴더 삭제
- 폴더 전체를 삭제하고자 할 때 사용합니다.
- 명령어:
java -jar bfg-1.14.0.jar --delete-folders 'folder' repo.git
- 결과: folder 폴더 전체가 과거 모든 커밋에서 삭제됩니다.
방법 3: git filter-repo 사용
1. git filter-repo 설치 (Python이 설치된 상태에서 진행)
pip install git-filter-repo
2. 저장소 클론
git clone https://github.com/사용자명/repo.git
cd repo
3. 파일 삭제 실행
git filter-repo --path 'folder/file.py' --invert-paths
- 예시:
git filter-repo --path secrets.txt --invert-paths
4. 원격 저장소에 강제 푸시
git remote remove origin
git remote add origin https://github.com/사용자명/repo.git
git push --force --all
git push --force --tags