깃허브는.. 정말 쓰면 쓸 수록 모를 녀석이다...
이렇게 잊을만 하면 에러 포스팅을 하게 하다니...
왜 100MB 이상의 파일을 push하지 못하게 해놓은걸까... 나쁜 녀석들...
사실 이전부터 깃허브는 100MB 이상인 파일은 업로드하지 못한다는 것을 인지하고 있었으나 내가 오늘 push하려던 파일의 용량(618.76MB)을 미처 확인을 하지 못한 채 바보같이 push 해버렸다...
당연히 에러를 뱉어냈고..
remote: error: File <file path+name> is 618.76 MB; this exceeds GitHub's file size limit of 100.00 MB
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
위와 같은 에러들을 마주했다.
보통 큰 용량의 파일을 push 할 때는 2가지 방법이 있다.
1. git -lfs 적용
2. BFG Repo-Cleaner 적용
정말 뻔하게도..ㅎ 나는 두 가지 방법 모두 소용이 없었다.
우선 1번의 경우는 이미 큰 용량의 파일을 커밋한 이력이 있으면 적용이 되지 않는다고 한다.
나는 이미 커밋 후 push 하던 참에 오류가 난 것이니 당연히 적용이 되지 않았다.
2번의 경우는 시키는 대로 파일 다운 받고 명령어를 실행했지만 (이유를 알 수 없다..) 해결이 안되었다.
lfs와 BFG를 적용하는 방법은 아래 내가 참고했던 블로그의 링크에서 볼 수 있다.
위의 두 방법이 모두 통하지 않으니 이미 push 해 버린 파일들에 대해서
git push를 취소하는 방법을 써보기로 했다.
사실 이전에 강제로 push를 진행하면서 레포와 잔디를 날린 이력이 있어
push를 취소하는 방법이 안전할까에 대해서 의문이 들었지만..
나는 큰 용량의 파일을 원격 저장소에 업로드 하지 않아도 되었고, 협업하는 레포가 아니었기 때문에
레포가 날아가도 괜찮다는 마음가짐으로 시도를 해 보았다.
이 명령을 사용하면 자신의 local의 내용을 remote에 강제로 덮어쓰기를 하는 동시에 되돌아간 commit 이후의 모든 commit 정보가 사라지기 때문에 정말 주의해서 신중히 사용해야한다!
특히, 협업 프로젝트에서는 동기화 문제가 발생할 수 있으므로 협업 레포라면 비추천한다.. 다른 방법을 찾아봐야할 듯..
먼저,
git push를 취소하기 위해 먼저 가장 최근의 commit을 취소하고 워킹 디렉터리를 되돌려야한다.
$ git reset HEAD^
위의 명령어를 실행시켜 최근 커밋을 취소하고,
$ git reflog
git reflog 명령어를 사용하여 브랜치와 HEAD가 가리켰던 커밋 목록을 확인하여 내가 어떤 시점으로 되돌아갈 것인지 확인해야 한다.
돌아갈 시점을 확인을 했으면,
$ git reset HEAD@{number} #원하는 시점으로 되돌아가기
$ git commit -m "commit messages" #돌아간 시점에서 커밋하기
$ git push origin +master(branch name) #되돌린 시점을 원격에 강제 push
git reset HEAD@{number} 명령어를 실행시켜 원하는 시점으로 되돌린다.
시점을 되돌렸다면 되돌려진 상태를 커밋한 후 강제로 원격에 push를 해 준다.
나는 HEAD@{7}로 돌아가야했는데 실수로 {9}로 돌아갔다 ㅎ
이렇게 원하는 시점으로 돌아가면 로컬, 원격 모두 원하는 시점 이전의 상태로 돌아간다.
이전의 상태로 돌아갔다면 커밋 후 강제 push를 해주면 된다.
이렇게 git push를 취소하여 큰 용량의 데이터를 push하기 전의 상태로 돌아갔고
큰 용량의 데이터를 제외하고 올려야 할 파일만 다시 commit, push하여 제대로 원격 저장소에 push 되었다.