2

Git がファイルを保持している理由を知る方法はありますか? 大きなファイルを削除してコミット履歴を書き直そうとしています。これが私がしたことです:

git filter-branch -f --tree-filter "rm -rf *.mp4" 573edba..HEAD

私も試しました:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch *.mp4' 573edba..HEAD

それらが削除されたと報告されているのを見ました。私も走りましgit gcた。

リポジトリには 2 つのブランチがあるので、マスター ブランチと開発ブランチの両方でこれを実行しました。

今、私がこれを行うと:

git ls-files | grep '.mp4'

また

git show --pretty="format:" --name-only 573edba..HEAD | grep '.mp4'

結果が出ません。

しかし、次のようにインデックス ファイルを調べると、次のようになります。

git verify-pack -v .git/objects/pack/pack-*.idx | grep -v chain | sort -k3nr

次に、最初の SHA1 を取得して、それが何であるかを確認します。

git rev-list --all --objects | grep $SHA1

私は得る/path/to/file.mp4


質問: どうすればそのファイルを完全に削除できますか? そのファイルがまだリポジトリにある理由を知るにはどうすればよいですか? Git がそこにある必要があると信じる理由は何ですか?

4

3 に答える 3

2

git filter-branchは非常に危険な操作であるため、古いブランチ ヘッドのバックアップが に保持され.git/refs/originalます。これによりgit gc、これらのヘッドによって参照されるオブジェクトを削除できなくなります。

これらの大きなブロブをすべてリポジトリから実際に削除するには、ローカルリポジトリを削除.git/refs/originalして再度実行するか、単純にクローンするだけです。git gc

于 2013-07-16T14:55:12.660 に答える
1

以前にいくつかの良いアドバイスが与えられたにもかかわらず、私は自分の質問に答えるつもりです. これは、他に言及されていないことがほとんどなかったからです。

それを機能させるために私がしなければならなかった重要なこと:

  • git filter-branchfile を削除する必要があった後.git/refs/original
  • その後、私は電話しなければなりませんでしたgit gc --prune=now
  • その後git repack -a -d
  • 重要なお知らせ: リモートを削除する必要があります! git remote rm origin.
  • 順序が正しくない可能性がありますが、これらの手順のいくつかを繰り返すことで、最終的に目標に到達できるはずです。

  • 押す。サーバーの設定を確認してください


[receive]
    denyNonFastforwards = false
  • git push -f
  • まだ完了していないため、サーバーに SSH で接続できることを願っています。
  • サーバー リポジトリで、もう一度呼び出しgit gcgit repack、最終的にリポジトリを縮小し、削除されたファイルを削除する必要があります。
于 2013-07-17T10:17:27.923 に答える