Gagal menghapus file dari repo Git, tidak dapat membuat cadangan baru


116

Saya mencoba menghapus file dari repo jarak jauh saya dengan menjalankan:

git filter-branch --index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

Tapi Git mengeluhkan itu

Tidak dapat membuat cadangan baru. Cadangan sebelumnya sudah ada di refs / original /
Paksa penimpaan cadangan dengan -f
rm: tidak dapat dihapus /.git-rewrite/backup-refs: Izin ditolak
rm: tidak dapat menghapus direktori /.git-rewrite: Direktori tidak kosong

Ini terjadi setelah saya menghapus direktori .git-rewrite di Windows.

Bagaimana cara menghapus file itu? Ini adalah file 29Mb yang ada di repo saya, jadi saya perlu menghapus file tersebut.

Saya mencoba untuk menghapus komit masuk git rebase -i, tetapi ternyata karena komit menyentuh banyak file yang berbeda, Git mengeluhkan konflik dan saya membatalkannya untuk aman.


1
Untuk mesin telusur: ini juga berlaku jika pesan kesalahan Anda adalah .git-rewrite already exists, please remove it.
Drew Noakes

Jawaban:


219

Anda telah melakukan operasi cabang-filter. Setelah filter-branch, Git menyimpan referensi ke commit lama, jika terjadi kesalahan.

Anda dapat menemukannya di .git/refs/original/…. Hapus direktori tersebut dan semua file di dalamnya, atau gunakan -fflag untuk memaksa Git menghapus referensi lama.

git filter-branch -f \
--index-filter 'git rm --cached --ignore-unmatch Rakefile' HEAD

10
Akhirnya berhasil, terima kasih! Saya mencoba flag -f, tetapi masalahnya adalah saya meletakkannya di akhir perintah misalnya. KEPALA -f. Melihat perintah Anda membuat saya mencoba memasang bendera di awal, dan berhasil! = D
Cardin

12
option flags ( -f) pergi sebelum refs ( HEAD). ref pergi terakhir
knittl

Saya masih mendapatkan kesalahan yang sama setelah menambahkan -f DAN menghapus direktori. Ada ide?
Yaron

1
@knittl, saya tidak mengacu pada git add. Saya menerima kesalahan yang sama seperti poster asli bahkan setelah menghapus .git/refs/original/folder dan menggunakan -fbendera dalam git filter-branchperintah. Solusinya, dalam kasus saya, adalah menghapus .git/packed-refsfile.
Yaron

1
@knittl, saya menemukan cara memperbaikinya, tetapi tidak menemukan apa masalahnya. Pada dasarnya, saya menambahkan --ignore-unmatchke perintah git rmdan itu berjalan lancar!
Gabrielius

21

Gunakan perintah ini untuk menghapus cadangan asli:

git update-ref -d refs/original/refs/heads/master

Inilah inti yang saya gunakan untuk memfilter-cabang repo git saya: https://gist.github.com/k06a/25a0214c98bc19fd6817


Ini adalah solusi yang tepat untuk menghapus cadangan! Menghapus .git/refs/original/tidak menyelesaikan masalah.
Erik Koopmans

Pastikan untuk mengubah 'master' ke cabang yang Anda coba perbaiki .. dalam kasus saya 'develop'
Damian Green

git show-ref | awk '/ refs.original.refs/{print$2}'untuk menemukan semua cadangan yang dimiliki repo Anda.
Dan

4

Saya memiliki masalah yang sama dan jawaban di atas tidak memperbaikinya. Tidak ada direktori .git / refs / original / yang tersisa. Solusi bagi saya adalah menghapus file .git / pack-refs.


Permasalahan yang sama. Tidak ada .git/packed-refsfile, bagaimanapun, dan tidak ada folder originaldi .git/refs. Siapa saja?
XedinTak Diketahui

Diselesaikan di sini dengan menambahkan -rbendera ke perintah.
XedinTak Diketahui

Masalah yang sama disini. Menghapus paket-ref memecahkan masalah, tetapi juga merusak seluruh direktori git saya, dan saya harus memulihkan dari cadangan.
Kevin Yin

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.