.Gitignore içinde listelenen ancak yine de depoda bulunan dosyaları nasıl kaldırabilirim?


327

Depomda göz ardı edilmesi gereken bazı dosyalar var, bunları .gitignore'a ekledim, ancak elbette, depomdan kaldırılmıyorlar.

Benim sorum şu, geçmişimi yeniden yazıp tüm bu dosyaları kolayca kaldırabilen filtre dalı kullanan sihirli bir komut veya komut dosyası var mı? Veya basitçe onları kaldıracak bir taahhüt yaratacak bir komut?





UYARI: Bu işlem fiziksel dosyayı bölgenizden kaldırmazken, bir sonraki git çekme işleminde dosyaları diğer geliştiriciler makinelerinden kaldırır. Git'in izlenen ancak şimdi .gitignore'da bulunan bir dosyayı "unutması" nasıl sağlanır?
Kris Roofe

@Stevoisiak bu sorunun bir kopyası değil çünkü bu TÜM yok sayılan dosyalar hakkında sorular soruyor ve benzer soruların hepsinden daha iyi bir cevabı var.
Omn

Yanıtlar:


438

Bunları depodan manuel olarak kaldırabilirsiniz:

git rm --cached file1 file2 dir/file3

Veya çok fazla dosyanız varsa:

git rm --cached `git ls-files -i --exclude-from=.gitignore`

Ancak bu, Windows'ta Git Bash'te işe yaramıyor gibi görünüyor. Bir hata mesajı üretir. Aşağıdakiler daha iyi çalışır:

git ls-files -i --exclude-from=.gitignore | xargs git rm --cached  

Bu dosyalar olmadan tüm geçmişi yeniden yazmayla ilgili olarak , bunu yapmanın otomatik bir yolu olduğundan şüpheliyim .
Ve hepimiz tarihi yeniden yazmanın kötü olduğunu biliyoruz, değil mi? :)


2
Ne yazık ki Windows'ta Git Bash komutu boşluk içeren yollarla çalışmaz
Nate Bundy

19
@ Cupcake teşekkürler. git ls-files -i -z --exclude-from=.gitignore | xargs -0 git rm --cachedhile yapmak gibi görünüyor
Nate Bundy

3
Aynı sorunla pencerelerde takılı kaldım. Powershell kullanıyorum ve benim durumumda @ samy-dindane tarafından uçlanmış üçüncü komutu aldım ve bir foreach olarak değiştirdim. Bu oldugit ls-files -i --exclude-from=.gitignore | %{git rm --cached $_}
digaomatias

1
"git ls-files -i --exclude-from = .gitignore" çok faydalıdır, hangi dosyaların .ignore tarafından hariç tutulduğunu söyler.
Owen Cao

1
Ben bu komutları bulmak için mutluydu, ama gerçekten dosyaları depodan kaldırmaz. 2300 kB görüntü kaldırdığımda, havuz boyutu yalnızca 10 kB düştü. Bu nedenle, örneğin depoyu daha küçük ve daha hızlı aktarmak için kullanılamaz.
Jan Potužník

343

Herhangi bir işletim sisteminde çalışmanın daha kolay bir yolu

git rm -r --cached .
git add .
git commit -m "Removing all files in .gitignore"

Temelde .gitignore dosyaları hariç tüm dosyaları okudunuz


1
Bu nasıl bir çekme yürütme repo diğer kullanıcılar etkisi - artık izlemek istemiyorum klasörü okudukça nasıl silinir ??? Bunu nasıl önleyebiliriz - sadece takip etmek istiyoruz
snh_nl

Bu, tüm dosyaları sahte bir taahhüt mesajı ile değiştirilmiş olarak işaretler!
Haidar Zeineddine

3
Sahte taahhüt mesajı ile ne demek istiyorsun? Bu gerçek bir taahhüt mesajı: P İhtiyaçlarınıza bağlı olarak elbette mesajı değiştirebilirsiniz ...
gtatr

1
Sadece bir bütünlük uğruna, sonunda git push komutuna ihtiyacınız var.
Mariusz Bialobrzeski

1
Bunu yapma, tüm dosyalardaki geçmişi kaldıracak
agrath

144

.Gitignore içindeki dosyalar izlenmediğinden, sürüm denetimi altında olmayan dosyaları yinelemeli olarak kaldırmak için git clean komutunu kullanabilirsiniz.

git clean -xdnKuru çalışma yapmak ve neyin kaldırılacağını görmek için kullanın .
Sonra git clean -xdfyürütmek için kullanın .

Temel olarak, git clean -hveya man git-clean(unix'te) size yardımcı olacaktır.

Bu komutun , hazırlama alanında olmayan yeni dosyaları da kaldıracağını unutmayın.

Umarım yardımcı olur.


6
Bu kabul edilen cevap olmalı. Aslında işe yarıyor (kabul edilen cevap benim için, macOS'ta işe yaramadı) ve çok daha temiz.
Roger Oba

25
Bu cevap uygulanamaz - OP dosyaları diyor .gitignore edilmektedir izleniyor.
Ken Williams

20
DİKKAT! Bu, yalnızca şubeden kaldırmak yerine izlenmeyen tüm dosyaları kalıcı olarak siler
Emmanuel

1
git clean -xdnsilmez kuru bir koşu. bir sonraki.
JohnZaj

17
-1: Bu son derece yanıltıcı bir cevaptır - orijinal poster depodan kaldırmak istedi, dosyaları tamamen kaldırmadı. IDE tarafından gerekli olan ancak depoda olması gerekmeyen bir dizi dinamik dosyayı silmeye bu kadar yakındım.
falı

4

Sed ile .gitignore deyiminin çıktısını manipüle ederek çok basit bir çözüm yaptım:

cat .gitignore | sed '/^#.*/ d' | sed '/^\s*$/ d' | sed 's/^/git rm -r /' | bash

Açıklama:

  1. .gitignore dosyasını yazdırın
  2. tüm yorumları baskıdan kaldır
  3. tüm boş satırları sil
  4. satırın başına 'git rm -r' ekle
  5. her satırı yürütün.

10
seddoğru mu?
IgorGanapolsky

0

Linux'ta bu komutanı kullanabilirsiniz:

örnek için "* .py ~" silmek istiyorum bu yüzden komutum ==>

find . -name "*.py~" -exec rm -f {} \;


-3

Git, .gitignore öğesine ekledikten sonra .gitignore deseniyle eşleşen dosyaları yok sayar.

Ancak depoda zaten mevcut olan dosyalar hala içeride olacaktır.

git rm files_ignored; git commit -m 'rm no use files'yok sayılan dosyaları silmek için kullanın .


4
Birçoğu var, isimlerini belirtmeden silmek için bir yol var mı?
Gözüpek
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.