ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Github에 100MB 이상의 용량 파일 올리는 방법
    개발 2020. 1. 3. 00:56
    728x90

    Github 에 100MB 이상의 파일을 올리려고 시도하면 다음과 같은 에러가 나면서 올라가지 않는다. ㅠㅠ


    LFS

    LFS(Large File Storage) 는 큰 파일을 처리하기 위한 github에서 만든 오픈소스이다.

    원래 github 에는 큰 용량의 이진파일을 처리하는데 적합하지 않다. 바이너리는 소스코드와는 다르게 diff 를 용이하게 처리하는데 어려움이 있기 때문에 이진파일인 경우 형상관리를 하는데에 문제가 있을 수 밖에 없는것이다. 

    바이너리를 계속 Push 하게 되면 github 에서는 해당 파일에 대한 history 를 관리하기 위해 용량을 낭비하게 되는 것이다.

    그래서 LFS 는 대용량 파일을 그대로 동일한 repository 에 저장하지 않고 분리된 Storage에 저장을 해두고, 해당 파일을 마치 C의 포인터처럼 가리키고 있는 방식으로 동작하게 된다. 

    어쨌든 해결을 해보도록 하자.

     

     


    해결책

    일단은 다음 사이트로 가서 LFS클라이언트를 설치해 준다

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

     

    Git Large File Storage

    Git Large File Storage (LFS) replaces large files such as audio samples, videos, datasets, and graphics with text pointers inside Git, while storing the file contents on a remote server like GitHub.com or GitHub Enterprise.

    git-lfs.github.com

    git clone 을 해둔 폴더로 가서 마우스 우클릭

    Tortoise GIT의 Context Menu

    Git Bash Here 를 선택해준다

    터미널이 열릴테니 다음을 입력해준다

     

    $ git lfs install
    Updated git hooks.
    Git LFS initialized.
    

     

    그리고 100MB 넘는 파일을 tracking 하기 위해 다음을 입력

    $ git lfs track "*.lib"
    Tracking "*.lib"

    git lfs track 이라는 명령을 그냥 치면 어떤 파일이 track중인지 표시된다

    이렇게 되면 .gitattributes 라는 파일이 생성되고 내부에 track중인 파일이 리스팅 된다 (요것도 git add 대상)

    위와 같이 한번 설정해두면 이후에는 자동으로 100MB 넘는 파일이 LFS 를 통해서 관리되게 된다.

    그냥 git push 하면됨


    반전

    근데 안됨!

    계속 에러뜸 ㅠㅠ

    이럴때는 100MB 이상의 파일 이전에 commit 한적이 있으면 안된다고 한다. 

    이럴때는 BFG Repo-Cleaner 를 실행해줘야한다.

    다음 사이트에서 옆에 jar 파일을 다운로드 한다.

    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

    이거... 계속 복잡해지지만 어쨋든 끝까지 하면 빛을 볼 수는 있다. ㅠㅠ

    jar 파일이므로 JRE또는 JDK가 컴퓨터에 설치되어 있어야 한다. 설치 안되어 있으면 다운로드 및 설치... 

    우리는 개발자니까 JDK 를 설치해주자. 

    JAVA 를 설치하고 나서 환경변수에 JAVA_HOME 과 Path 에 java/bin 폴더를 추가하는것 잊지말자.

     

    이후 

    java -jar bfg-1.13.0.jar --strip-blobs-bigger-than 100M

    를 입력하면 성공할줄 알았지만... 다음과 같은 에러가 날 수 있다.

    D:\project\github\todengine3>java -jar bfg-1.13.0.jar --strip-blobs-bigger-than 100M
    
    Using repo : D:\project\github\todengine3\.git
    
    Scanning packfile for large blobs: 6092
    Scanning packfile for large blobs completed in 67 ms.
    Warning : no large blobs matching criteria found in packfiles - does the repo need to be packed?
    Please specify tasks for The BFG :
    bfg 1.13.0
    Usage: bfg [options] [<repo>]
    
      -b, --strip-blobs-bigger-than <size>
                               strip blobs bigger than X (eg '128K', '1M', etc)
      -B, --strip-biggest-blobs NUM
                               strip the top NUM biggest blobs
      -bi, --strip-blobs-with-ids <blob-ids-file>
                               strip blobs with the specified Git object ids
      -D, --delete-files <glob>
                               delete files with the specified names (eg '*.class', '*.{txt,log}' - matches on file name, not path within repo)
      --delete-folders <glob>  delete folders with the specified names (eg '.svn', '*-tmp' - matches on folder name, not path within repo)
      --convert-to-git-lfs <value>
                               extract files with the specified names (eg '*.zip' or '*.mp4') into Git LFS
      -rt, --replace-text <expressions-file>
                               filter content of files, replacing matched text. Match expressions should be listed in the file, one expression per line - by default, each expression is treated as a literal, but 'regex:' & 'glob:' prefixes are supported, with '==>' to specify a replacement string other than the default of '***REMOVED***'.
      -fi, --filter-content-including <glob>
                               do file-content filtering on files that match the specified expression (eg '*.{txt,properties}')
      -fe, --filter-content-excluding <glob>
                               don't do file-content filtering on files that match the specified expression (eg '*.{xml,pdf}')
      -fs, --filter-content-size-threshold <size>
                               only do file-content filtering on files smaller than <size> (default is 1048576 bytes)
      -p, --protect-blobs-from <refs>
                               protect blobs that appear in the most recent versions of the specified refs (default is 'HEAD')
      --no-blob-protection     allow the BFG to modify even your *latest* commit. Not recommended: you should have already ensured your latest commit is clean.
      --private                treat this repo-rewrite as removing private data (for example: omit old commit ids from commit messages)
      --massive-non-file-objects-sized-up-to <size>
                               increase memory usage to handle over-size Commits, Tags, and Trees that are up to X in size (eg '10M')
      <repo>                   file path for Git repository to clean

    그러면 다음과 같은 명령을 친후

    D:\project\github\todengine3>git repack && git gc
    
    더보기

    Counting objects: 1149, done.
    Delta compression using up to 12 threads.
    Compressing objects: 100% (1120/1120), done.
    Writing objects: 100% (1149/1149), done.
    Total 1149 (delta 124), reused 0 (delta 0)
    Counting objects: 7241, done.
    Delta compression using up to 12 threads.
    Compressing objects: 100% (4413/4413), done.
    Writing objects: 100% (7241/7241), done.
    Total 7241 (delta 2596), reused 7129 (delta 2484)

     

    다시 적용하면~

    D:\project\github\todengine3>java -jar bfg-1.13.0.jar --strip-blobs-bigger-than 100M
    
    Using repo : D:\project\github\todengine3\.git
    
    Scanning packfile for large blobs: 7241
    Scanning packfile for large blobs completed in 70 ms.
    Found 2 blob ids for large blobs - biggest=198766846 smallest=179020480
    Total size (unpacked)=377787326
    Found 1573 objects to protect
    Found 4 commit-pointing refs : HEAD, refs/heads/master, refs/remotes/origin/HEAD, refs/remotes/origin/master
    
    Protected commits
    -----------------
    
    These are your protected commits, and so their contents will NOT be altered:
    
     * commit 812b841b (protected by 'HEAD')
    
    Cleaning
    --------
    
    Found 65 commits
    Cleaning commits:       100% (65/65)
    Cleaning commits completed in 218 ms.
    
    Updating 1 Ref
    --------------
    
            Ref                 Before     After
            ---------------------------------------
            refs/heads/master | 812b841b | e3055c33
    
    Updating references:    100% (1/1)
    ...Ref update completed in 16 ms.
    
    Commit Tree-Dirt History
    ------------------------
    
            Earliest                                              Latest
            |                                                          |
            ........................................................DDmm
    
            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 | ddf838f9 | e656a708
            Last dirty commit     | 61aa5734 | 52b86a74
    
    Deleted files
    -------------
    
            Filename           Git id
            --------------------------------------
            libfbxsdk-md.lib | eaa7a71e (170.7 MB)
            libfbxsdk-mt.lib | be6c7def (189.6 MB)
    
    
    In total, 12 object ids were changed. Full details are logged here:
    
            D:\project\github\todengine3.bfg-report\2020-01-03\00-17-25
    
    BFG run is complete! When ready, run: git reflog expire --expire=now --all && git gc --prune=now --aggressive
    
    
    --
    You can rewrite history in Git - don't let Trump do it for real!
    Trump's administration has lied consistently, to make people give up on ever
    being told the truth. Don't give up: https://www.theguardian.com/us-news/trump-administration

    성공했다!

     

    이후 git push 를 하면 드디어 Push 에 성공한다!

     

    뭔갈 할래도 쉽게 되질 않는다. ㅠㅠ

    그냥 100MB 이하 파일만 올리도록 하자.

    728x90

    댓글

Designed by Tistory.