Saat ini saya memiliki repositori Git lokal, yang saya dorong ke repositori Github.
Repositori lokal memiliki ~ 10 commit, dan repositori Github adalah duplikat tersinkronisasi dari ini.
Apa yang ingin saya lakukan adalah menghapus SEMUA riwayat versi dari repositori Git lokal, sehingga konten repositori saat ini muncul sebagai satu-satunya komit (dan karenanya file versi lama dalam repositori tidak disimpan).
Saya kemudian ingin mendorong perubahan ini ke Github.
Saya telah menyelidiki Git rebase, tetapi ini tampaknya lebih cocok untuk menghapus versi tertentu. Solusi potensial lain adalah dengan menghapus repo lokal, dan membuat yang baru - meskipun ini mungkin akan membuat banyak pekerjaan!
ETA: Ada direktori / file tertentu yang tidak dapat dilacak - jika mungkin saya ingin menjaga pelacakan dari file-file ini.
sumber
Jawaban:
Inilah pendekatan brute-force. Itu juga menghapus konfigurasi repositori.
Catatan : Ini TIDAK berfungsi jika repositori memiliki submodula! Jika Anda menggunakan submodul, Anda harus menggunakan mis. Rebase interaktif
Langkah 1: hapus semua riwayat ( Pastikan Anda memiliki cadangan, ini tidak dapat dikembalikan )
Langkah 2: merekonstruksi repo Git hanya dengan konten saat ini
Langkah 3: dorong ke GitHub.
sumber
.gitignore
harus menangani itu, kan?git commit -m "Initial commit"
Anda mungkin dapat melewatkangit remote add ...
bagian tersebut, dengan anggapan bahwa itu sudah ada dalam konfigurasi Anda, dan langsung beralih ke mendorong. Ini berhasil untuk saya.Satu-satunya solusi yang bekerja untuk saya (dan membuat submodula berfungsi) adalah
Menghapus
.git/
selalu menyebabkan masalah besar ketika saya memiliki submodula.git rebase --root
Entah bagaimana menggunakan akan menyebabkan konflik bagi saya (dan butuh waktu lama sejak saya memiliki banyak sejarah).sumber
git push -f origin master
sebagai op terakhir dan matahari akan bersinar lagi pada repo baru Anda! :)git gc --aggressive --prune all
seluruh poin kehilangan sejarah akan terlewatkan.Ini adalah pendekatan favorit saya:
Ini akan membuat cabang baru dengan satu komit yang menambahkan semuanya di HEAD. Itu tidak mengubah apa pun, jadi itu benar-benar aman.
sumber
git-rev-parse
dokumen. Apa yang terjadi di sini adalahgit-commit-tree
memerlukan referensi ke pohon (snapshot dari repo), tetapiHEAD
merupakan revisi. Untuk menemukan pohon yang terkait dengan komit, kami menggunakan<rev>^{<type>}
formulir.git push --force <remote> new_branch_name:<remote-branch>
Opsi lain, yang bisa berubah menjadi banyak pekerjaan jika Anda memiliki banyak komitmen, adalah rebase interaktif (dengan asumsi versi git Anda> = 1.7.12):
git rebase --root -i
Ketika disajikan dengan daftar komitmen di editor Anda:
Simpan dan tutup. Git akan mulai rebasing.
Pada akhirnya Anda akan memiliki komit root baru yang merupakan kombinasi dari semua yang datang setelahnya.
Keuntungannya adalah Anda tidak perlu menghapus repositori dan jika Anda berpikir dua kali, Anda selalu memiliki cadangan.
Jika Anda benar-benar ingin menghapus riwayat Anda, setel ulang master ke komit ini dan hapus semua cabang lainnya.
sumber
error: failed to push some refs to
git push --force-with-lease
. force-with-leasing digunakan karena kurang merusak daripada - force.Varian dari metode larsman yang diusulkan:
Simpan daftar untrackfiles Anda:
Simpan konfigurasi git Anda:
Kemudian lakukan langkah pertama larsman:
Pulihkan konfigurasi Anda:
Hapus jejak file yang tidak terlacak:
Kemudian lakukan:
Dan akhirnya dorong ke repositori Anda:
sumber
Di bawah ini adalah skrip yang diadaptasi dari jawaban @Zeelot. Seharusnya menghapus sejarah dari semua cabang, bukan hanya cabang master:
Ini berfungsi untuk tujuan saya (saya tidak menggunakan submodula).
sumber
git branch
akan menyertakan tanda bintang di sebelah cabang yang Anda periksa, yang kemudian akan di-globbed, menyebabkannya untuk menyelesaikan semua file atau folder seolah-olah itu juga nama-nama cabang. Sebagai gantinya, saya menggunakangit branch --format="%(refname:lstrip=2)"
yang memberi saya hanya nama cabang.git push --force origin master
, ataugit push --force-with-lease
? Rupanya yang terakhir lebih aman (lihat stackoverflow.com/questions/5509543/… )Anda bisa menggunakan klon dangkal (git> 1.9):
Bacaan lebih lanjut: http://blogs.atlassian.com/2014/05/handle-big-repositories-git/
sumber
git filter-branch
adalah alat operasi utama.--parent-filter
membuat orang tua memakai stdin dan harus mencetak orang tua yang ditulis ulang di stdout; unixtrue
berhasil keluar dan tidak mencetak apa pun, jadi: tidak ada orang tua.@^!
adalah singkatan Git untuk "kepala melakukan tetapi tidak ada orang tuanya". Kemudian hapus semua referensi lainnya dan dorong pada waktu luang.sumber
Hapus saja repo Github dan buat yang baru. Sejauh ini pendekatan tercepat, termudah dan teraman. Lagi pula, apa yang harus Anda dapatkan dengan menjalankan semua perintah itu dalam solusi yang diterima ketika yang Anda inginkan adalah cabang utama dengan satu komit?
sumber
Metode di bawah ini benar-benar dapat direproduksi, jadi tidak perlu menjalankan klon lagi jika kedua belah pihak konsisten, cukup jalankan skrip di sisi lain juga.
Jika Anda ingin membersihkannya, coba skrip ini:
http://sam.nipl.net/b/git-gc-all-ferocious
Saya menulis sebuah skrip yang "membunuh sejarah" untuk setiap cabang di repositori:
http://sam.nipl.net/b/git-kill-history
lihat juga: http://sam.nipl.net/b/confirm
sumber
git-hash: not found
danSupport for <GIT_DIR>/info/grafts is deprecated
git log HEAD~${1:-0} -n1 --format=%H
, di sini, sam.aiki.info/b/git-hash Akan lebih baik untuk meletakkan semuanya dalam satu skrip untuk konsumsi publik. Jika saya pernah menggunakannya lagi, saya mungkin mencari cara untuk melakukannya dengan fitur baru yang menggantikan "cangkokan".Jawaban yang lebih konseptual:
git secara otomatis mengumpulkan sampah commit lama jika tidak ada tag / cabang / referensi menunjuk mereka. Jadi, Anda hanya perlu menghapus semua tag / cabang dan membuat komit yatim baru, yang terkait dengan cabang apa pun - dengan konvensi Anda akan membiarkan cabang
master
menunjuk komit itu.Komit lama yang tidak terjangkau tidak akan pernah lagi dilihat oleh siapa pun kecuali mereka menggali dengan perintah git tingkat rendah. Jika itu cukup bagi Anda, saya hanya akan berhenti di situ dan membiarkan GC otomatis melakukan tugasnya kapan pun ia mau. Jika Anda ingin segera menyingkirkannya, Anda dapat menggunakan
git gc
(mungkin dengan--aggressive --prune=all
). Untuk repositori git jarak jauh, tidak ada cara bagi Anda untuk memaksakan itu, kecuali jika Anda memiliki akses shell ke sistem file mereka.sumber
Ini dia:
Juga dihosting di sini: https://gist.github.com/Zibri/76614988478a076bbe105545a16ee743
sumber
Saya memecahkan masalah yang sama dengan hanya menghapus
.git
folder dari proyek saya dan mengintegrasikan kembali dengan kontrol versi melalui IntelliJ. Catatan:.git
Folder ini disembunyikan. Anda dapat melihatnya di terminal denganls -a
, dan kemudian menghapusnya menggunakanrm -rf .git
.sumber
Untuk itu gunakan perintah Dangkal Klon git klon --depth 1 URL - Ini hanya akan mengkloning KEPALA repositori
sumber
Info lebih lanjut di sini.
Git tutoturial di sini menyediakan bantuan tentang cara membersihkan repositori:
sumber