ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Git] 특정 파일을 Remote에 있는 과거 commit에서까지 전부 삭제하기
    개발 환경 2022. 2. 6. 21:55

    문제 상황

    이번 게시글이 특정하는 상황은 다음과 같습니다.

    기존에는 A파일이 공개해도 되는 파일이었지만 개발을 하다 보니 A파일을 비공개로 전환할 필요가 있을 때가 있습니다.

    이럴 때 .gitignore에 제외 항목으로 등록하더라도, 과거에 작성한 commit에는 A파일의 흔적이 남아있게 됩니다.

    또는 A파일을 비공개로 해야 했기에 레포지토리를 private로 생성했다가, 나중에 필요에 의해 레포지토리를 public으로 변경해야 할 때가 있습니다.

    이 때도 역시, 기존의 commit에 남아있는 A파일의 흔적을 지우지 못하면 public으로 전환할 수가 없습니다.

    이러한 상황들에서 A파일의 흔적을 완전히 지우고 싶을 때 지금 소개해드리는 방법을 사용하시면 됩니다.

    파일의 흔적을 완전히 지우는 방법

    일단, 첫 번째로 .gitignoreA 파일을 기입한 뒤, remote에 푸쉬해줍니다.

    이렇게 하더라도 기존에 있던 A파일은 .gitignore의 영향을 받지 않습니다. 따라서 cache를 모두 지우고 다시 커밋해주어야 합니다.

    git rm -r --cached .
    
    git add .
    
    git commit -m "clear git cache"
    
    git push

    이제 현재 commit을 기준으로 A파일을 완벽히 숨겼습니다.

    두 번째로, 이전의 모든 commit에서 A파일을 지워줍니다.

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

    제 경우에는 Firebase와 연동할 때 필요한 파일인 GoogleService-Info.plist파일에 적용했기 때문에

    위의 코드에서 <경로/.../파일명.확장자>부분만 GoogleService-Info.plist와 같이 변경하시면 됩니다.

    모든 commit을 순회하며 GoogleService-Info.plist파일을 삭제하고 있다.

    전부 삭제가 되었다면,

    git push --force --all

    을 통해서 remote에 적용해주시면 됩니다.

    출처

    hue님의 지식보따리

    댓글

Designed by Tistory.