Git repo'yu yeni .gitignore dosyasıyla yeniden eşitle


192

Gitignore dosyasını güncelledikten sonra bir git deposunu "yenilemek" mümkün müdür?

Gitignore'uma daha fazla cehalet (?) Ekledim ve yeni dosyayla eşleşen repodaki şeyleri kaldırmak istiyorum.



Bu çözüm, yeni gitignore ile eşleşen önceden taahhüt edilmiş dosyaları silebilir mi?
Christian Wattengård

100
+1 "cehalet" kelimesini icat ettiği için.
Aasmund Eldhuset


1
@ user770: Bugün öğrendim!
Aasmund Eldhuset

Yanıtlar:


372

" .Gitignore dosyası yoksayılmıyor " bölümünde belirtilen çözüm biraz aşırı, ama çalışması gerekir:

# rm all files
git rm -r --cached .
# add all files as per new .gitignore
git add .
# now, commit for new .gitignore to apply
git commit -m ".gitignore is now working"

( aşağıdaki jball037 yorumları olarak herhangi bir olaydan kaçınmak için önce saklamak istediğiniz değişiklikleri yaptığınızdan emin olun . Bu seçenek, dosyalarınızı diskinizde olmasına rağmen tutacaktır.)
--cached

Ayrıca " Git'in zaten izlenen dosyaları yoksaymasını sağlama " blog yazısında daha ayrıntılı bir çözüm var :

git rm --cached `git ls-files -i --exclude-standard`

Bassim anlaşılacağı onun düzenleyin :

Yollarında boşluk bulunan dosyalar

Gibi bir hata mesajı alırsanız fatal: path spec '...' did not match any files, yollarında boşluk bulunan dosyalar olabilir.

Seçenek ile diğer tüm dosyaları kaldırabilirsiniz --ignore-unmatch:

git rm --cached --ignore-unmatch `git ls-files -i --exclude-standard`

ancak eşleşmeyen dosyalar deponuzda kalır ve yollarını çift tırnak işareti içine alarak eklentilerin kaldırılması gerekir:

git rm --cached "<path.to.remaining.file>"

Git add adımının gereksiz olduğunu gördüm, git rm --cached'den sonra git durumunu çalıştırdığımda, kaldırılan dosyalar zaten hazırlama alanındadır ve sadece devam edip bunları uygulayabilirsiniz.
adam

3
Sadece koştum, taahhüt edilmediğim tüm değişiklikleri kaybettim ve neredeyse işimden istifa ettiğimi ilan ettim. Bu konudaki kabul edilen cevap hayatımı kurtardı: stackoverflow.com/questions/2125710/how-to-revert-a-git-rm-r
jball037

2
@VonC özür dilerim, bu bir rant ya da sopa olması değildi :) Ama evet, --cached kullandım ve dosyalarımı kontrol ettiğimde tüm taahhüt edilmemiş değişikliklerim kayboldu. Bir an panikledi ama "git reset HEAD" dosyalarımı geri yükledi (ama bu sefer .gitignore'da belirttiğim dosyalar olmadan, çözüm hala işe yaradı!)
jball037

3
@ jball037 Güzel. Uyarıyı ekledim ve cevabı buna göre düzenledim.
VonC

1
Eğer bunu yapmadan önce sadece bir satır daha okuduysam "(jball037 olarak herhangi bir olaydan kaçınmak için önce saklamak istediğiniz değişikliklerinizi yerine getirdiğinizden emin olun" #fml
Aiden Strydom

9

Yanlış anlayabilirim, ancak yeni yok sayılan dosyaları silmeye mi çalışıyorsunuz yoksa bu dosyalarda yapılan yeni değişiklikleri yoksaymak mı istiyorsunuz? Bu durumda, şey çalışıyor.

Daha önce taahhüt edilen yok sayılan dosyaları silmek istiyorsanız,

git rm –cached `git ls-files -i –exclude-standard`
git commit -m 'clean up'

Buradaki tek tırnak işaretleri nelerdir?
IgorGanapolsky

Bu harika bir cevap
Holene

Bu .gitignore'umu güncelledikten sonra dosyaları kaldırmak için neden çok basittir.Ancak birkaç küçük güncellemeye ihtiyaç duyuyor: `` git rm –cached git ls-files -i –exclude-standard git commit -m '' temizlemek
Aaron

1

Bunun eski bir soru olduğunu biliyorum, ancak dosya adları boşluk içeriyorsa gracchus'un çözümü çalışmaz. VonC'nin boşluklu isimleri dosyalama çözümü, bunları kullanarak kaldırmak değil --ignore-unmatch, daha sonra manuel olarak kaldırmaktır, ancak çok varsa bu iyi çalışmaz.

İşte tüm dosyaları yakalamak için bash dizilerini kullanan bir çözüm.

# Build bash array of the file names
while read -r file; do 
    rmlist+=( "$file" )
done < <(git ls-files -i --exclude-standard)

git rm –-cached "${rmlist[@]}"

git commit -m 'ignore update'
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.