Gitで使用しているディレクトリのサイズを小さくする方法はないでしょうか?
GitLabに大きなファイル(700M強)を間違えてadd,commit,pushしてしまいました。
ローカルもリモート側もファイルを削除しました。
duコマンドでローカルのディレクトリサイズを調べると、995Mでした。
どこが?と一つ下の階層をduコマンドで調べると、合計で200Mほどしかありません。
そこで、隠しファイルも調べると、.gitが理由でした。
$ du -sh .git/objects 765M .git/objects
実際には、packファイルがほぼそのサイズでした。
$ ls -lth .git/objects/pack total 1542008 -r--r--r-- 1 hoge staff 25K 10 27 15:28 pack-bb04c989f4c5947bd0749d56f18c68c2e68537a3.idx -r--r--r-- 1 hoge staff 738M 10 27 15:28 pack-bb04c989f4c5947bd0749d56f18c68c2e68537a3.pack
git gcを実行すると12M小さくなりましたが、割合としては大きくありません。
誤ってpushしたファイルを“無かったこと”にはできないのでしょうか。
$ git gc Enumerating objects: 888, done. Counting objects: 100% (888/888), done. Delta compression using up to 4 threads Compressing objects: 100% (737/737), done. Writing objects: 100% (888/888), done. Total 888 (delta 543), reused 226 (delta 135) Computing commit graph generation numbers: 100% (143/143), done. enteropathway_table $ du -sh .git/objects 753M .git/objects
いろいろと調べて、git filter-branch で可能かと思えています。
使い始めたばかりで(そのこともあって、このような誤ったファイルをpushしてしまった)
なにが行われるのか、リモート側とローカル側の区別がいま一つ理解できず質問しました。
git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch <ファイル名orフォルダ名>" --prune-empty -- --all
質問文で自己完結しているようですが、聞きたいことはまだ残っていますか?
はい、申し訳ありません。説明不足でした。
意味が理解できずに実行に不安があります(pushに時間がかかる等の問題が起きているのではないので)十分に理解した上で実行したいと考えています。
とりあえずローカルのサイズを小さくしたいのですが
git filter-branch に git rm を指定して実行してもその段階でローカルディレクトリのサイズは小さくならなない、と読み取りました。
・これ(git filter-branch)は何をしているのでしょうか
(なぜこれでローカルのサイズがこれでは小さくならない?)
・git gcはローカル側?リモート側どちらに対する処理なのでしょうか?
・「コミットのハッシュ値が変わる」は初めて知りました(「コミットのハッシュ値」とはなんだろうのレベル)
強制的にpush(git push -f)を行わないと、これ以降リモートのリポジトリは使えなくなるのしょうか
実際に何をしてどうなったのか再現手順がなければ原因は分かりませんし、リモートのリポジトリに行っていい操作も分からないので回答もできません。とりあえず、ローカルリポジトリを作成→コミット破棄→gcしてローカルリポジトリのサイズ減少を確認できる(100MBのコミットを消して100MB減ってる)スクリプトを用意しました。ご参考までに。
# git repos.構築
mkdir tmp
cd tmp
git init
dd if=/dev/urandom of=./hoge001.dat bs=1MiB count=1
git add .
git commit -m "initial commit"
dd if=/dev/urandom of=./hoge002.dat bs=1MiB count=100 # コレがデカイ
git add .
git commit -m "2nd commit"
dd if=/dev/urandom of=./hoge003.dat bs=1MiB count=1
git add .
git commit -m "3rd commit"
du -sh .git hoge00?.dat
# 2md commitの削除
git branch tmp
git reset --hard HEAD~2
git cherry-pick tmp
git switch tmp
git reset --hard HEAD~2
git switch master
git branch --delete tmp
# gc
du -sh .git hoge00?.dat
# https://zenn.dev/ulwlu/articles/cc2443d32e2444 を参考にしました
git \
-c gc.pruneExpire=now \
-c gc.worktreePruneExpire=now \
-c gc.reflogExpire=now \
-c gc.reflogExpireUnreachable=now \
-c gc.rerereResolved=now \
-c gc.rerereUnResolved=now \
gc --aggressive
du -sh .git hoge00?.dat