[Git] History에서 특정 파일삭제

2024. 3. 15. 17:09Git

프로젝트가 마무리 될 때 쯤

원격저장소에 보이면 안되는 파일이 있었다,,

바로 GoogleService-Info.plist 파일이었다

분명 .gitignore에 설정을 해놓았지만 왜 때문인지 올라간 것 이었다

이유를 찾아보니 캐시 때문이라고 한다

우선 캐시를 삭제해주자..!

1. git rm -r --cached .

현재 branch의 모든 디렉토리 파일에서 캐시를 제거하는 명령어
  1. git rm : 파일 삭제
  2. -r : 하위 디렉토리 포함
  3. --cached : 캐시
  4. . : 디렉토리의 모든 파일

→ 현재 branch에서 하위 디렉토리 포함 모든 파일에서 캐시를 삭제

이제 commit, push를 해주면 해당 파일은 안올라갈것이다

하지만 나의 상황은 이미 올라가서 History commit에서 삭제시켜줘야 한다 😭

먼저 작업을 하기전에 중요한게 있다

이제 History의 파일을 제거해보자

 

2. git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch 경로/파일명.확장자' --prune-empty --tag-name-filter cat -- --all

모든 branch의 커밋 히스토리에서 특정 파일을 찾아 제거하는 명령어
  1. git filter-branch : 커밋 히스토리 재작성
  2. --force : 강제 커밋
  3. --index-filter : 커밋 인덱스 수정
  4. 'git rm --cached --ignore-unmatch 경로/파일명.확장자'
    • git rm : 파일 삭제
    • --cached : 캐시
    • --ignore-unmatch : 파일이 존재하지 않아도 넘어감
    • 경로/파일명.확장자 : 제거할 파일의 경로
  5. --prune-empty : 필터링 작업 후 결과적으로 빈 커밋이 생성되었을 경우 해당 빈 커밋을 제거
  6. --tag-name-filter cat : 모든 커밋 태그를 그대로 유지
  7. -- --all : 모든 브랜치에 대해 작업을 수행

→ 모든 브랜치의 특정파일을 포함한 커밋에서 파일을 삭제하고 해당 커밋이 만들어진 빈 커밋을 제거해줘 그리고 커밋 태그를 그대로 유지하고 커밋 히스토리를 재작성

음,,,,, 우선 무지하게 긴 명령어다..

 

처음에 뜻도 모르고 블로그를 보고 일단 써봤다

파일을 삭제하는데 성공했지만 commit 개수가 달라져서 당황했다,,

파일을 삭제하고 싶은거지 commit을 삭제하고 싶진 않아서였다

 

이유는 --prune-empty 때문이었다.

이 명령어는 커밋에서 특정파일이 삭제되면 빈 커밋이 되기때문에 필요없는 커밋이라 생각하고 삭제하는 명령어다.

즉 특정 파일만 올린 commit 이었던거다 (이 파일만 올라간 commit이 왜 있는지는 의문이다..)

 

아무튼 상관없는 커밋이지만 나는 기존 브랜치와 커밋 개수가 달라지는건 원하지 않아서 --prune-empty 는 뺐다.

그리고 나는 현재 브랜치만 작업을 해주고싶어서 -- --all 도 뺐다.

 

이 두 옵션은 선택이다. 나머지는 해줘야 한다.

 

작업이 성공하면

Ref refs/remotes/origin/main was rewritten

이라는 문구가 뜬다.

실패하면 파일 경로를 잘 적어주었는지 확인하자!!

 

이제 성공하면 커밋 히스토리를 변경하면서 커밋 해시값이 싹 다 바뀐다.

이제 add, commit, push를 해서 커밋 히스토리가 변경된 브랜치로 바꿔주자

히스토리가 변경되었기 때문에 push할때 강제푸시를 해야한다 (backup 브랜치를 만들라고 한 이유)

 

git push origin --force --all

  • all은 모든 브랜치를 의미하는거기 때문에 현재 브랜치만하고 싶으면 빼자