git rm - fatal: pathspec hiçbir dosyayla eşleşmedi


87

Proje klasörüme kazara 9000'den fazla fotoğraf ekledim. Ve onları adadı. Daha sonra bunları diskten sildi. Taahhütlü.

Şimdi değişiklikleri git sunucusuna göndermeye çalışıyorum. Ancak çok uzun sürüyor ve 12 Gb veri göndermeye çalışıyor.

Diskteki dosya boyutunu kontrol ettim ve gerçekten .gitklasörün 12 Gb aldığını gördüm .

Oradan fotoğraflar nasıl silinir ? Denedim git rmama başarısız:

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

Çünkü onları zaten diskten sildim, ama hala .gitklasörde.

Ben eklemeye çalıştık public/photosiçin .gitignore:

public/photos/
*.zip

Ama sonuç yok. Tabii ki hard reset headprojemde çok fazla gereksiz fotoğrafım olmadığı bir an olabilirdim . Ama o zamandan beri pek çok kez yaptım ve kodda çok değişiklik yaptım.

Yanıtlar:


88

Sizin durumunuzda git filter-branchyerine kullanın git rm.

git rm artık git tarafından izlenmeyecekleri anlamında dosyaları silecekler, ancak bu, bu görüntülere karşılık gelen eski commit nesnelerini kaldırmayacak ve böylece 12GB görüntüye karşılık gelen önceki taahhütleri zorlamak zorunda kalacaksınız.

git filter-branchÖte yandan, bu nedenle bunlardan herhangi itmek ihtiyacı ortadan yapıyor, hem de tüm önceki kaydedilmesini gelen bu dosyaları kaldırabilirsiniz.

  1. Komutu kullanın

    git filter-branch --force --index-filter \
      'git rm -r --cached --ignore-unmatch public/photos' \
      --prune-empty --tag-name-filter cat -- --all
    
  2. Filtre dalı tamamlandıktan sonra, istenmeyen bir dosyanın kaybolmadığını doğrulayın.

  3. Şimdi bir .gitignore kuralı ekleyin

    echo public/photos >> .gitignore
    git add .gitignore && git commit -m "ignore rule for photos"
    
  4. Şimdi it

    git push -f origin branch
    

Daha fazla yardım için bunu , bunu ve bunu kontrol edin . Daha güvenli tarafta olmak için, bu talimatlara geçmeden önce sisteminizde deponun bir yedek kopyasını oluşturmanızı öneririm.

Orijinal hata mesajınıza gelince, bu gerçekleşiyor çünkü onları kullanarak zaten izini sürdünüz git rmve bu nedenle git, izlemediği bir dosyayı kaldıramadığı için şikayet ediyor. Bununla ilgili daha fazlasını buradan okuyun .


2
Hey, ben de aynı problemle karşılaşıyorum ama 1. adımda komutu yazarken bir hata alıyorum: fatal: kötü revizyon '--prune-empty'. Bir ipucu?
Kevin

@kevin üzgünüm, bu yorumu kaçırdım. O bayrak olmadan çalıştırabilirsiniz. Budama, herhangi bir boş commit nesnesini kaldırırdı.
mu 無

1
Değil bu hat mı git add .gitignore && commit -m "ignore rule for photos"olacakgit add .gitignore && git commit -m "ignore rule for photos"
Klon

@Clone evet, :) şimdi düzeltilmiş olduğunu olmalıydı
Mu'nun無

1
Bu delice harika bir cevap. Depomda birkaç yıldır yaşadığım bir sorunu düzelttim. Teşekkürler!
Moshe

18

Çok basit bir cevap.

Aşama 1:

Öncelikle, silmek istediğiniz izlenmeyen dosyalarınızı ekleyin:

git add .veya kullanarak git add <filename>.

Adım 2:

Ardından, git rm -f <filename>buradaki rm = remove ve -f = forcely komutunu kullanarak bunları kolayca silin .


bu, OP'nin istediği şeyi yapmaz, yani önceki işlemlerde bulunan dosyaları kaldırmaktır. git filter-branchBaşka bir yerde belirtildiği gibi kullanmanız gerekir .
Simon Stevens

9

Aşama 1

Dosya adlarını dosyanıza ekleyin .gitignore.

Adım 2

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

Aşama 3

git push -f origin branch

@Mu'ya çok teşekkür ederim.


7
... git'in olması gerekenden daha zor olduğunu düşünmüşümdür bu bunu kanıtlıyor. Bayrakları ve tuhaflıkları bir yana, hiç kimsenin git komutlarının çoğunun varlığını bile hatırlaması mümkün değil. Git modeli mantıklıdır ve basit akışı takip edene kadar çalışır ve takılıp kalır kalmaz sert bir şekilde takılırsınız.
Muhammad Umer

2
Benim için işe --ignore-unmatch
yarayan


1

Bu zincirler benim durumumda çalışıyor:

  1. git rm -r WebApplication/packages

Bir onay git-iletişim kutusu vardı. "Y" seçeneğini seçmelisiniz.

  1. git commit -m "blabla"
  2. git push -f origin <ur_branch>

0
git stash 

işi yaptım, rmyerine kullanarak sildiğim dosyaları geri yükledi git rm.

İlk önce son hash'i kontrol ettim, ancak gerekli olduğuna inanmıyorum.


0

İzlenen ve eski kaydedilen dosyayı git'ten kaldırmak için aşağıdaki komutu kullanabilirsiniz. Burada benim durumumda, tüm dosyayı dizinden kaldırmak ve kaldırmak istiyorum dist.

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

Ardından, .gitignoredaha fazla izlenmemesi için onu eklemeniz gerekir .


-1

Yinelenen bir dizine (~ web / web) sahiptim rm -rf webve ilk web klasörünün içindeyken çalıştırdığımda iç içe geçmiş kopyayı kaldırdı .


Afedersiniz! Soruyu yanlış okumuş olmalıyım. Hedefin bu olduğunu düşündüm
ccsinsf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.