例
たとえば、10 個のコミットを含むローカル git リポジトリがあり、SHA ダイジェストが 0 ~ 9 であるため、git ログは次のようになります。
9 (HEAD -> master)
8
7
6
5
4
3
2
1
0 <- initial commit
コミット 5 ~ 9 はガベージであると判断し、それらのすべてのレコードをレポジトリとそれらが導入したディスク領域から完全に削除したいと考えています。基本的に、リポジトリの状態をコミット 4 が作成されたときと同じにして、5-9 が発生したことさえないようにしたいと考えています。
git reset --hard 4
私のレポがコミット4に巻き戻されたように見えることはわかっていますが、私が理解していることから、コミットmaster
ポイントを9から4に変更するだけで、実際には何も削除しません. すべてのデータはまだそこにあり、コミット 9 の SHA がわかっている場合は回復可能です。
私も認識してgit filter-branch
いますが、それはコミットではなく、履歴からファイルを削除するだけです。
私はやってみました:
git reset --hard 4
git gc --prune=now
.git
しかし、これを行った後、ディレクトリのディスク容量の使用量は同じかそれ以上になり、 git checkout 9
. git gc --prune=now
コミット 5 ~ 9 をプルーニングしないのはなぜですか? 期限切れにする必要がありreflog
ますか?
より一般的に:
多くのブランチ、タグ、コミット、マージ、および分岐履歴を含む複雑なリポジトリがある場合、すべてのコミットを、それらが導入する変更、およびそれらが消費するディスク容量とともに、一定時間後に発生したものを完全かつ自動的に削除するにはどうすればよいですか。リポジトリ全体をその時点まで効果的に巻き戻し、その日付以降に発生したすべてのアクティビティを完全に破棄します。