Saya memeriksa banyak file ke dalam cabang dan menggabungkannya dan kemudian harus menghapusnya dan sekarang saya pergi dengan file .pack besar yang saya tidak tahu bagaimana cara membuangnya.
Saya menghapus semua file menggunakan git rm -rf xxxxxx
dan saya juga menjalankan --cached
opsi juga.
Adakah yang bisa memberi tahu saya bagaimana saya bisa menghapus file .pack besar yang saat ini ada di direktori berikut:
.git/objects/pack/pack-xxxxxxxxxxxxxxxxx.pack
Apakah saya hanya perlu menghapus cabang yang masih saya miliki tetapi tidak lagi digunakan? Atau ada hal lain yang perlu saya jalankan?
Saya tidak yakin seberapa besar perbedaannya tetapi ini menunjukkan gembok pada file.
Terima kasih
EDIT
Berikut adalah beberapa kutipan dari bash_history saya yang seharusnya memberi gambaran bagaimana saya bisa masuk ke status ini (asumsikan pada titik ini saya sedang mengerjakan cabang git yang disebut 'cabang-saya' dan saya punya folder yang berisi lebih banyak folder / file):
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)
Saya pikir saya juga menjalankan perintah berikut tetapi tidak muncul di bash_history dengan yang lain:
git rm -rf --cached unwanted_folder/
Saya juga berpikir saya menjalankan beberapa perintah git (seperti git gc
) untuk mencoba merapikan file paket tetapi mereka juga tidak muncul di file .bash_history.
sumber
Jawaban:
Masalahnya adalah, meskipun Anda menghapus file, file tersebut masih ada di revisi sebelumnya. Itulah inti dari git, adalah bahwa meskipun Anda menghapus sesuatu, Anda masih bisa mendapatkannya kembali dengan mengakses riwayat.
Apa yang ingin Anda lakukan disebut menulis ulang riwayat, dan ini melibatkan
git filter-branch
perintah.GitHub memiliki penjelasan yang bagus tentang masalah tersebut di situs mereka. https://help.github.com/articles/remove-sensitive-data
Untuk menjawab pertanyaan Anda lebih langsung, yang pada dasarnya perlu Anda jalankan adalah perintah ini dengan
unwanted_filename_or_folder
diganti sesuai:Ini akan menghapus semua referensi ke file dari riwayat aktif repo.
Langkah selanjutnya, untuk melakukan siklus GC untuk memaksa semua referensi ke file akan kedaluwarsa dan dihapus dari file paket. Tidak ada yang perlu diganti dalam perintah ini.
sumber
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
2)git reflog expire --expire=now --all
3)git gc --prune=now
bfg
jauh lebih mudah. Ini juga direkomendasikan di dokumen resmi github: help.github.com/articles/…Skenario A : Jika file besar Anda hanya ditambahkan ke cabang, Anda tidak perlu menjalankannya
git filter-branch
. Anda hanya perlu menghapus cabang dan menjalankan pengumpulan sampah:Skenario B : Namun, sepertinya berdasarkan riwayat bash Anda, Anda telah menggabungkan perubahan ke master. Jika Anda belum membagikan perubahan dengan siapa pun (
git push
belum). Hal termudah adalah mengatur ulang master kembali ke sebelum bergabung dengan cabang yang memiliki file besar. Ini akan menghilangkan semua komitmen dari cabang Anda dan semua komitmen yang dibuat untuk master setelah penggabungan. Jadi, Anda mungkin kehilangan perubahan - selain file besar - yang mungkin sebenarnya Anda inginkan:Kemudian jalankan langkah-langkah dari skenario A.
Skenario C : Jika ada perubahan lain dari cabang atau perubahan pada master setelah penggabungan yang ingin Anda pertahankan, sebaiknya rebase master dan secara selektif menyertakan komit yang Anda inginkan:
Di editor Anda, hapus baris yang sesuai dengan komit yang menambahkan file besar, tetapi biarkan yang lainnya apa adanya. Simpan dan keluar. Cabang master Anda seharusnya hanya berisi apa yang Anda inginkan, dan tidak ada file besar. Perhatikan bahwa
git rebase
tanpa-p
akan menghilangkan komit gabungan, jadi Anda akan memiliki riwayat linier untuk master setelahnya<commit hash>
. Ini mungkin baik-baik saja untuk Anda, tetapi jika tidak, Anda dapat mencobanya-p
, tetapigit help rebase
berkatacombining -p with the -i option explicitly is generally not a good idea unless you know what you are doing
.Kemudian jalankan perintah dari skenario A.
sumber
Seperti yang telah dinyatakan loganfsmyth dalam jawabannya , Anda perlu membersihkan riwayat git karena file tetap ada di sana bahkan setelah menghapusnya dari repo. Dokumen resmi GitHub merekomendasikan BFG yang menurut saya lebih mudah digunakan daripada
filter-branch
:Menghapus file dari sejarah
Unduh BFG dari situs web mereka. Pastikan Anda telah menginstal java, lalu buat klon cermin dan riwayat pembersihan. Pastikan untuk mengganti
YOUR_FILE_NAME
dengan nama file yang ingin Anda hapus:Hapus folder
Sama seperti di atas tapi pakai
--delete-folders
Pilihan lain
BFG juga memungkinkan opsi yang lebih mewah (lihat dokumen ) seperti ini:
Hapus semua file yang lebih besar dari 100 juta dari riwayat:
Penting!
Saat menjalankan BFG, berhati-hatilah karena keduanya
YOUR_FILE_NAME
danYOUR_FOLDER_NAME
memang hanya nama file / folder. Itu bukan jalan , jadi sesuatu sepertifoo/bar.jpg
itu tidak akan berhasil! Sebaliknya semua file / folder dengan nama yang ditentukan akan dihapus dari riwayat repo, tidak peduli jalur atau cabang mana mereka ada.sumber
bfg
alat ini ke repo git lokal, seperti apa tampilan perintahnya?Satu pilihan:
dijalankan
git gc
secara manual untuk memadatkan sejumlah file paket menjadi satu atau beberapa file paket. Operasi ini bersifat persisten (yaitu file paket besar akan mempertahankan perilaku kompresinya) sehingga mungkin bermanfaat untuk mengompresi repositori secara berkala dengangit gc --aggressive
Pilihan lainnya adalah menyimpan kode dan .git di suatu tempat lalu menghapus .git dan mulai lagi menggunakan kode yang ada ini, membuat repositori git baru (
git init
).sumber
git gc
dan turun ke hanya beberapa file paket tetapi yang besar masih salah satunya dan saya hanya ingin menyingkirkannya sehingga saya dapat membuat cadangan folder secara eksternal lebih mudah (zip sebelumnya adalah 1 -2Mb, sekarang 55Mb). Kecuali seseorang dapat menyarankan hal lain, saya pikir saya mungkin harus membuat git baru. Saya berasumsi ini berarti saya akan kehilangan akses ke cabang yang saat ini saya miliki dll ...?Jalankan perintah berikut, ganti
PATH-TO-YOUR-FILE-WITH-SENSITIVE-DATA
dengan jalur ke file yang ingin Anda hapus, bukan hanya nama filenya. Argumen ini akan:Ini akan secara paksa menghapus semua referensi ke file dari riwayat aktif repo.
Langkah berikutnya, untuk melakukan siklus GC untuk memaksa semua referensi ke file tersebut kedaluwarsa dan dihapus dari file paket. Tidak ada yang perlu diganti dalam perintah ini.
sumber
Saya agak terlambat untuk pertunjukan tetapi jika jawaban di atas tidak menyelesaikan pertanyaan, maka saya menemukan cara lain. Cukup hapus file besar tertentu dari .pack. Saya mengalami masalah ini di mana saya memeriksa file 2GB besar secara tidak sengaja. Saya mengikuti langkah-langkah yang dijelaskan di tautan ini: http://www.ducea.com/2012/02/07/howto-completely-remove-a-file-from-git-history/
sumber
ini lebih merupakan solusi praktis daripada solusi pengkodean. zip file tersebut. Buka zip dalam format tampilan file (berbeda dengan unzip). Hapus file .pack. Buka zip dan ganti foldernya. Bekerja seperti pesona!
sumber