Saat ini saya sudah
- Repo GitHub kosong
- Repo server SSH (utama)
- Repo Lokal
Repo server SSH adalah repo (situs produksi) yang paling mutakhir, jadi saya melakukan klon Git dari sana ke lokal. Saya kemudian mencoba melakukan git push
ke GitHub.
Semuanya berjalan baik tetapi kemudian mengatakan sesuatu tentang nama file. Terlalu besar untuk GitHub. Saya tidak memerlukan file ini jadi saya menjalankan beberapa perintah Git untuk menyingkirkannya dari Git cache kemudian mendorong kembali ke server SSH.
Saya tidak melihat file besar secara lokal tetapi masih di server SSH meskipun git diff
tidak mengembalikan apa pun dan git push return "Semuanya up-to-date" - Dan meskipun file tersebut tidak terlihat dalam repo lokal ketika saya mencoba untuk mendorong ke GitHub saya masih mendapatkan kesalahan tentang hal itu
remote: error: File fpss.tar.gz adalah 135,17 MB; ini melebihi batas ukuran file GitHub sebesar 100 MB
Saya mengikuti langkah-langkah di bawah "memperbaiki masalah" yang tercantum pada bantuan GitHub jadi bukankah itu sudah cukup?
Bagaimana file masih dalam eter ketika itu tidak lokal atau terdaftar dalam status git / diff / push?
git log -- the_big_file
mengembalikan apa pun kepada Anda, maka file tersebut masih dalam sejarah.git push
dikatakan semuanya serba baru? Karena Anda mengubah riwayat, itu seharusnya mengeluh bahwa dorongan itu tidak mungkin dan Anda harus memaksanya.Jawaban:
Kamu bisa memakai
Ini akan menghapus semua yang ada di riwayat file itu. Masalahnya adalah bahwa file tersebut ada dalam riwayat.
Perintah ini mengubah hash dari commit Anda yang bisa menjadi masalah nyata, terutama pada repositori bersama. Seharusnya tidak dilakukan tanpa memahami konsekuensinya.
sumber
--all
flag sebagai gantiHEAD
Rewrite 657560fa18c030bcfac9132ce1c3541e84a5bc2c (1/10) (0 seconds passed, remaining 0 predicted) /usr/lib/git-core/git-filter-branch: 1: eval: Syntax error: end of file unexpected
Saya menemukan squashing lebih bermanfaat daripada
filter-branch
. Saya melakukan yang berikut:git reset --soft HEAD~3
.git commit -m "New message for the combined commit"
Kasing khusus (dari pengguna @lituo): Jika di atas tidak berfungsi, Anda mungkin memiliki kasing ini. Komit 1 termasuk file besar dan dorongan Komit 1 gagal karena kesalahan file besar. Commit 2 menghapus file besar dengan
git rm --cached [file_name]
tetapi dorongan Commit 2 masih gagal. Anda dapat mengikuti langkah-langkah yang sama di atas tetapi alih-alih menggunakanHEAD~3
, gunakanHEAD~2
.sumber
Ini adalah sesuatu yang saya temukan sangat membantu jika Anda sudah bermain-main dengan repo Anda sebelum Anda meminta bantuan. Tipe pertama:
Setelah ini, Anda akan melihat sesuatu di sepanjang baris
Bagian yang penting adalah "2 commit"! Dari sini, silakan dan ketik:
Jadi, untuk contoh di atas, orang akan mengetik:
Setelah Anda mengetik itu, "status git" Anda akan mengatakan:
Dari sana, Anda dapat menghapus file besar (dengan asumsi Anda belum melakukannya), dan Anda harus dapat mengkomit ulang semuanya tanpa kehilangan pekerjaan Anda.
Saya tahu ini bukan jawaban yang sangat mewah, tapi saya harap ini membantu!
sumber
Jika file ditambahkan dengan komit terbaru Anda , dan Anda belum mendorong ke repositori jarak jauh , Anda dapat menghapus file dan mengubah komit, Diambil dari sini :
sumber
untracked
daftar file digit status
.git rm --cached giant_file commit_id
tetapi tidak berhasil :(Saya memiliki masalah serupa dan menggunakan langkah di atas untuk menghapus file. Itu bekerja dengan sempurna.
Saya kemudian mendapat kesalahan pada file kedua yang perlu saya hapus:
remote: error: File <path/filename> is 109.99 MB; this exceeds GitHub's file size limit of 100.00 MB
Saya mencoba langkah yang sama, mendapat kesalahan:
"A previous backup already exists in <path/filename>"
Dari penelitian di situs web ini saya menggunakan perintah:
git filter-branch --force --index-filter "git rm --cached --ignore-unmatch <path/filename>" --prune-empty --tag-name-filter cat -- --all
Bekerja dengan baik, dan file-file besar dihapus.
Tidak bisa dipercaya, push masih gagal dengan kesalahan lain:
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 104 fatal: The remote end hung up unexpectedly
Ini saya perbaiki dengan secara langsung memodifikasi file konfigurasi .git -
postBuffer = 999999999
Setelah itu dorongan diteruskan!
sumber
git rm
saya perlu memberikan nama path repositori lengkap untuk file dan untuk melarikan diri # dengan backslash untuk membuatnya bekerjareset hard
langkah di bagian bawah halaman dengan dorongan sederhana. czettner.com/2015/07/16/...Mengapa GitHub menolak repo saya, bahkan setelah saya menghapus file besar?
Git menyimpan riwayat lengkap proyek Anda, jadi walaupun Anda 'menghapus' file dari proyek Anda, repo Git masih memiliki salinan file dalam riwayatnya, dan jika Anda mencoba untuk mendorong ke repositori lain (seperti yang di-host di GitHub) kemudian Git membutuhkan repo jarak jauh memiliki riwayat yang sama dengan repo lokal Anda (yaitu file besar yang sama dalam riwayatnya).
Bagaimana saya bisa mendapatkan GitHub untuk menerima repo saya?
Anda perlu membersihkan riwayat Git proyek Anda secara lokal, menghapus file-file besar yang tidak diinginkan dari semua riwayat, dan kemudian hanya menggunakan riwayat 'dibersihkan' di masa mendatang. Id Git dari commit yang terpengaruh akan berubah.
Bagaimana cara membersihkan file besar dari repo Git saya?
Alat terbaik untuk membersihkan file besar yang tidak diinginkan dari sejarah Git adalah BFG Repo-Cleaner - ini adalah alternatif yang lebih sederhana dan lebih cepat untuk
git-filter-branch
secara khusus dirancang untuk menghapus file yang tidak diinginkan dari sejarah Git.Ikuti petunjuk penggunaan dengan hati-hati , bagian intinya adalah ini:
File apa pun yang berukuran lebih dari 100MB (yang tidak ada dalam komit terbaru Anda ) akan dihapus dari riwayat repositori Git Anda. Anda kemudian dapat menggunakan
git gc
untuk membersihkan data yang mati:BFG biasanya setidaknya 10-50x lebih cepat daripada berjalan
git-filter-branch
, dan umumnya jauh lebih mudah digunakan.Pengungkapan penuh: Saya penulis Repo-Cleaner BFG.
sumber
Saya telah mencoba semua metode di atas tetapi tidak satupun yang berhasil untuk saya.
Lalu saya datang dengan solusi saya sendiri.
Pertama-tama, Anda memerlukan repo lokal yang bersih dan terkini. Hapus semua file besar.
Sekarang buat folder baru DI LUAR folder repo Anda dan gunakan "Git buat repositori di sini" untuk menjadikannya repositori Git baru, sebut saja new_local_repo. Ini dia! Semua metode di atas mengatakan Anda harus membersihkan sejarah ..., yah, saya muak dengan itu, mari kita buat repo baru yang tidak memiliki sejarah sama sekali!
Salin file dari repo lokal lama Anda ke repo baru yang cantik. Perhatikan bahwa logo hijau pada ikon folder akan hilang, ini menjanjikan karena ini adalah repo baru!
Berkomitmen ke cabang lokal dan kemudian dorong ke cabang baru yang jauh. Sebut saja new_remote_branch. Jika Anda tidak tahu cara mendorong dari repo lokal baru, Google.
Selamat! Anda telah mendorong kode Anda yang bersih dan terkini ke GitHub. Jika Anda tidak membutuhkan cabang master jarak jauh lagi, Anda dapat menjadikan new_remote_branch sebagai cabang master baru. Jika Anda tidak tahu cara melakukannya, Google.
Langkah terakhir, saatnya untuk menghapus repo lokal lama yang kacau. Di masa depan Anda hanya menggunakan new_local_repo.
sumber
Saya mendapat masalah yang sama dan tidak ada jawaban yang cocok untuk saya. Saya dipecahkan dengan langkah-langkah berikut:
1. Temukan komit yang berisi file besar
Komit bawah adalah komit tertua di daftar hasil.
2. Temukan yang tepat sebelum yang tertua.
Misalkan Anda punya:
3. Dapatkan rebase
Kiat :
drop
untuk komit berisi file besar.git rebase --continue
untuk melanjutkan sampai Anda menyelesaikannya.git rebase --abort
untuk membatalkannya.sumber
ini harus menulis ulang komit lokal Anda dengan referral lfs baru
https://github.com/git-lfs/git-lfs/blob/master/docs/man/git-lfs-migrate.1.ronn?utm_source=gitlfs_site&utm_medium=doc_man_migrate_link&utm_campaign=gitlfsamples contoh
sumber
Solusi untuk menyimpan file / folder besar di dalam folder yang berfungsi
Ini adalah baris yang berfungsi untuk menyelesaikan masalah yang ditanyakan di sini (dari jawaban 1):
git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch <file/dir>' HEAD
Perintah ini juga menghapus file / dir jika file / dir berada di dalam pohon kerja.
Jika Anda ingin menyimpan file / folder di dalam pohon kerja saya mengusulkan mengambil langkah-langkah berikut.
git reset HEAD^
Tambahkan file / folder yang dimaksud ke dalam file `` .gitignore```.
Lanjutkan seperti biasa
git add .
yang mungkin menangkap file / folder lain tetapi harus menangkap.gitignore
file. Berikutnyagit commit -m"message"
dan akhirnyagit push origin <branch_name>
sumber
ini berhasil untuk saya. dokumentasi dari github Squashing Git Commit git reset asal / master
temukan dokumentasi di sini
sumber
Jadi saya menghadapi situasi tertentu: Saya mengkloning repositori dari gitlab, yang berisi file lebih besar dari 100 mb, tetapi dihapus pada beberapa titik dalam sejarah git. Kemudian ketika saya menambahkan repo pribadi github baru dan mencoba mendorong ke repo baru, saya mendapatkan kesalahan 'file terlalu besar' yang terkenal. Pada titik ini, saya tidak lagi memiliki akses ke repo gitlab asli. Namun, saya masih bisa mendorong ke repo github pribadi baru menggunakan
bfg-repo-cleaner
pada repositori LOCAL di komputer saya:sumber
Terkadang file disimpan dalam riwayat pelacakan, coba langkah-langkah berikut:
git commit
, Jika Anda melihat mode buat dengan file besar terdaftar, maka lakukan:git filter-branch --index-filter 'git rm -r --cached --ignore-unmatch filename' HEAD
. Anda akan melihat banyak Rewrite ditampilkan di konsol Anda yang berakhir dengan:rm 'nama file' dan
baris terakhir Ref ditulis ulang.
Selesai.
sumber
Saya menambah jawaban pertama.
Akan ada beberapa konflik gabungan dari asal / master.
Tolong jalankan ini
Ini akan membuang semua perubahan saya yang dipentaskan dan tidak dipentaskan, lupakan semuanya pada cabang lokal saya saat ini dan membuatnya sama persis dengan asal / master.
sumber