본문 바로가기
CS/삽질로그

[Git] git push size limit 오류 해결하기 (해결 완료, rebase, git-lfs)

by judy@ 2023. 5. 4.

목차

  1. 문제 상황
  2. 문제 파악
  3. 문제 해결 방법
    1. 이전 커밋 rebase로 수정하여 대용량 파일 배제하기 (git rebase)
    2. git-lfs로 대용량 파일 관리하기

문제 상황:

추천 시스템 데이터를 다운로드하여 프로젝트에서 사용하고 있었는데, ignore에 등록하였지만 잘 반영이 안되었다. 그래서 자꾸 add .  할 때마다 데이터가 포함되어 저장되어 사이즈 오류를 발생시켰다.

apt/deb repos: curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash

아래 에러메세지를 보면, GitHub의 파일 크기 제한이 100MB인데, 118.21MB 크기의 csv 파일이 있어 업로드가 안된다고 뜬다. 해결하기 위해서는 https://git-lfs.github.com의 Large File Storage를 찾아가보라고 한다.

$ git push
Enumerating objects: 42, done.
Counting objects: 100% (39/39), done.
Delta compression using up to 12 threads
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.71 MiB | 3.82 MiB/s, done.
Total 31 (delta 15), reused 0 (delta 0)
remote: Resolving deltas: 100% (15/15), completed with 2 local objects.
remote: error: Trace: #########################################################
remote: error: See https://gh.io/lfs for more information.
remote: error: File ########/####/#####.csv is 118.21 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.
To https://github.com/twndus/competition-log.git
 ! [remote rejected] main -> main (pre-receive hook declined)
error: failed to push some refs to 'https://github.com/twndus/competition-log.git'

일단, 메세지만 대충봐도 lfs를 설치하고 적용한다고 해서 위 오류가 해결되지는 않을 게 눈에 훤하다. 결론적으로도 그랬고. 하지만 해결했고 어떻게 해결하였는지 방법을 아래에 기술하였다.

문제 파악

  1. 대용량 파일이 가장 최신이 아닌 이전 커밋에 포함됨
  2. 대용량 파일은 절대 이렇게는 올릴 수 없음

문제 해결 방법

  1. 이전 커밋에서 대용량 파일을 제거한다 (rebase 이용)
  2. 대용량 파일은 git-lfs로 따로 추적한다

이전 커밋에서 대용량 파일 제거 방법

1. 대용량 파일 관련 커밋 확인하기

# 확인 방법
$ git log --follow [대용량 파일명] 

# 예시
$ git log --follow open/train.csv
commit bca####################################
Author: ####################################
Date:   Mon May 1 16:34:53 2023 +0000

    feat: mean based model added, bad performance #2

commit 178####################################
Author: ####################################
Date:   Tue May 2 15:21:58 2023 +0000

    add book-data

commit dab####################################
Author: ####################################
Date:   Sat Apr 29 13:21:43 2023 +0000

    feat: only country model update

저 커밋들은 모두 수정해야 한다. 

 

2. 가장 오래된 커밋이 얼마나 오래되었는지, git log를 찍어 확인해보자

- 나의 경우 'feat: only country model update'라는 커밋이 뒤에서부터 10번째에 위치했다!

 

3. rebase 명령어를 통해 수정할 커밋을 선택한다.

아래 명령어를 입력하면 pick으로 시작하는 문장이 나열되어 있다. 문장은 아래와 같이 구성된다. 아래의 구성에서 command 부분은 모두 pick으로 되어 있을텐데, 위에서 수정해야 하는 커밋의 목록을 확인하였으니 위 커밋들에 대해서는 command 부분을 pick -> edit으로 변경한 뒤 저장해준다.

- 문장 구성: [Command] [commit-hash] [commit-msg]

$ git rebase -i HEAD~10
edit ####### feat: only country model update
pick ####### ##############################
pick ####### ##############################
pick ####### ##############################
pick ####### ##############################
edit ####### add book-data
pick ####### ##############################
pick ####### ##############################
pick ####### ##############################
pick ####### ##############################
pick ####### ##############################
edit ####### feat: mean based model added, bad performance #2
pick ####### ##############################

위와 같이 수정한 뒤 저장하면, edit 상태의 커밋 세 개에 대해서 수정할 수 있게 되고, 오래된 -> 최신 순으로 하나씩 수정할 수 있다. 저장한  직후에는 가장 첫 edit인 "feat: only ..."의 커밋 직전 상태로 세팅된다.

 

4. 이제 커밋을 수정한다

커밋의 수정은 원하는 방향으로 수행하면 되는데, 내가 겪은 size limit 오류의 경우, 대용량 파일을 커밋에서 배제해야 하므로 다음의 명령어를 이용하여 삭제하였다.

# 대용량 파일 커밋에서 배제 방법
$ git rm --cached [대용량파일명]

# 예시: open directory 아래의 모든 대용량 파일에 대해서 add를 취소
$ git rm --cached open -r

이 외에도 필요한 파일을 git add로 추가한다거나, 특정 파일의 내용을 수정한다거나 할 수 있음.

 

5. 커밋 수정 내역 반영

첫 번째 커맨드를 통해서는 위에서 수정한 내용을 기존 커밋에 반영할 수 있고, 아래 명령어를 통해서는 위 명령어로 수정한 커밋을 rebase로 반영할 수 있다. 

# 커밋에 수정 사항 반영
$ git commit --amend

# 수정한 커밋을 반영
$ git rebase --continue

 

6. 여러 개의 커밋 수정, 반영

4번과 5번을 반복하여 수행하며, edit 상태의 커밋에 모두 수정 사항을 반영한다. 다 하고 나면 "Successfully ..." 메세지가 나올 것이다.

 

이렇게 한 뒤, 다시 프로젝트를 push하면 대용량 파일을 뺐기 때문에 문제 없이 push된다.

$ git push
Username for ''###################':
Password for '###################':
Enumerating objects: 47, done.
Counting objects: 100% (47/47), done.
Delta compression using up to 12 threads
Compressing objects: 100% (36/36), done.
Writing objects: 100% (36/36), 2.67 MiB | 2.82 MiB/s, done.
Total 36 (delta 23), reused 0 (delta 0)
remote: Resolving deltas: 100% (23/23), completed with 4 local objects.
To '###################':
   ######..######  main -> main

git-lfs로 대용량 파일 추적하는 방법

각 os에 대하여 다음 링크에서 설치 방법을 알 수 있으나, 나는 vm을 사용하고 있어 ubuntu 용으로 간략하게 기술해보겠다.

 

1. Git LFS 설치하기

linux git-lfs installation 방법에서 아래 코드를 찾아 다운로드함 (ubuntu 기반의 os 사용중)

# ubuntu 설치 방법 (apt/deb repos)
$ curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash
$ sudo apt-get install git-lfs

# 설치 확인
$ git-lfs
git-lfs/3.3.0 (GitHub; linux amd64; go 1.19.3)
git lfs <command> [<args>]
... (이하 생략) ...

2. 대용량 파일 관리

아래 코드는 git 프로젝트 내 csv 파일을 모두 대용량으로 관리하겠다는 의미이다. 자세한 내용은 다음 링크에 있다.

# csv 파일 대용량으로 관리
$ git lfs track *.csv

3. 이 내용에 대해 커밋 및 푸시하면 따로 대용량 파일로 관리된다.

Uploading LFS objects: 100% (3/3), 148 MB | 14 MB/s, done.
반응형