git rm - fatal: pathspec tidak cocok dengan file manapun

87

Saya menambahkan lebih dari 9000 foto secara tidak sengaja ke folder proyek saya. Dan berkomitmen pada mereka. Kemudian hapus dari disk. Berkomitmen.

Sekarang saya mencoba untuk mendorong perubahan ke server git. Tapi butuh waktu terlalu lama dan mencoba mengirim 12 Gb data.

Saya memeriksa ukuran file pada disk dan melihat bahwa .gitfolder sebenarnya membutuhkan 12 Gb.

Bagaimana cara menghapus foto dari sana? Saya mencoba git rm, tetapi gagal:

❯ git rm public/photos
fatal: pathspec 'public/photos' did not match any files

Karena sudah saya hapus semua dari disk, tapi masih ada di .gitfolder.

Saya mencoba menambahkan public/photoske .gitignore:

public/photos/
*.zip

Tapi tidak ada hasil. Tentu saja saya bisa hard reset headuntuk momen ketika saya tidak memiliki begitu banyak foto sampah dalam proyek saya. Tetapi sejak saat itu saya berkomitmen berkali-kali dan membuat banyak perubahan pada kode.

Maxim Yefremov
sumber

Jawaban:

88

Dalam kasus Anda, gunakan git filter-branchbukan git rm.

git rm akan menghapus file dalam arti bahwa mereka tidak akan dilacak oleh git lagi, tetapi itu tidak menghapus objek komit lama yang sesuai dengan gambar tersebut, dan Anda masih akan terjebak dengan mendorong komit sebelumnya yang sesuai dengan 12GB gambar.

Di git filter-branchsisi lain, dapat menghapus file-file tersebut dari semua commit sebelumnya juga, sehingga menghilangkan kebutuhan untuk mendorong salah satu dari mereka.

  1. Gunakan perintah

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. Setelah cabang filter selesai, verifikasi bahwa tidak ada file yang tidak diinginkan yang hilang.

  3. Sekarang tambahkan aturan .gitignore

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. Sekarang lakukan push

    git push -f origin branch
    

Periksa ini , ini dan ini untuk bantuan lebih lanjut. Hanya untuk berada di sisi yang lebih aman, saya sarankan Anda membuat salinan cadangan repo di sistem Anda sebelum melanjutkan instruksi ini.

Adapun pesan kesalahan orignial Anda, ini terjadi karena Anda sudah git rmtidak melacak mereka menggunakan , dan karenanya git mengeluh karena tidak dapat menghapus file yang tidak dilacaknya. Baca lebih lanjut tentang ini di sini .

mu 無
sumber
2
Hai, saya mengalami masalah yang sama tetapi saat mengetik perintah pada langkah 1, saya mendapatkan kesalahan: fatal: revisi buruk '--prune-empty'. Ada petunjuk?
kevin
@kevin maaf, melewatkan komentar ini. Anda bisa menjalankannya tanpa bendera itu. Pemangkasan akan menghapus objek komit yang kosong.
mu 無
1
Bukankah baris ini git add .gitignore && commit -m "ignore rule for photos"harusgit add .gitignore && git commit -m "ignore rule for photos"
Kloning
@Clone ya, seharusnya begitu, sudah diperbaiki sekarang :)
mu 無
1
Ini adalah jawaban yang sangat luar biasa. Memperbaiki masalah yang saya alami dengan repo saya selama beberapa tahun. Terima kasih!
Moshe
18

Jawaban yang sangat sederhana adalah.

Langkah 1:

Pertama tambahkan file Anda yang tidak terlacak yang ingin Anda hapus:

menggunakan git add .atau git add <filename>.

Langkah 2:

Kemudian hapus dengan mudah menggunakan perintah di git rm -f <filename>sini rm = hapus dan -f = paksa.

Bharti Rawat
sumber
ini tidak akan melakukan apa yang diinginkan OP, yaitu menghapus file yang ada di komit sebelumnya. Anda perlu menggunakan git filter-branchseperti yang disebutkan di tempat lain.
Simon Stevens
9

Langkah 1

Tambahkan nama file ke .gitignorefile Anda .

Langkah 2

git filter-branch --force --index-filter \
    'git rm -r --cached --ignore-unmatch YOURFILE' \
    --prune-empty --tag-name-filter cat -- --all

LANGKAH 3

git push -f origin branch

Terima kasih banyak untuk @mu.

klmlfl.dll
sumber
7
... Saya selalu berpikir bahwa git lebih sulit dari yang seharusnya, ini buktinya. Tidak mungkin ada orang yang dapat mengingat keberadaan sebagian besar perintah git, apalagi flag dan quirks mereka. Model Git masuk akal, dan berfungsi sampai Anda mengikuti alur sederhana, dan segera setelah Anda buntu, Anda terjebak dengan keras.
Muhammad Umer
2
Ini adalah solusi yang berhasil untuk saya, saya membutuhkan--ignore-unmatch
guhur
3

menggunakan ini berhasil untuk saya

git rm -f --cached <filename>
Andreia Oliveira
sumber
1

Rantai ini berfungsi dalam kasus saya:

  1. git rm -r WebApplication/packages

Ada git-dialog konfirmasi. Anda harus memilih opsi "y".

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>
Ustin
sumber
0
git stash 

melakukan pekerjaan itu, Ini mengembalikan file yang telah saya hapus menggunakan, rmbukan git rm.

Saya pertama kali melakukan pembayaran dari hash terakhir, tetapi saya tidak percaya itu diperlukan.

pengguna1767316
sumber
0

Untuk menghapus file komit terlacak dan lama dari git Anda dapat menggunakan perintah di bawah ini. Di sini, dalam kasus saya, saya ingin membatalkan penelusuran dan menghapus semua file dari distdirektori.

git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch dist' --tag-name-filter cat -- --all

Kemudian, Anda perlu menambahkannya ke akun Anda .gitignoreagar tidak terlacak lebih lanjut.

Kiran Maniya
sumber
-1

Saya memiliki direktori duplikat (~ web / web) dan menghapus duplikat bersarang ketika saya menjalankannya rm -rf websaat berada di dalam folder web pertama.

ccsinsf
sumber
Maaf! Saya pasti salah membaca pertanyaan itu. Saya pikir itulah tujuannya
ccsinsf