1. ホーム
  2. git

[解決済み] git で作成された大きな .pack ファイルを削除する

2022-05-05 03:40:27

質問

あるブランチに大量のファイルをチェックインし、マージした後、それらを削除しなければなりませんでした。

を使用してすべてのファイルを削除しました。 git rm -rf xxxxxx を実行し、さらに --cached というオプションもあります。

現在、以下のディレクトリにある大きな.packファイルを削除する方法を誰か教えてください。

.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack

まだ持っているがもう使っていないブランチを削除すればいいのでしょうか?それとも何か他に実行しなければならないことがあるのでしょうか?

どの程度の違いがあるのかわかりませんが、ファイルに対して南京錠が表示されます。

ありがとうございます。


EDIT

以下は私の bash_history からの抜粋で、どのようにしてこの状態になったかを知ることができます (この時点では 'my-branch' という git ブランチで作業していて、さらにフォルダやファイルを含むフォルダを持っていると仮定します)。

git add .
git commit -m "Adding my branch changes to master"
git checkout master
git merge my-branch
git rm -rf unwanted_folder/
rm -rf unwanted_folder/     (not sure why I ran this as well but I did)

以下も実行したつもりですが、bash_historyに他のものと一緒に出てきません。

git rm -rf --cached unwanted_folder/

また、いくつかのgitコマンドを実行したつもりだったのですが、(例えば git gc ) を使ってパックファイルを整頓しようとしましたが、.bash_history ファイルにも表示されません。

どうすればいいですか?

問題は、ファイルを削除しても、以前のリビジョンにはまだ存在していることです。これは、たとえ何かを削除したとしても、履歴にアクセスすることでそれを取り戻すことができるという、gitの本質的なポイントです。

あなたがやろうとしていることは、履歴の書き換えと呼ばれ、これには git filter-branch コマンドを使用します。

GitHubのサイトには、この問題についての説明があります。 https://help.github.com/articles/remove-sensitive-data

あなたの質問にもっと直接的に答えるために、基本的に実行する必要があるのは、このコマンドに unwanted_filename_or_folder を適宜置き換えてください。

git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch unwanted_filename_or_folder' --prune-empty

これは、レポのアクティブな履歴から、ファイルへの参照をすべて削除します。

次のステップでは、GCサイクルを実行して、ファイルへのすべての参照を強制的に失効させ、パックファイルからパージします。これらのコマンドでは、何も置き換える必要はありません。

git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
# or, for older git versions (e.g. 1.8.3.1) which don't support --stdin
# git update-ref $(git for-each-ref --format='delete %(refname)' refs/original)
git reflog expire --expire=now --all
git gc --aggressive --prune=now