본문 바로가기
Git

git에서 잘못 올린 파일의 이전 내역을 전부 제거하는 방법

by 개발지망생 2023. 10. 12.

😊 이 글을 쓰게 된 계기

처음부터 잘 설정하여 env파일 같은 중요파일을 .gitignore에 잘 설정하여 올리면 아무 문제 없지만 나중에서야 그런 부분을 캐치하게 되면 마음이 아픕니다. 나중에 알게 됐기 때문에 그 이전에 올린 git 이력들에 포함 된 history가 많으면 많을 수록 더욱 심란해지죠... 그러한 일이 없길 바라지만 있다면 있다면 손가락만 빨 순 없으니 최근 이런 심란한 일을 겪은 김에 해결방법을 공유 합니다.

 

👩‍💻 해결 방법

가. 파일 삭제

1) 전체 branch에서 파일을 삭제하는 경우

맨 마지막에 보이는 cat 단어 뒤에 붙는 -- --all 을 붙이는 경우 모든 branch에 있는 파일을 삭제하게 됩니다. 

git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 경로/파일명.확장자' --prune-empty --tag-name-filter cat -- --all
💡 --cached 속성
 해당 속성을 사용하면 github에서만 삭제가 되면 본인이 사용하는 local은 삭제가 안됩니다. 반대로 해당 속성을 안 적을 경우 본인 local에서도 삭제가 되니 주의해야 합니다.

 

2) 해당 Branch에서만 파일을 삭제하는 경우

현재 사용하고 있는 브랜치의 히스토리를 제거 할 시 바꿀 필요없이 진행하면 됩니다. 다른 브랜치의 히스토리를 제거하고 싶으시다면 아래와 같이 진행하면 되며, 위와 다르게 cat 뒤에 -- --all 속성을 빼고 진행 하면 됩니다.

// dev 브랜치인 경우(다른 브랜치일 경우 dev 자리에 다른 브랜치명을 적어주면 됩니다)
git checkout dev
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 경로/파일명.확장자' --prune-empty --tag-name-filter cat

 

3) 파일이 아닌 폴더를 제거하고 싶은 경우

파일과 다른점은 폴더명을 적고 git rm 옆에 -r 옵션을 붙입니다. 위와 같이 -- --all 옵션은 선택 사항입니다. 폴더에도 경로가 있다면 경로/폴더명 으로 진행하면 됩니다.

git filter-branch --force --index-filter "git rm -r --cached --ignore-unmatch 폴더명" --prune-empty --tag-name-filter cat -- --all

 

나. 삭제 후 Git 데이터 정리

git filter-branch 명령을 실행하면 Git 이력이 변경되지만, 실제로 원래의 커밋들은 여전히 저장소에 남아 있습니다. 이는 filter-branch가 실수로 데이터를 손실하는 것을 방지하기 위한 안전장치입니다. 하지만 이로 인해 Git 저장소의 용량이 커질 수 있습니다. 따라서 filter-branch 명령을 실행한 후에는 아래와 같은 추가적인 단계를 거쳐서 불필요한 데이터를 정리하면 최적화가 가능 합니다.

 

rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune=all

 

rm -rf .git/refs/original/: filter-branch 명령이 만든 백업 참조들을 삭제합니다.

git reflog expire --all: reflog 항목(reflog는 HEAD나 브랜치 참조가 가리키던 과거의 커밋들에 대한 로그)을 만료시킵니다. git gc --aggressive --prune=all: "garbage collection" 을 수행하여 사용하지 않는 객체들을 정리하고, 저장소를 최적화합니다.

 

이러한 과정으로 Git 저장소의 용량을 줄일 수 있으며, 최적화가 가능합니다.

 

 다. 브랜치 push

// 브랜치가 dev인 경우(다른 브랜치일 경우 해당 브랜치명을 대신 쓰시면 됩니다.)
git push origin dev --force

변경 사항을 다 적용했으니 이제 적용을 할 차례입니다. 변경 사항에서 충돌이 날 수 있으니 --force로 강하게 밀어붙여 주시면 됩니다.

'Git' 카테고리의 다른 글

[Git] gitignore 작성법  (0) 2023.02.09
[Git] ssh key 생성 & 깃허브 ssh key 등록 방법  (0) 2023.02.09
[Git] Git 터미널 로그인 계정 변경  (0) 2023.02.01

댓글