2024. 3. 15. 17:09ㆍGit
프로젝트가 마무리 될 때 쯤
원격저장소에 보이면 안되는 파일이 있었다,,
바로 GoogleService-Info.plist 파일이었다
분명 .gitignore에 설정을 해놓았지만 왜 때문인지 올라간 것 이었다
이유를 찾아보니 캐시 때문이라고 한다
우선 캐시를 삭제해주자..!
1. git rm -r --cached .
현재 branch의 모든 디렉토리 파일에서 캐시를 제거하는 명령어
git rm: 파일 삭제-r: 하위 디렉토리 포함--cached: 캐시.: 디렉토리의 모든 파일
→ 현재 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의 커밋 히스토리에서 특정 파일을 찾아 제거하는 명령어
git filter-branch: 커밋 히스토리 재작성--force: 강제 커밋--index-filter: 커밋 인덱스 수정'git rm --cached --ignore-unmatch 경로/파일명.확장자'git rm: 파일 삭제--cached: 캐시--ignore-unmatch: 파일이 존재하지 않아도 넘어감경로/파일명.확장자: 제거할 파일의 경로
--prune-empty: 필터링 작업 후 결과적으로 빈 커밋이 생성되었을 경우 해당 빈 커밋을 제거--tag-name-filter cat: 모든 커밋 태그를 그대로 유지-- --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은 모든 브랜치를 의미하는거기 때문에 현재 브랜치만하고 싶으면 빼자