GitHub Large File 지우기 (Feat. GitLab→GitHub Repository 복사하기)

루리·2022년 11월 29일
0
post-thumbnail

오늘 블로그 이름이 더더욱 와닿는다.
진짜 봐도 봐도 새롭다.

GitHub Large File 지우기

알고 싶게 된 계기

GitLab 유료 요금제를 사용하는데, Pro가 아닌 Git Hub 계정으로 옮기려고 미러링을 시도하니, 50mb가 넘는 파일은 올라가지 않는다...!

그래서 어찌저찌 대학 이메일로 Pro를 획득했는데도, 100mb가 넘는 파일(무려 300mb!)이 있어서 불가능...


미러링을 포기하고, 그냥 set-url을 변경하여 push를 시도했지만 그것도 안 된다...
커밋 이력을 포기하면 로컬에서 파일만 지우고 새로 push하면 되지만 기록 집착러인 나에게는 절대 안 되구요?

그래서 약 3주간의 일대기가 시작되고, 결론적으로 Large File 자체를 지우는 방식으로 성공했다.
이 Large File을 지우는 과정도 쉽지 않았기 때문에 나의 프론트 센세에게 배운대로 기록을 남기려 한다.

지우려는 타겟 폴더(파일)는 아래 내용에서는 src/main/resources/sql로 통일했습니다.

첫 시도

로컬과 원격 저장소에서 파일 자체를 지우고 미러링을 시도했다.

git rm -r --cached src/main/resources/sql

물론 안됨.
커밋 이력까지 옮겨야 하는데, 커밋 이력에 있는 파일은 지워지지 않았기 때문. 당연함.

2트 * 4

git filter-branch -f --index-filter "git rm -rf --cached --ignore-unmatch src/main/resources/sql" HEAD

이걸로 열심히 지울 폴더 한땀한땀 했다.
-f 붙이라고 해서 -f도 열심히 붙였다.
다 지우고 열심히 commit - push 했다.

이렇게 열심히 했는데도 라지 파일 error가 뜨면서 미러링을 안 해준다.

13:push to mirror: git push: exit status 1, stderr: "remote: warning: File src/main/resources/********.csv is 60.66 MB; this is larger than GitHub's recommended maximum file size of 50.00 MB \nremote: error: Trace:


내가 뭘 잘못한 줄 알고
4번이나 시도해서 이렇게 커밋 이력이 전체 다 4개로 복사가 되었다.......

3트

그래서 미러링을 포기하고,

git branch main
git checkout main

git remote set-url origin https://github.com/레포계정/옮길레포.git

git push origin main

캐시 지운 상태에서 push만 해줬다.
당연히 호락호락하게 Git은 push 해주지 않았다.

.
.
.
😢

파일이 잘 지워졌는지 확인하기 위해 아래 명령어를 실행해줬다. 출처

git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
  sed -n 's/^blob //p' |
  sort --numeric-sort --key=2 |
  cut -c 1-12,41- |
  $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest


응 하나도 안 지워졌어...

4트

bfg-repo-cleaner
나의 프론트 센세가 어디선가 이걸 찾아왔다.

사용하는 방법

하기 전에 먼저 레포 remote 바꿔주기

git branch main
git checkout main

git remote set-url origin https://github.com/레포계정/옮길레포.git

git push origin main

먼저 java가 잘 있는지 확인해준다.

java -version


잘 있다고 하네요.

bfg-repo-cleaner 이 사이트에서 파일을 다운로드를 해준다.

그리고 파일을 삭제할 .git 폴더가 있는 repository의 하위 폴더에 파일을 옮겨준다.
예를 들어, 이렇게 ↓

temp(예시) 폴더의 주소창을 눌러 레포지토리 하위 폴더가 경로인 cmd 창을 띄워준다.

cmd (스페이스 바)

아래 명령어를 입력해주면 git filter-branch와는 다르게 아주 빠른 속도로 뭔가를 다 지워준다.

java -jar bfg-1.14.0.jar(다운받은 jar 파일 이름) --strip-blobs-bigger-than 100M project(repository 폴더 이름)

이렇게 샤라락 다 지워주고요...
너무 빨리 지워줘서 오류난 줄...

이 친구는 마지막에 친절하게 뭘 해야되는지도 알려준다.

다시 프로젝트 .git이 있는 폴더에서 Git Bash를 열어주고,

git reflog expire --expire=now --all && git gc --prune=now --aggressive

시키는 대로 명령어를 입력한다.

파일이 잘 지워졌는지 확인하기 위해서 다시 명령어를 실행해주었다.

git rev-list --objects --all |
  git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' |
  sed -n 's/^blob //p' |
  sort --numeric-sort --key=2 |
  cut -c 1-12,41- |
  $(command -v gnumfmt || echo numfmt) --field=2 --to=iec-i --suffix=B --padding=7 --round=nearest

이전과 비교해보면, 100mb 넘는 파일이 깨끗하게 사라졌다.

git push origin main

push를 해보면 잘 된다.

결과 확인

비어있던 repository에 잘 추가된 것과 커밋 이력도 그대로 남아있는 것을 확인할 수 있다.

잔디도 잘 심어진다.

profile
안녕하세요

0개의 댓글