[解決済み] git リポジトリからファイルを削除する (履歴)
質問
(解決済み、質問本文の下部を参照)
長い間これを探して、私が今まで持っているものは、次のとおりです。
- http://dound.com/2009/04/git-forever-remove-files-or-folders-from-history/ および
- http://progit.org/book/ch9-7.html
ほとんど同じ方法ですが、どちらもパックファイルにオブジェクトが残ります...。立ち往生です。
私が試したこと。
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 にリセットしたくありません :(
解決策 これは、ファイルを削除するための最短の方法です。
-
.git/packed-refs をチェックする - 私が問題にしたのは、そこに
refs/remotes/origin/master
という行があったので、それを削除してください。そうしないと、git はこれらのファイルを削除しません。 -
(オプション)
git verify-pack -v .git/objects/pack/#{pack-name}.idx | sort -k 3 -n | tail -5
- を使用して、最も大きなファイルをチェックします。 -
(オプション)
git rev-list --objects --all | grep a0d770a97ff0fac0be1d777b32cc67fe69eb9a98
- これらのファイルが何であるかを確認するために -
git filter-branch --index-filter 'git rm --cached --ignore-unmatch file_names'
- すべてのリビジョンからファイルを削除する -
rm -rf .git/refs/original/
- git のバックアップを削除する -
git reflog expire --all --expire='0 days'
- すべてのルーズオブジェクトを期限切れにする -
git fsck --full --unreachable
- ルースオブジェクトがあるかどうかをチェックするために -
git repack -A -d
- 再梱包 -
git prune
- 最終的にそれらのオブジェクトを削除するために
どのように解決するのですか?
リポジトリデータにアクセスしないと確かなことは言えませんが、おそらく 1 つ以上の packed refs が、あなたが
git filter-branch
. これによって
git fsck --full --unreachable
が大きな blob を到達不可能なオブジェクトと呼ばない理由もここにあります。
以下は、私が行うことです (後述する
git filter-branch
と
git 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
ファイルを手動で編集するのが唯一の方法かもしれません。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git で、ステージされていない変更を破棄するにはどうしたらいいですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
gitlab をアップロード ! [リモート拒否] dev -> dev (受信前のフックが拒否されました)
-
Gitのエラーについて覚えておく-すべて最新にする
-
[解決済み] Git の履歴から機密性の高いファイルやそのコミットを削除する
-
git push please tell me who you are or git fatal: empty ident name (for <>) not llowed.
-
Gitのコミットでfatal: unable to auto-detect email addressのエラーが報告される。
-
[解決済み】gitリポジトリのサイズを小さくする
-
[解決済み] なぜ私の git リポジトリはこんなに大きいのですか?
-
[解決済み] git gui実行時に "Loose Object "ポップアップをスキップする方法
-
[解決済み] Gitの本番環境へのプッシュ(FTP)
-
[解決済み] gitにもsvnのような無視コマンドはありますか?