[Github] BFG : Gitlab에서 100M 이상 파일 제거해서 옮기기 + protected 문제 해결
Github은 파일 하나 당 용량을 100M 미만으로 지정하고 있다. 이번에 프로젝트를 끝내고 gitlab에 있는 레포리토리를 github으로 옮기려고 했는데, 파일 하나가 100M 이상이라고 reject가 떴다.
검색해보니 GIT LFS라고, github에도 100M 이상 파일을 올릴 수 있는 확장 프로그램이 있었지만, 이건 파일을 올리기 전에 미리 하는 예방 조치이고, 우리처럼 파일 업로드 후 여러 커밋을 진행한 다음에 할 수는 없는 모양이다. 파일을 지우더라도, 해당 파일을 업로드 했다는 커밋이 있으면 역시 안된다.
이 문제를 해결할 수 있는 다른 방법으로 BFG가 있다. BFG는 100M 파일에 관련된 커밋까지 지워주는 도구이다.
사용 방법
https://rtyley.github.io/bfg-repo-cleaner/
BFG Repo-Cleaner by rtyley
$ bfg --strip-blobs-bigger-than 100M --replace-text banned.txt repo.git an alternative to git-filter-branch The BFG is a simpler, faster alternative to git-filter-branch for cleansing bad data out of your Git repository history: Removing Crazy Big Files Re
rtyley.github.io
먼저 bfg를 다운로드 받아야 한다. 위 사이트에서
이 버튼을 통해 다운로드 받는다. 그럼 jar 파일이 받아지는 것을 확인할 수 있다.
다음으로 원본 레포지토리를 넣어둘 폴더를 만들고, mirror로 받아온다.
$ mkdir tmpdir $ cd tmpdir $ git clone --mirror git://example.com/some-big-repo.git
해당 폴더에 jar 파일도 옮겨준다. 폴더를 유지하면서 다음 명령을 실행한다. (java가 이미 깔려있다는 전제이다) 100M 이상 파일과 커밋을 지워주는 명령이다. bfg.jar는 자기가 받은 파일 이름으로 바꾸어주어야 한다. 나는 bfg-1.14.0.jar였기 때문에 bfg.jar 대신 bfg-1.14.0.jar으로 명령을 실행했다.
$ java -jar bfg.jar --strip-blobs-bigger-than 100M some-big-repo.git
이제 git 폴더 안에 들어가 변경 사항을 적용해주어야 한다.
$ cd some-big-repo.git $ git reflog expire --expire=now --all && git gc --prune=now --aggressive
이러면 끝이다! 이제 push 해주면 된다.
Protected by 'HEAD'
WARNING : The dirty content above may be removed from other commits, but as the *protected* commits still use it, it will STILL exist in your repository
하지만 나는 이걸로 끝이 아니었다. push를 하니 reject가 여전히 뜨는 것을 확인할 수 있었다. 에러 원인을 찾아보니 다음과 같은 경고문이 뜬 것을 확인할 수 있었다.
100M가 넘는 DBDump.sql이라는 파일이 HEAD에 의해 보호되고 있기 때문에 지울 수 없었다는 메세지다. 다른 브랜치나 커밋에서는 삭제되었지만, HEAD에 남아 있는 커밋은 삭제할 수 없다고 한다. 이 때에는 delete-files 같은 옵션으로도 해당 파일을 삭제할 수 없다.
다음 명령을 사용해야 삭제가 가능하다. 다시 tmpdir 폴더로 돌아가서 실행한다.
$ java -jar bfg-1.14.0.jar --strip-blobs-bigger-than 100M some-big-repo.git --no-blob-protection
--no-blob-protection : protection을 신경 쓰지 않고 삭제를 진행한다는 옵션이다.
짜잔! 보호받던 DBDump.sql이 삭제된 것을 확인할 수 있다. 다시 git 폴더로 들어가 git reflog expire ~ 로 변경 사항을 적용해준다. 이제 github에 push가 가능하다. push 후 확인해보면
이처럼 DBDump.sql이 삭제된 상태로 올라왔다는 걸 알 수 있다.