私は GitHub アカウントのリポジトリで作業していたのですが、偶然この問題に遭遇しました。
- いくつかの npm パッケージがインストールされたフォルダーを含む Node.js プロジェクト
- パッケージは
node_modules
フォルダ内にあった - そのフォルダをgitリポジトリに追加し、コードをgithubにプッシュしました(その時点ではnpmの部分については考えていませんでした)
- そのフォルダをコードの一部にする必要はないことに気付きました
- そのフォルダを削除してプッシュしました
当時の Git リポジトリ全体のサイズは約6 MBでしたが、実際のコード (そのフォルダーを除くすべて) は約300 KBしかありませんでした。
私が最終的に求めているのは、git の履歴からそのパッケージ フォルダーの詳細を削除する方法です。そうすれば、誰かがそれをクローンする場合、最後のコミット時点で取得する実際のファイルは 300 KB だけなので、6 MB 相当の履歴をダウンロードする必要がなくなります。
私はこれに対する解決策を調べ、次の2つの方法を試しました
Gist は、スクリプトを実行した後、そのフォルダーが削除され、その後 50 個の異なるコミットが変更されたことが示されたため、機能しているように見えました。しかし、そのコードをプッシュできませんでした。プッシュしようとすると、 50Branch up to date
個のコミットが変更されたことが示されましたgit status
。他の 2 つの方法も役に立ちませんでした。
フォルダーの履歴が削除されたことが示されましたが、ローカルホストでそのリポジトリのサイズを確認すると、まだ約 6 MB でした。(フォルダーも削除しましたrefs/original
が、リポジトリのサイズは変化しませんでした)。
私が明確にしたいのは、コミット履歴 (これが唯一起こったと思われる) だけでなく、ロールバックしたいと想定して git が保持しているファイルも削除する方法があるかどうかです。
これに対する解決策が提示され、ローカルホストに適用されたが、その GitHub リポジトリに再現できない場合、そのリポジトリをクローンし、最初のコミットにロールバックしてトリックを実行し、プッシュすることは可能ですか (または、git にそれらのコミットの履歴がすべて残っていることを意味しますか? - つまり、6MB)。
ここでの私の最終目標は、基本的に、git からフォルダーの内容を削除して、ユーザーが 6 MB 相当のものをダウンロードしなくても済むようにし、git の履歴で modules フォルダーに触れたことのない他のコミット (ほぼすべて) を保持できるようにする最善の方法を見つけることです。
これどうやってするの?
ベストアンサー1
警告: git filter-branchはもはや公式には推奨されていない公式の推奨はgit フィルター リポジトリ; 見る詳細についてはアンドレ・アンジョスの回答をご覧ください。
コードをコピーして貼り付ける場合は:
node_modules
これは歴史から消え去る例である
git filter-branch --tree-filter "rm -rf node_modules" --prune-empty HEAD
git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d
echo node_modules/ >> .gitignore
git add .gitignore
git commit -m 'Removing node_modules from git history'
git gc
git push origin main --force
git が実際に行うこと:
最初の行は、--tree-filter
コマンド を実行して、HEAD (現在のブランチ) と同じツリー ( )上のすべての参照を反復処理しますrm -rf node_modules
。このコマンドは、ユーザーにプロンプトを表示せずに ( )、node_modules フォルダー (-r
なし-r
、rm
フォルダーは削除されません)を削除します-f
。追加された--prune-empty
は、役に立たない (何も変更しない) コミットを再帰的に削除します。
2 行目は、古いブランチへの参照を削除します。
残りのコマンドは比較的簡単です。