cari

Rumah  >  Soal Jawab  >  teks badan

如何批量删除git仓库中的提交纪录?

如何批量删除一些很久之前的提交记录,但保留那些修改的内容。

某草草某草草2796 hari yang lalu802

membalas semua(1)saya akan balas

  • 滿天的星座

    滿天的星座2017-04-28 09:08:29

    Soalan ini agak A/B, kerana anda tidak menerangkan senario pemadaman rekod komit lama dahulu, yang sangat penting kerana ia akan menjejaskan pilihan penggunaan Git yang seterusnya. Contohnya:

    1. Jika saya ingin memadamkan penyerahan daripada sejarah yang dihantar sebelum peperiksaan, tetapi masih banyak penyerahan yang perlu dikekalkan kemudian:
      1.2 Jika rekod sejarah yang akan dipadam bertaburan, anda boleh mempertimbangkan Interactive Rebase, pilih/gabungkan sendiri, dsb. Seperti git rebase -i <ref>
      1.1 Jika rekod sejarah yang akan dipadamkan adalah berterusan, sebagai contoh, semua rekod dari awal hingga saat tertentu boleh dipadamkan atau bahagian di tengah boleh dipadamkan, anda boleh mempertimbangkan Onto Rebase, seperti sebagai git rebase --onto <ONTO_BASE_ref> <START_ref> <END_ref>, dengan START Bahagian antara END ialah bahagian yang perlu dikekalkan, dan ONTO_BASE ialah titik asas terkini, dengan kata lain, rekod sejarah antara ONTO_BASE dan START akan dipadamkan.
    2. Jika saya ingin memadamkan banyak rekod sejarah dan menyimpan sangat sedikit (sebagai contoh, simpan yang paling terkini, saya tidak mahu lagi), maka saya boleh mencipta Cawangan Yatim untuk membina semula rekod. Sebagai contoh, git checkout --orphan new_start, arahan ini akan mencipta cawangan yang dipanggil new_start Cawangan ini tidak mempunyai sebarang sejarah, tetapi semua fail akan wujud secara utuh dan anda boleh mula menyerahkan semula dengan sewajarnya. Selepas selesai, anda juga boleh membuang cawangan lama secara langsung. Selain itu, anda juga boleh menentukan titik permulaan cawangan baharu. Lalai sudah tentu bermula dari HEAD.
    3. Anda juga boleh membahagikan rekod sejarah kepada dua (atau lebih) bahagian, sebahagian daripadanya lengkap, sebahagian daripadanya dipermudahkan, dsb. Untuk butiran, sila rujuk dokumen ini tentang git replace: http://git -scm.com/2010/03/17/replace.html

    Sebenarnya, terdapat banyak senario yang boleh dikatakan Penggunaan Git sangat fleksibel Walaupun anda tidak menggunakannya buat sementara waktu, ia patut dibaca dengan teliti untuk mengetahui jenis perkara yang boleh dilakukannya maka anda boleh menyimpulkannya sendiri apabila menghadapi pelbagai senario yang kompleks. Terdapat penyelesaiannya.


    Sebagai penyelenggara Repo, perkara yang paling biasa ialah menyimpannya daripada rujukan tertentu kepada HEAD, dan kemudian memadamkan sejarah sebelumnya. Oleh kerana tugasan ini agak biasa, berikut ialah skrip shell untuk dikongsi dengan anda:

    sh#!/bin/bash
    git checkout --orphan temp 
    git commit -m "截取的历史记录起点"
    git rebase --onto temp  master
    git branch -D temp
    

    digunakan seperti ini (contohnya, skrip disimpan sebagai git-detach): git-detach <ref>, dengan <ref> ialah titik permulaan rekod sejarah yang anda ingin simpan.

    Perlu diambil perhatian bahawa skrip ini hanya "memisahkan" rekod sejarah, dan kemudian beberapa daripadanya tidak mempunyai rujukan yang boleh dilihat dan tidak kelihatan dalam rekod sejarah Walau bagaimanapun, objek git mereka masih wujud (. Dalam erti kata lain, anda masih boleh memulihkan dan menyemak git-reflog sendiri Jika anda benar-benar mahu membuang sepenuhnya sejarah ini (untuk menurunkan berat badan untuk repo), anda boleh menggunakan git gc --prune, dan anda tidak akan mendapat. ia kembali.

    P.S. Skrip ini bergantung pada Cawangan Orphan, yang tidak disokong oleh versi Git yang lebih rendah (mungkin < v1.7.x jika anda mempunyai alternatif, sila Google sendiri).

    balas
    0
  • Batalbalas