Saya sedang mengerjakan repositori di akun GitHub saya dan ini adalah masalah yang saya temui.
- Proyek Node.js dengan folder dengan beberapa paket npm diinstal
- Paket-paket itu ada di
node_modules
folder - Menambahkan folder itu ke git repositori dan mendorong kode ke github (tidak memikirkan bagian npm pada waktu itu)
- Menyadari bahwa Anda tidak benar-benar membutuhkan folder itu untuk menjadi bagian dari kode
- Menghapus folder itu, mendorongnya
Pada saat itu, ukuran total repo git sekitar 6MB di mana kode aktual (semua kecuali folder itu) hanya sekitar 300 KB .
Sekarang apa yang saya cari pada akhirnya adalah cara untuk menghilangkan rincian folder paket itu dari sejarah git jadi jika seseorang mengkloningnya, mereka tidak perlu mengunduh sejarah senilai 6MB di mana satu-satunya file aktual yang akan mereka dapatkan pada komit terakhir adalah 300KB.
Saya mencari solusi yang mungkin untuk ini dan mencoba 2 metode ini
- Hapus file dari repositori git (histori)
- http://help.github.com/remove-sensitive-data/
- https://gist.github.com/1588371
Intisari sepertinya berfungsi di mana setelah menjalankan skrip, itu menunjukkan bahwa ia menyingkirkan folder itu dan setelah itu menunjukkan bahwa 50 komit yang berbeda dimodifikasi. Tapi itu tidak membiarkan saya mendorong kode itu. Ketika saya mencoba untuk mendorongnya, katanya Branch up to date
tetapi menunjukkan 50 komit diubah pada a git status
. 2 metode lainnya juga tidak membantu.
Sekarang meskipun itu menunjukkan bahwa itu menghilangkan sejarah folder itu, ketika saya memeriksa ukuran repo itu di localhost saya, itu masih sekitar 6MB. (Saya juga menghapus refs/original
folder tetapi tidak melihat perubahan dalam ukuran repo).
Apa yang ingin saya klarifikasi adalah, jika ada cara untuk menyingkirkan tidak hanya komit histori (yang merupakan satu-satunya hal yang saya pikir terjadi) tetapi juga file-file git tetap dengan asumsi seseorang ingin mengembalikan.
Katakanlah solusi yang disajikan untuk ini dan diterapkan di localhost saya tetapi tidak dapat direproduksi ke repo GitHub, apakah mungkin untuk mengkloning repo itu, kembalikan ke komit pertama melakukan trik dan mendorongnya (atau apakah itu berarti bahwa git akan masih memiliki riwayat semua komit itu - alias 6MB).
Tujuan akhir saya di sini adalah untuk pada dasarnya menemukan cara terbaik untuk menyingkirkan isi folder dari git sehingga pengguna tidak harus mengunduh barang senilai 6MB dan masih mungkin memiliki komitmen lain yang tidak pernah menyentuh folder modul (itu cukup kebanyakan dari mereka) dalam sejarah git.
Bagaimana saya bisa melakukan ini?
sumber
Jawaban:
Jika Anda di sini untuk menyalin-menempelkan kode:
Ini adalah contoh yang menghapus
node_modules
dari riwayatApa yang sebenarnya dilakukan git:
Baris pertama beralih melalui semua referensi pada pohon yang sama (
--tree-filter
) seperti KEPALA (cabang Anda saat ini), menjalankan perintahrm -rf node_modules
. Perintah ini menghapus folder node_modules (-r
, tanpa-r
,rm
tidak akan menghapus folder), tanpa konfirmasi yang diberikan kepada pengguna (-f
). Yang ditambahkan--prune-empty
menghapus tidak berguna (tidak mengubah apa pun) melakukan secara rekursif.Baris kedua menghapus referensi ke cabang lama itu.
Sisa perintah relatif mudah.
sumber
git count-objects -v
memeriksa apakah file-file itu benar-benar dihapus tetapi ukuran repositori tetap sama sampai saya mengkloning repositori lagi. Git mempertahankan salinan semua file asli yang saya pikir.--force-with-lease
, bukan--force
.Saya menemukan bahwa
--tree-filter
opsi yang digunakan dalam jawaban lain bisa sangat lambat, terutama pada repositori yang lebih besar dengan banyak komitmen.Inilah metode yang saya gunakan untuk menghapus direktori sepenuhnya dari sejarah git menggunakan
--index-filter
opsi, yang berjalan lebih cepat:Anda dapat memeriksa ukuran repositori sebelum dan sesudah
gc
dengan:sumber
--quiet
kegit rm
atas mempercepat saya menulis ulang setidaknya dengan faktor 4.Selain jawaban populer di atas, saya ingin menambahkan beberapa catatan untuk sistem Windows . Perintah
berfungsi sempurna tanpa modifikasi apa pun ! Karena itu, Anda tidak boleh menggunakan
Remove-Item
,del
atau apa pun, bukanrm -rf
.Jika Anda perlu menentukan path ke file atau direktori, gunakan garis miring seperti
./path/to/node_modules
sumber
Metode terbaik dan paling akurat yang saya temukan adalah mengunduh file bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
Kemudian jalankan perintah:
Jika Anda ingin menghapus file, gunakan opsi hapus file:
sumber
Tampaknya jawaban terbaru untuk ini adalah tidak menggunakan
filter-branch
secara langsung (setidaknya git sendiri tidak merekomendasikannya lagi), dan menunda yang berfungsi ke alat eksternal. Secara khusus, git-filter-repo saat ini direkomendasikan. Penulis alat itu memberikan argumen tentang mengapa menggunakanfilter-branch
secara langsung dapat menyebabkan masalah.Sebagian besar skrip multi-baris di atas untuk dihapus
dir
dari riwayat dapat ditulis ulang sebagai:Alat ini lebih kuat dari itu, rupanya. Anda dapat menerapkan filter berdasarkan penulis, email, refname, dan lainnya ( halaman manual lengkap di sini ). Selain itu, cepat . Instalasi mudah - didistribusikan dalam berbagai format .
sumber
pip3 install git-filter-repo
karena ini hanya stdlib dan tidak menginstal dependensi apa pun. Di Ubuntu 18 itu tidak kompatibel dengan versi git distroError: need a version of git whose diff-tree command has the --combined-all-paths option
, tetapi cukup mudah untuk menjalankannya didocker run -ti ubuntu:20.04
Lengkap salin & tempel resep, cukup tambahkan perintah di komentar (untuk solusi salin-tempel), setelah mengujinya:
Setelah ini, Anda dapat menghapus baris "node_modules /" dari .gitignore
sumber
node_modules
dari.gitignore
? Sehingga mereka bisa secara tidak sengaja berkomitmen lagi ??node_modules
dari.gitignore
.Untuk pengguna Windows, harap dicatat untuk menggunakan
"
alih-alih'
Juga ditambahkan-f
untuk memaksa perintah jika cadangan lain sudah ada.sumber
Saya menghapus folder bin dan obj dari proyek C # lama menggunakan git di windows. Hati-hati dengan
Itu menghancurkan integritas instalasi git dengan menghapus folder usr / bin di folder install git.
sumber