Saya khawatir saya tidak dapat menemukan sesuatu yang persis seperti skenario khusus ini.
Saya memiliki repositori git dengan banyak riwayat: 500+ cabang, 500+ tag, kembali ke pertengahan 2007. Ini mengandung ~ 19.500 komit. Kami ingin menghapus semua riwayat sebelum 1 Januari 2010, untuk membuatnya lebih kecil dan lebih mudah untuk ditangani (kami akan menyimpan salinan lengkap dari sejarah dalam repositori arsip).
Saya tahu komit yang saya inginkan telah menjadi root dari repositori baru. Saya tidak bisa, bagaimanapun, mencari tahu git mojo yang benar untuk memotong repo untuk memulai dengan komit itu. Saya menduga beberapa varian
git filter-branch
akan diperlukan cangkok; itu juga mungkin diperlukan untuk mengobati masing-masing 200 + cabang kami ingin menjaga secara terpisah dan kemudian menambal repo kembali bersama-sama (sesuatu yang saya lakukan tahu bagaimana melakukannya).
Adakah yang pernah melakukan hal seperti ini? Saya mendapat git 1.7.2.3 jika itu penting.
sumber
git filter-branch --tag-name-filter cat -- --all
untuk memperbarui tag. Tapi saya juga punya tag lama yang menunjuk ke riwayat lama yang ingin saya hapus. Bagaimana saya bisa menyingkirkan semua tag lama itu? Jika saya tidak menghapusnya, maka riwayat lama tidak hilang dan saya masih bisa melihatnyagitk --all
.echo "<NEW-ROOT-HASH>" > .git/info/grafts
Mungkin sudah terlambat untuk mengirim balasan, tetapi karena halaman ini adalah hasil Google pertama, mungkin masih bermanfaat.
Jika Anda ingin mengosongkan ruang dalam git repo Anda, tetapi tidak ingin membangun kembali semua komitmen Anda (rebase atau graft), dan masih dapat mendorong / menarik / menggabungkan dari orang-orang yang memiliki repo penuh, Anda dapat menggunakan git clone clone dangkal ( --depth parameter).
Anda mungkin dapat melakukan repo pada repo yang ada, dengan mengikuti langkah-langkah ini:
Bagaimana cara menghapus semua tag lokal git?
P: Versi git yang lebih lama tidak mendukung klon / push / pull dari / ke repo dangkal.
sumber
cd
ke folder yang baru saja dihapus? Saya merasa ada beberapa informasi yang hilang di sini. Juga, apakah ada cara untuk menerapkan perubahan ini ke repo jarak jauh?git clone file:///Users/me/Projects/myProject myClonedProject --shallow-since=2016-09-02
Bekerja seperti pesona!git filter-branch -- --all
. Ini akan mengubah semua hash di dalamnya tetapi setelah itu Anda akan dapat mendorongnya ke repo baruIni metode ini mudah dimengerti dan berfungsi dengan baik. Argumen ke skrip (
$1
) adalah referensi (tag, hash, ...) untuk komit yang Anda inginkan untuk menyimpan riwayat Anda.Perhatikan bahwa tag lama akan tetap ada; jadi Anda mungkin harus menghapusnya secara manual
komentar: Saya tahu ini hampir sama dengan @yoyodin, tetapi ada beberapa perintah dan informasi tambahan yang penting di sini. Saya mencoba mengedit jawabannya, tetapi karena ini adalah perubahan besar pada jawaban @ yoyodin, hasil edit saya ditolak, jadi inilah informasinya!
sumber
git prune
dangit gc
perintah. Apakah ada penjelasan untuk sisa perintah dalam skrip? Seperti berdiri, tidak jelas argumen apa yang sedang diberikan padanya dan apa yang dilakukan setiap perintah. Terima kasih.-p
kerebase
perintah, seperti yang disarankan dalam jawaban lainCoba metode ini Cara memotong riwayat git :
Berikut
$1
adalah SHA-1 dari komit Anda ingin menyimpan dan script akan membuat cabang baru yang berisi semua komit antara$1
danmaster
dan semua sejarah yang lebih tua dijatuhkan. Perhatikan bahwa skrip sederhana ini berasumsi bahwa Anda tidak memiliki cabang yang ada dipanggiltemp
. Perhatikan juga bahwa skrip ini tidak menghapus data git untuk riwayat lama. Jalankangit gc --prune=all && git repack -a -f -F -d
setelah Anda memverifikasi bahwa Anda benar-benar ingin kehilangan semua riwayat. Anda mungkin juga perlurebase --preserve-merges
tetapi diperingatkan bahwa implementasi git dari fitur itu tidak sempurna. Periksa hasilnya secara manual jika Anda menggunakannya.sumber
rebase
langkah. Aneh - Saya tidak berharap bahwa konflik gabungan dapat dimungkinkan dalam situasi ini.git commit --allow-empty -m "Truncate history"
jika komit yang Anda periksa tidak mengandung file apa pun.Sebagai alternatif untuk menulis ulang sejarah, pertimbangkan untuk menggunakan
git replace
seperti dalam artikel ini dari Git Pro buku . Contoh yang dibahas melibatkan penggantian orang tua yang berkomitmen untuk mensimulasikan awal pohon, sambil tetap menjaga sejarah penuh sebagai cabang terpisah untuk diamankan.sumber
git replace
. Saya percaya ini diperbaiki pada pertanyaan lain di mana Anda memposting jawaban ini.git replace
versusgit graft
dilakukan di stackoverflow.com/q/6800692/873282Jika Anda ingin tetap dengan hulu repositori dengan sejarah penuh , tapi checkout kecil lokal, melakukan clone dangkal dengan
git clone --depth=1 [repo]
.Setelah mendorong komit, Anda bisa melakukannya
git fetch --depth=1
untuk memangkas komitmen lama. Ini membuat komitmen lama dan objeknya tidak dapat dijangkau.git reflog expire --expire-unreachable=now --all
. Untuk mengakhiri semua komitmen lama dan objeknyagit gc --aggressive --prune=all
untuk menghapus objek lamaLihat juga Bagaimana menghapus riwayat git lokal setelah komit? .
Perhatikan bahwa Anda tidak dapat mendorong repositori "dangkal" ini ke tempat lain: "pembaruan dangkal tidak diizinkan". Lihat Remote ditolak (pembaruan dangkal tidak diizinkan) setelah mengubah URL remote Git . Jika Anda ingin itu, Anda harus tetap dengan okulasi.
sumber
Saya perlu membaca beberapa jawaban dan beberapa info lain untuk memahami apa yang saya lakukan.
1. Abaikan segala yang lebih tua dari komit tertentu
File
.git/info/grafts
dapat menentukan orang tua palsu untuk komit. Baris dengan hanya komit, mengatakan bahwa komit tidak memiliki orang tua. Jika kami ingin mengatakan bahwa kami hanya peduli dengan 2000 komitmen terakhir, kami dapat mengetik:git rev-parse memberi kita id komit dari induk ke-2000 dari komit saat ini. Perintah di atas akan menimpa file cangkok jika ada. Periksa apakah ada di sana dulu.
2. Tulis ulang riwayat Git (opsional)
Jika Anda ingin menjadikan orangtua palsu yang dicangkokkan ini asli, maka jalankan:
Itu akan mengubah semua id komit. Setiap salinan repositori ini perlu diperbarui secara paksa.
3. Bersihkan ruang disk
Saya tidak melakukan langkah 2, karena saya ingin salinan saya tetap kompatibel dengan hulu. Saya hanya ingin menghemat ruang disk. Untuk melupakan semua komitmen lama:
Alternatif: salinan dangkal
Jika Anda memiliki salinan repositori lain yang dangkal dan hanya ingin menghemat ruang disk, Anda dapat memperbarui
.git/shallow
. Tapi hati-hati bahwa tidak ada yang menunjuk pada komitmen dari sebelumnya. Jadi Anda dapat menjalankan sesuatu seperti ini:Entri dalam dangkal berfungsi seperti graft. Tapi hati-hati jangan sampai menggunakan cangkokan dan dangkal pada saat bersamaan. Paling tidak, tidak memiliki entri yang sama di sana, itu akan gagal.
Jika Anda masih memiliki beberapa referensi lama (tag, cabang, kepala jarak jauh) yang menunjuk ke komit yang lebih lama, mereka tidak akan dibersihkan dan Anda tidak akan menghemat lebih banyak ruang disk.
sumber
git replace
. Lihat stackoverflow.com/questions/6800692/…Ketika rebase atau push to head / master kesalahan ini dapat terjadi
Untuk mengatasi masalah ini di dashboard git harus menghapus cabang master dari "Cabang yang dilindungi"
maka Anda dapat menjalankan perintah ini
atau
sumber
Ada terlalu banyak jawaban di sini yang tidak terkini dan beberapa tidak sepenuhnya menjelaskan konsekuensinya. Inilah yang berhasil bagi saya untuk memangkas sejarah menggunakan git 2.26 terbaru:
Pertama buat komit dummy. Komit ini akan muncul sebagai komit pertama di repo terpotong Anda. Anda memerlukan ini karena komit ini akan menampung semua file dasar untuk riwayat yang Anda simpan. SHA adalah ID dari komit sebelumnya dari komit yang ingin Anda pertahankan (dalam contoh ini,
8365366
). String 'Initial' akan muncul sebagai pesan komit dari komit pertama. Jika Anda menggunakan Windows, ketikkan perintah di bawah ini dari command prompt Git Bash.Perintah di atas akan mencetak SHA, misalnya
d10f7503bc1ec9d367da15b540887730db862023
,.Sekarang ketikkan saja:
Ini pertama-tama akan meletakkan semua file sebagai-komit
8365366
ke komit dummyd10f750
. Kemudian akan memainkan semua komit setelah 8365366 di atasd10f750
. Akhirnyamaster
pointer cabang akan diperbarui untuk komit terakhir diputar.Sekarang jika Anda ingin mendorong repo terpotong ini, lakukan saja
git push -f
.Beberapa hal yang perlu diingat (ini berlaku untuk metode lain dan juga yang ini): Tag tidak ditransfer. Sementara ID komit dan stempel waktu dipertahankan, Anda akan melihat GitHub menunjukkan komit ini dalam judul lumpsum seperti
Commits on XY date
.Untungnya dimungkinkan untuk menjaga riwayat terpotong sebagai "arsip" dan kemudian Anda dapat bergabung kembali repo dipangkas dengan arsip repo. Untuk melakukan ini, lihat panduan ini .
sumber
Anda dapat menghapus direktori, file dan juga seluruh riwayat yang terkait dengan dir atau file menggunakan jar yang disebutkan di bawah ini [unduh] dan perintahnya
file bfg.jar: https://rtyley.github.io/bfg-repo-cleaner/
git clone --besar repo-url cd repo_dir java -jar bfg.jar --delete-folder folder_name git reflog kedaluwarsa - expire = sekarang --semua & & git gc --prune = sekarang - dorongan git agresif --mirror repo_url
sumber
sumber