Github에 100Mb이상 파일 올리는 방법 (오류 해결)


필자의경우 Bitbucket에서 사용하던 Project를 Github로 옴기려고 하다보니 이와 같은 에러가 발생 했다. Github의 경우 개당 파일은 100MB제한이고 있지만 전체 용량 제한은 없다.
Bitbucket은 개당 파일의 제한은 없지만 전체용량이 2GB이상이 안되는 제한사항이 존재 한다.

Github의 경우 50Mb는 Warning을 표시하며, 100Mb부터는 Error를 나타낸다.
따라서 이 이상의 파일을 Push하려하면 아래와 같은 에러를 발생 시킨다.
Github Policy

에러

root@ubuntu:~/python_source/AutoTestingModule# git push github --all
Username: 
Password: 
Counting objects: 40223, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (26581/26581), done.
Writing objects: 100% (40223/40223), 582.06 MiB | 7.94 MiB/s, done.
Total 40223 (delta 12516), reused 40162 (delta 12503)
remote: error: GH001: Large files detected. You may want to try Git Large File Storage - https://git-lfs.github.com.
remote: error: Trace: b052327128727acb5dc9e1fed5cdbb8f
remote: error: See http://git.io/iEPt8g for more information.
remote: error: File TestingResult.tar.gz is 111.47 MB; this exceeds GitHub's file size limit of 100.00 MB
root@ubuntu:~/python_source/AutoTestingModule# git log b05232
fatal: ambiguous argument 'b05232': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

위 에러 메시지는 HEAD에는 100MB 이상의 파일은 없다.
즉 최근 commit이나 현재 Directory에는 100MB 이상의 파일이 존재하지 않는다. 
하지만 이전 Commit에서라도 100MB이상의 파일이 존재한다면 이러한 에어를 발생 시킨다.
필자의 경우도 TestingResult.tar.gz의 경우 이전에 만들어 두었던 BackUp 파일 하나가 변경이력에 들어가서 문제가된 것이다.

해결방법

경고 메시지에도 나와 있듯이 몇가지 해주면 쉽게 해결이 가능하다.

1.git-lfs 이용

https://git-lfs.github.com/

2. BFG Repo-Cleaner 적용

https://rtyley.github.io/bfg-repo-cleaner/

필자의 경우 그냥 필요없는 파일이라 이전 이력을 뒤져서 제거하는 방법을 선택 했다.
위 공식 사이트에 가서 bfg-x.x.x.jar파일을 다운받고 아래처럼 실행하자.

실행 결과

root@ubuntu:~/python_source/AutoTestingModule# java -jar bfg-1.12.12.jar --strip-blobs-bigger-than 100M

Using repo : /root/python_source/AutoTestingModule/.git

Scanning packfile for large blobs: 40169
Scanning packfile for large blobs completed in 1,435 ms.
Found 1 blob ids for large blobs - biggest=116880364 smallest=116880364
Total size (unpacked)=116880364
Found 36035 objects to protect
Found 7 commit-pointing refs : HEAD, refs/heads/GUI, refs/heads/MultiRun, ...

Protected commits
-----------------

These are your protected commits, and so their contents will NOT be altered:

 * commit 034d2b0b (protected by 'HEAD')

Cleaning
--------

Found 52 commits
Cleaning commits:       100% (52/52)
Cleaning commits completed in 406 ms.

Updating 6 Refs
---------------

    Ref                            Before     After   
    --------------------------------------------------
    refs/heads/GUI               | bfec4c11 | ebffb517
    refs/heads/MultiRun          | 968de654 | d0fd0d5f
    refs/heads/master            | 034d2b0b | abe6ecc0
    refs/remotes/origin/GUI      | bfec4c11 | ebffb517
    refs/remotes/origin/MultiRun | 968de654 | d0fd0d5f
    refs/remotes/origin/master   | 034d2b0b | abe6ecc0

Updating references:    100% (6/6)
...Ref update completed in 262 ms.

Commit Tree-Dirt History
------------------------

    Earliest                                      Latest
    |                                                  |
    ......................DDDDDDDDmmmmmm.mmmmmmmmmmmmmmm

    D = dirty commits (file tree fixed)
    m = modified commits (commit message or parents changed)
    . = clean commits (no changes to file tree)

                            Before     After   
    -------------------------------------------
    First modified commit | 7a6c355c | c9286236
    Last dirty commit     | cb054c2b | 25d98799

Deleted files
-------------

    Filename               Git id             
    ------------------------------------------
    TestingResult.tar.gz | 4153149d (111.5 MB)


In total, 37 object ids were changed. Full details are logged here:

    /root/python_source/AutoTestingModule.bfg-report/2016-08-09/00-21-29

BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive


Has the BFG saved you time?  Support the BFG on BountySource:  https://j.mp/fund-bfg

위와 같이 이전 commit에서 빠르게 해당 파일을 찾아서 제거하고 commit메시지를 자동으로 바꾼것을 알 수 있다. 정말 편리한 유틸리티인것 같다.

이제 다시 Github repository에 PUSH를 시도해 보자.

root@ubuntu:~/python_source/AutoTestingModule# git push github --all
Username: 
Password: 
Counting objects: 40223, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (26589/26589), done.
Writing objects: 100% (40223/40223), 471.01 MiB | 8.80 MiB/s, done.
Total 40223 (delta 12516), reused 40126 (delta 12494)
To https://github.com/leejaymin/QDroid.git
 * [new branch]      GUI -> GUI
 * [new branch]      MultiRun -> MultiRun
 * [new branch]      master -> master
root@ubuntu:~/python_source/AutoTestingModule# 

참고문헌


+ Recent posts