1. ホーム
  2. git

[解決済み] git リポジトリからファイルを削除する (履歴)

2023-08-05 08:34:56

質問

(解決済み、質問本文の下部を参照)

長い間これを探して、私が今まで持っているものは、次のとおりです。

ほとんど同じ方法ですが、どちらもパックファイルにオブジェクトが残ります...。立ち往生です。

私が試したこと。

git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_name'
rm -Rf .git/refs/original
rm -Rf .git/logs/
git gc

まだパック内のファイルがあり、これでわかる。

git verify-pack -v .git/objects/pack/pack-3f8c0...bb.idx | sort -k 3 -n | tail -3

そして、これ。

git filter-branch --index-filter "git rm -rf --cached --ignore-unmatch file_name" HEAD
rm -rf .git/refs/original/ && git reflog expire --all &&  git gc --aggressive --prune

同じく...

試してみた git clone のトリックで、いくつかのファイル (~3000 個) が削除されましたが、最大のファイルはまだ残っています...。

リポジトリに 200M ほどの大きなレガシーファイルがあり、本当にそこに置いておきたくありません...。そして、私はリポジトリを 0 にリセットしたくありません :(

解決策 これは、ファイルを削除するための最短の方法です。

  1. .git/packed-refs をチェックする - 私が問題にしたのは、そこに refs/remotes/origin/master という行があったので、それを削除してください。そうしないと、git はこれらのファイルを削除しません。
  2. (オプション) git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5 - を使用して、最も大きなファイルをチェックします。
  3. (オプション) git rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98 - これらのファイルが何であるかを確認するために
  4. git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names' - すべてのリビジョンからファイルを削除する
  5. rm -rf .git/refs/original/ - git のバックアップを削除する
  6. git reflog expire --all --expire='0 days' - すべてのルーズオブジェクトを期限切れにする
  7. git fsck --full --unreachable - ルースオブジェクトがあるかどうかをチェックするために
  8. git repack -A -d - 再梱包
  9. git prune - 最終的にそれらのオブジェクトを削除するために

どのように解決するのですか?

リポジトリデータにアクセスしないと確かなことは言えませんが、おそらく 1 つ以上の packed refs が、あなたが git filter-branch . これによって git fsck --full --unreachable が大きな blob を到達不可能なオブジェクトと呼ばない理由もここにあります。

以下は、私が行うことです (後述する git filter-branchgit gc が行われている)。

1) オリジナルの参照元がなくなっていることを確認します。

rm -rf .git/refs/original

2) すべての reflog エントリーを失効させます。

git reflog expire --all --expire='0 days'

3) 古いパックされた参照ファイルをチェックする

これは、packed refsの数によっては厄介なことになる可能性があります。これを自動化するGitコマンドを私は知らないので、手動で行う必要があると思います。のバックアップを作成します。 .git/packed-refs . 次に .git/packed-refs . 古い参照がないか確認します。 .git/refs/original ). もし、そこにある必要のない古いものを見つけたら、それらを削除してください(その参照用の行を削除してください)。

の整理を終えたら packed-refs ファイルの整理が終わったら git fsck が到達不能なオブジェクトに気づくかどうかを見てください。

git fsck --full --unreachable

もしこれがうまくいって git fsck が大きな blob を到達不能として報告するようになった場合は、次のステップに進むことができます。

4) パックしたアーカイブを再パックします。

git repack -A -d

これにより、到達不可能なオブジェクトは確実に解凍され にとどまる を維持します。

5) 緩い(到達できない)オブジェクトの刈り込み

git prune

これで完了です。Gitはパックされた参照ファイルを管理するためのより良い方法を持つべきです。もしかしたら、私が知らないだけで、もっと良い方法があるかもしれません。より良い方法がない場合、手動で packed-refs ファイルを手動で編集するのが唯一の方法かもしれません。