https://bitbucket.org/ で 100MB を超える大きなファイルを
そのまま git に commit するやんちゃな運用をしていたリポジトリを
https://github.com/ に移設するため LFS 対応したときの手順です。
Bitbucket とは異なり、Github は1ファイルあたり100MBの制限があるので、
巨大なファイルを格納していたリポジトリを引越す場合は、 LFS を利用する必要があります。
手順は以下の通り。
# macOS の場合
brew install git-lfs
# 全体設定で Git LFS を有効化
git lfs install
# リポジトリ名
REPO=my-repository
ORG=my-github-organization
# 事前に clone しておいたローカルのリポジトリに移動する
cd $REPO
# github を remote に登録する
git remote add github git@github.com:$ORG/$REPO.git
# 10MB 以上の大きなファイルを探す
git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| awk '$1 == "blob" && $3 > 10000000 { print $3, $4 }' | sort -rn | head
# もし、100MB 以上のファイルがなければ、LFS 化も必須ではないから、そのまま mirror して終了
# git gc && git push github --all && git push github --tags
# LFS 対象のファイル名を指定する(例:すべての *.zip を LFS 化することにした場合)
NAME="*.zip"
# ① 初めて .zip ファイルを含んでいる最初のコミットを探す
FIRST=$(git log --diff-filter=A --reverse --pretty=format:%H -- "$NAME" | head -n 1)
echo FIRST=$FIRST
# ② その1つ前のコミット
PARENT=$(git rev-parse $FIRST^)
echo PARENT=$PARENT
# ② → ①のコミットログを確認する
git log $PARENT^..$FIRST
# ② → ①のときに変更されたファイル名を確認する
git diff --name-only $PARENT $FIRST
# ①以降のコミットをすべて書き換えて、履歴中の全ての .zip ファイルを LFS 化する(コミットIDが変わる)
git lfs migrate import --include="$NAME" --exclude-ref=$PARENT --include-ref=HEAD
# もし、①がルートコミット(親がないコミット)だった場合は、全コミットに対して .zip の LFS 化を実行する
# git lfs migrate import --include="$NAME" --everything
# LFS 化したファイルを確認する
git lfs ls-files --all --size
# github に push する
git gc && git push github --all && git push github --tags
(備考)
-
--everything
だと、全てのコミットのコミット ID が変わる。 -
--exclude-ref=$PARENT
を使えば$FIRST
以降のコミット ID だけが変わる。 - 上記手順で bitbucket → github 移設できるようになったものの、そもそも、100MB を超えるファイルを git で扱うと、ローカルの端末のディスク容量も大きく消費してしまうから、できれば、そうした運用は避けたい。(今回は、昔に作ったリポジトリのアーカイブを移設していました)
(参考)GitHub と Bitbucket の比較(2025年6月現在)
項目 | GitHub | Bitbucket |
---|---|---|
Free プラン | ◯ あり | ◯ あり |
安い有料プランの月額料金 | △ 1人あたり$4.00 | △ 1人あたり$3.30 |
有料プランの最低月額料金 | ◯ $4.00(1人分〜) | ◯ $16.50(5人分〜) |
1ファイルあたりの制限 | △ ファイルあたり100MB | ◯ 制限なし |
Free プランの容量制限 | ◯ 制限なし? | △ Workspaceあたり1GB |
有料プランの容量制限 | ◯ 制限なし? | ◯ 制限なし? |
Free プランのLFS容量制限 | ◯ 10GB | △ 1GB |
安い有料プランのLFS容量制限 | ◯ 250GB | △ 5GB |
LFS容量の追加購入 | ◯ 1GB あたり $0.07 | △ 100GB あたり $10.00 |