クリア方法gitフォルダ内の大きなファイル

2597 ワード

クリア方法gitフォルダ内の大きなファイル
  • うっかり第三者ライブラリを提出してしまいました...どうしよう...

  • Step1.大きなファイルが見つかりました
    1.1 count-objectsを実行してスペース使用を表示する
    $ git count-objects -v 
    

    実行結果
    count: 302
    size: 1208
    in-pack: 4008
    packs: 1
    size-pack: 136897
    prune-packable: 0
    garbage: 0
    size-garbage: 0
    

    size-packはkb単位で示すもので、約136 M+の空間が使用することがわかる.
    1.2大きなファイルを見つける
    出力3列目の情報であるファイルサイズをソートし、最大4つのファイルを取得する.
    $ git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -n | tail -4
    

    実行結果
    3d9c87e2f6afef65d42186ae8ec1ff368159db0f blob   29441232 12551486 6104728
    8f527ad31d8d7fa944cd5a9a8a397143792d9874 blob   34741680 10231790 30056275
    8f527ad31d8d7fa944cd5a9a8a397143792d9874 blob   34741680 10231790 30606600
    1696a4dcf57e12bc086b06cd6ccc6fca3c10aad2 blob   36405168 15230074 54498174
    

    最後のファイルが54 M+のスペースを占めていることがわかります.次のコマンドでファイルの名前を見つけます.
    $ git rev-list --objects --all | grep 1696a4
    

    実行結果
    1696a4dcf57e12bc086b06cd6ccc6fca3c10aad2 Pods/NIMSDK/SDK/NIMSDK/libNIMSDK.a
    

    サードパーティライブラリもgitに転送されたのか...それでは次にすべてのNIMSDKライブラリに関する大きなファイルを探し出しましょう
    $ git rev-list --objects --all
    

    実行結果でNIMSDK関連の部分が見つかりました(一部のみ表示)
    898b1c3387231612c04e54cb52bdb96a79ffab58 Pods/NIMSDK/SDK/NIMSDK/Libs
    f6a4e44810385b356ce50ef25b3a51cb498c5a3d Pods/NIMSDK/SDK/NIMSDK/Libs/libaacplus.a
    9b081280e85bbb5bc71a3f7f460934d4581de657 Pods/NIMSDK/SDK/NIMSDK/Libs/libcrypto.a
    d6021535586d095602466fa91733e4c84f294b35 Pods/NIMSDK/SDK/NIMSDK/Libs/libevent.a
    8bb1d1c76786c4e2f2de1b6e83134bd4c0689296 Pods/NIMSDK/SDK/NIMSDK/Libs/libssl.a
    1696a4dcf57e12bc086b06cd6ccc6fca3c10aad2 Pods/NIMSDK/SDK/NIMSDK/libNIMSDK.a
    

    確認したらPodsフォルダの中にあります!しかもPodsフォルダにはNIMSDKに関するファイルしかありません.次に削除します.
    2.gitと大ファイルの参照関係を削除する
    filter-branchでgitを巡回し、Podsフォルダ内のファイルとの参照関係を削除します.
    $ git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch Pods'
    

    履歴にはそれらの大きなファイルへの参照は含まれていません.
    3.倉庫移転
    $ git clone file:///path/to/repository.
    

    Note that the file://makes a world of difference when cloning a local repository - only the referenced objects are copied across, not the whole directory structure.
    ローカル倉庫をコピーするとfile://すべてが大きく異なることに注意してください.--すべてのファイル構造ではなく、参照関係のあるファイルのみが過去にコピーされます.
    これにより、大きなファイルをこの方法で捨てることができ、残りのファイルと参照関係を同時に残すことができます.
    That's all.
    「倉庫の転送」セクションの詳細は、次を参照してください.http://stackoverflow.com/questions/1029969/why-is-my-git-repository-so-big/1036595#