すたらブログ

文系Webプログラマの備忘録

LAN内専用のGitリポジトリを減量したい

目次


要望

手がけたウェブサイトをGitで管理していますが、もう二度と使うことのない期間限定の古いPDFファイルが履歴に混じっているせいで、小さなウェブサイトなのに.git/フォルダの容量が50MBほどになりました。
画像をほとんど使わない、自身のjQueryプラグインリポジトリは1MBだというのに…。
現代では50MBなぞサーバの容量を圧迫するものではありませんが、今後のことを考えて早め早めに不要なファイルを履歴から取り除いて減量しておきたいです。


対象

会社内のサーバーなどに作成した、LAN内だけに公開されているGitリモートリポジトリと、それに対してだけ通信を行うローカルリポジトリを対象にしています。
とはいえ、手順は一般的なものと全く変わりません。
また、減量の作業はWindows機で行います。


参考記事


手順

下記から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で、ちょうどその分だけ削減されたようです。
コミット番号が変わるなどメンバー全員に影響する大掛かりな作業ですから気軽にはできませんが、何度か練習して備えておいて損はない知識だと思います。