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.

Cardin
sumber
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
rajutan
sumber
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

k06a
sumber
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.

Yaron
sumber
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
2

Tambahkan gaya ke perintah cabang filter.

Adam Dymitruk
sumber