LAN内専用のGitリポジトリを減量したい
目次
要望
手がけたウェブサイトをGitで管理していますが、もう二度と使うことのない期間限定の古いPDFファイルが履歴に混じっているせいで、小さなウェブサイトなのに.git/
フォルダの容量が50MBほどになりました。
画像をほとんど使わない、自身のjQueryプラグインのリポジトリは1MBだというのに…。
現代では50MBなぞサーバの容量を圧迫するものではありませんが、今後のことを考えて早め早めに不要なファイルを履歴から取り除いて減量しておきたいです。
対象
会社内のサーバーなどに作成した、LAN内だけに公開されているGitリモートリポジトリと、それに対してだけ通信を行うローカルリポジトリを対象にしています。
とはいえ、手順は一般的なものと全く変わりません。
また、減量の作業はWindows機で行います。
参考記事
- Maintaining a Git Repository - Atlassian Documentation
- git repository size を削減する | deadwood
- Gitリポジトリから容量の大きいファイルを履歴から抹消する | eureka tech blog
手順
下記からgit_find_big.sh
を入手します。
Maintaining a Git Repository - Atlassian Documentation
全てのブランチをmasterにマージした後に削除します。
git merge foo-branch git branch -d foo-branch
新規にクローンします。
git clone //foo-server/foo.git
ガベージコレクションします。
git gc --auto
減量前の容量を確認しておきます。
du -hs .git/objects
最初に入手しておいたシェルスクリプトを適切な場所へ設置し、権限変更します。
(今回はプロジェクトの1階層上に設置しています)
chmod 777 ../git_find_big.sh
シェルスクリプト実行します。
結果を見て、大きくて不要なファイルをメモしておきます。
../git_find_big.sh
不要なファイルを、すべての履歴から削除します。
git filter-branch --index-filter "git rm -r --cached --ignore-unmatch ファイル名" -- --all
コミット番号のバックアップを削除します。
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
レフログを削除します。
git reflog expire --expire=now --all
再びガベージコレクションします。
git gc --prune=now
減量されコミット番号も変更されたリポジトリの内容を、リモートにプッシュします。
が、何故かうまくいきません。
git push --all --force
のコマンドでエラーが出ます。
そこで、新たにリモートリポジトリを作りなおすことにします。
GitHubなどでは既存を削除して新しいリポジトリを作成すればいいでしょう。
LAN内専用のリポジトリは下記のようにします。
mkdir foo.git cd foo.git git init --bare --shared=true touch git-daemon-export-ok
あらためて、新しいリモートへプッシュします。
git push origin master
最後に、プロジェクトに関わっている全てのPCで新規にクローンします。
もしくは、.git/
フォルダのみを置き換えてもいいです。
LAN内専用ならではの強引な手法ですが (^ ^;)
効果
8つの古いPDF(各4MBほど)を削除したら、50MBから18MBへ減量できました。
4×8=32で、ちょうどその分だけ削減されたようです。
コミット番号が変わるなどメンバー全員に影響する大掛かりな作業ですから気軽にはできませんが、何度か練習して備えておいて損はない知識だと思います。