Dizini .gitignore'a ekledikten sonra uzak depodan kaldırın

Github'a bazı dizinleri itiraf ettim ve ittim. Bundan sonra, .gitignore dosyasının yok sayılması gereken bir dizin ekledim. Her şey iyi çalışıyor, ama (şimdi yoksay) dizini github üzerinde kalıyor.

Bu dizini github ve depo geçmişinden nasıl silerim?

442

7 cevap

.gitignore dosyanızdaki kurallar sadece programlanmamış dosyalar için geçerlidir. Bu dizinin altındaki dosyalar havuzunuzda zaten işlendiğinden, bunları kaldırmanız, bir taahhüt oluşturmanız ve bunu GitHub'a göndermeniz gerekir:

git rm -r --cached some-directory
git commit -m 'Remove the now ignored directory "some-directory"'
git push origin master

Dosyanızı, geçmişinizi arşivinizin geçmişini yeniden yazmadan silemezsiniz. Bunu, başka bir kişi deponuzla çalışıyorsa veya bunu birden fazla bilgisayardan kullanıyorsanız bunu yapmamalısınız. Bunu hala yapmak istiyorsanız, geçmişi yeniden yazmak için git filtre-şubesini kullanabilirsiniz - burada bunun için yararlı bir kılavuz var .

Ayrıca, git rm -r --cached bazı dizinleri çıktısı aşağıdaki gibi bir şey olacaktır:

rm 'some-directory/product/cache/1/small_image/130x130/small_image.jpg'
rm 'some-directory/product/cache/1/small_image/135x/small_image.jpg'
rm 'some-directory/.htaccess'
rm 'some-directory/logo.jpg'

rm , depo hakkında git'ten geri bildirimdir; dosyalar hala çalışma dizinindedir.

788
katma
@MarkLongair -r ve - önbelleğe alınmış ne yapar. Teşekkürler.
katma yazar Labanino, kaynak
@Martin Konicek: bu değişiklikleri yapan kullanıcının bu dosyalarda herhangi bir değişiklik yapmaması durumunda, bunlar kaldırılacak.
katma yazar Mark Longair, kaynak
Başka biri çekerse, şimdi göz ardı edilen dosyalar onlar için silinecek veya el değmemiş kalacak mı?
katma yazar Martin Konicek, kaynak
@Labanino: -r , tüm dizinleri yapıyorsanız gerekli, yinelemeli demektir. - önbelleğe alınmış git'in normal çalışma davranışını ve çalışma dizininden silme işlemini geçersiz kılar ve gitmeyi yalnızca hazırlama aşamasında çalışmaya hazır hale getirir. Git'e, dosyaların yerel kopyalarını saklamak istediğini söylüyorsun.
katma yazar entheh, kaynak
Bu güzel çalışıyor, ancak ilk önce yapmam gerekiyordu: git adı sıfırlamak ad_of_file , yukarıda anlatılanlar için
katma yazar Edvard Haugland, kaynak

Ben bunu yapıyorum:

git rm --cached `git ls-files -i --exclude-from=.gitignore` 
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master

Git görmezden gelen tüm dosyaları/klasörleri kaldıracak, böylece her birini elle seçmeniz gerekecek


Bu benim için çalışmayı bırakmış gibi görünüyor, şimdi yapıyorum:

 git rm -r --cached . 
 git add .
 git commit -m 'Removed all files that are in the .gitignore' 
 git push origin master
203
katma
Teşekkürler, bu bana çok yardımcı oldu! Windows powershell kullanıyorsanız, foreach'i (iex 'git ls-files -i --exclude-from = .gitignore' içinde $ i) yapabilirsiniz. {Git rm --cached $ i}
katma yazar Matthew, kaynak
İkinci yaklaşımını denedim, tüm dosyaları yerel gitmemden kaldırdım!
katma yazar artnikpro, kaynak
Sanırım alt dizine gidip yapmalısın. Yanlışsam düzelt.
katma yazar user4414636, kaynak

As per my Answer here: How to remove a directory from git repository?

Klasör/dizini yalnızca git deposundan kaldırmak ve yerel denemeden 3 basit adımı atmak için.


Dizini kaldırma adımları

git rm -r --cached FolderName
git commit -m "Removed folder from repository"
git push origin master

Bir sonraki işlemlerde bu klasörü göz ardı etme adımları

Bir sonraki işlemlerden bu klasörü göz ardı etmek için .gitignore adlı bir dosya kökünü yapın   ve bu klasörlerin adını koydu. İstediğiniz kadar koyabilirsiniz

.gitignore file will be look like this

/FolderName

remove directory

32
katma
@ VSG24 yardımcı oldu!
katma yazar eirenaios, kaynak
@Leniel Macaferi: D
katma yazar eirenaios, kaynak
Cevap bu. (Temmuz 2016'dan itibaren çalışıyor)
katma yazar VSG24, kaynak
Aferin ... bu aradığım şeydi. :) Teşekkürler!
katma yazar Leniel Macaferi, kaynak
İyi adam, bir çekicilik çalıştı.
katma yazar Cathal, kaynak

Blundell'in yanıtı işe yarayacak, ama bazı garip sebeplerden dolayı benimle bir şey yapmadı. Önce ilk komut tarafından çıkarılan dosya isimlerini bir dosyaya pipetlemeliydim ve daha sonra bu dosyadan geçip o dosyayı tek tek sildim.

git ls-files -i --exclude-from=.gitignore > to_remove.txt
while read line; do `git rm -r --cached "$line"`; done < to_remove.txt
rm to_remove.txt
git commit -m 'Removed all files that are in the .gitignore' 
git push origin master
4
katma

Blundell'in ilk cevabı benim için çalışmadı. Ancak bana doğru yolu gösterdi. Ben de aynı şeyi yaptım:

> for i in `git ls-files -i --exclude-from=.gitignore`; do git rm --cached $i; done
> git commit -m 'Removed all files that are in the .gitignore'
> git push origin master

Önce silinecek olan dosyaları aşağıdaki ifadeyi kullanarak kontrol etmenizi öneririm:

git ls-files -i --exclude-from=.gitignore

Görsel stüdyo için bir varsayılan .gitignore dosyası kullanıyordum ve projemdeki tüm günlük ve bin klasörlerini kaldırmamın fark ettim.

4
katma

Not: Bu çözüm yalnızca Github Masaüstü GUI'si ile çalışır.

Github Masaüstü GUI'sini kullanarak çok basittir.

  1. Klasörü geçici olarak başka bir konuma (proje klasörünün dışına) taşıyın.

  2. .gitignore dosyanızı düzenleyin ve github sayfasında ana depoyu kaldıracak klasör girişini kaldırın.

  3. Proje klasörünü birleştirin ve senkronize edin.

  4. Klasörü proje klasörüne yeniden taşı

  5. .gitignore dosyasını yeniden düzenleyin.

Bu kadar.

2
katma
Bunu sevdim - basit ve kolay.
katma yazar Radmation, kaynak

PowerShell'den çalışıyorsanız, aşağıdakileri tek komut olarak deneyin.

PS MyRepo> git filter-branch --force --index-filter
>> "git rm --cached --ignore-unmatch -r .\\\path\\\to\\\directory"
>> --prune-empty --tag-name-filter cat -- --all

Ardından git push --force --all .

Documentation: https://git-scm.com/docs/git-filter-branch

0
katma
Sağ. git rm , dosyayı en son taahhütten geleceğe kaldıracaktır. git filter-branch onu tüm geçmişten kaldırmamıza izin verir. Ayrıca bkz .: help.github.com/articles/…
katma yazar Shaun Luttin, kaynak
git filter-branch komutunu git rm kullanarak nasıl kullanıyorsunuz? İlk başta git filter-branch versiyonunu kullanmam gerektiğini düşünüyordum, fakat çoğu yorum burada git rm kullanılmasını önermektedir. Anladığım kadarıyla git rm sadece mevcut çalışma dizininden ve dizininden kaldırır. Ancak, daha önce eklenmiş birden fazla varsa, yine de depoda olacaktır.
katma yazar alpha_989, kaynak