19

を使用して大きな FLV ファイルを削除するために、リポジトリの履歴を書き直しましたgit filter-branch私は主に、機密データの削除に関する Github 記事の記事と、インターネット上の他の場所にある同様の手順に従いました。

大きな FLV を削除する:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch public/video/*.flv' --prune-empty -- --all

元の参照を削除する:

rm -rf .git/refs/original/

reflog のクリア:

git reflog expire --expire=now --all

到達不能オブジェクトの削除:

git gc --prune=now

到達不能オブジェクトの積極的なプルーニング:

git gc --aggressive --prune=now

荷物の再梱包:

git repack -A -d

そして、私の gitdir はまだ 205 MB で、ほぼ完全に 1 つのパックファイルに含まれています。

$ du -h .git/objects/pack/*
284K    .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.idx
204M    .git/objects/pack/pack-f72ed7cee1206aae9a7a3eaf75741a9137e5a2fe.pack

このスクリプトを使用すると、削除した FLV がまだパックに含まれていることがわかります。

All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file.
size   pack   SHA                                       location
17503  17416  1be4132fa8d91e6ce5c45caaa2757b7ea87d87b0  public/video/XXX_FINAL.flv
17348  17261  b7aa83e187112a9cfaccae9206fc356798213c06  public/video/YYY_FINAL.flv
....

同じく 205MB のサイズの yields をgit clone --bare my-repo介してリポジトリをクローンします。my-repo.git

これらの (おそらく) 参照されていないオブジェクトをパックから削除し、リポジトリをコミットされていない場合のサイズに縮小するにはどうすればよいですか? それらがまだ何らかの形で参照されている場合、どこにあるのかを知る方法はありますか?

アップデート

を再実行しようとしたところgit filter-branch、次の通知を受け取りました。

Cannot create a new backup.
A previous backup already exists in refs/original/
Force overwriting the backup with -f

に参照がないことを確認しました.git/refs/original。実際、ディレクトリはまったく存在しませんでした。私が知らない、gitが参照を保存する他の方法はありますか?

4

1 に答える 1

8

リポジトリの新しいコピーを複製すると、コマンドを上記とまったく同じように実行して、目的の結果を得ることができました。私の .git ディレクトリは 205 MB から 20 MB に縮小され、大きな FLV ファイルはファイルからきれいに削除されました。パックファイル。

最初の試行は、変更を加えていない新しいクローンでも実行されたため、FLV ファイルがパックファイル内に残り続けた理由について満足のいく説明がありません。

git repack -aを削除する前に実行して問題.git/refs/originalを引き起こし、元の参照がパックされて、削除しても効果がなかったと考えて、最初に以下の回答を提出しました。.git/refs/original私の元の参照はまだ大きな FLV ファイルを参照しています。ただし、これは持ちこたえられないようです。上記のコマンドをリポジトリの新しく複製されたコピーで実行し、git repack -a直後に を追加git filter-branchしても結果には影響しないようです - FLV ファイルはまだパックファイルから削除されています。これが元の問題に関連していると信じる理由はありません。


私が知らない、gitが参照を保存する他の方法はありますか?

あります。上記のコマンドの順序について、私は完全に真実ではなかったことがわかりました。私は を実行するgit repack -a 前に実行rm -rf .git/refs/originalし、Git は ref をパックしました (場所は未定です。現在実験中です)。その後、実行するrm -rf .git/refs/originalと、何も削除されませんでした。パックされた参照のために古いファイルへの参照が残っていたため、パックファイルgit gc縮小できませんでした。refs/original

于 2012-05-18T17:25:01.903 に答える