Dizini .gitignore klasörüne ekledikten sonra uzak depodan kaldırın


598

Bir dizini github'a aktardım. Bundan sonra, .gitignoregöz ardı edilmesi gereken bir dizin ekleyerek dosyayı değiştirdim . Her şey iyi çalışıyor, ancak (şimdi yok sayıldı) dizini github'da kalıyor.

Bu dizini github'dan ve depo geçmişinden nasıl silebilirim?


Yanıtlar:


1066

.gitignoreDosyanızdaki kurallar yalnızca izlenmeyen dosyalar için geçerlidir. Bu dizinin altındaki dosyalar deponuzda zaten işlendiğinden, onları kaldırmanız, bir taahhüt oluşturmanız ve bunu GitHub'a aktarmanız gerekir:

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

Deponuzun geçmişini yeniden yazmadan dosyayı geçmişinizden silemezsiniz - başka biri deponuzla çalışıyorsa veya birden çok bilgisayardan kullanıyorsanız bunu yapmamalısınız. Bunu hala yapmak istiyorsanız git filter-branch, geçmişi yeniden yazmak için kullanabilirsiniz - burada yararlı bir rehber var .

Ayrıca, çıktısının şöyle git rm -r --cached some-directoryolacağını unutmayın :

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'

rmDeposundan yaklaşık git den geri besleme olduğu; dosyalar hala çalışma dizinindedir.


3
Başka biri çekerse, artık yoksayılan dosyalar onlar için silinecek mi yoksa dokunulmayacak mı?
Martin Konicek

3
@ Martin Konicek: bu değişiklikleri çeken kullanıcının bu dosyalarda herhangi bir değişikliği yoksa, kaldırılacaktır.
Mark Longair

@MarkLongair Ne yapar -rve --cached. Teşekkürler.
Labanino

13
@ Labanino: -rtüm dizinleri yapıyorsanız gerekli özyinelemeli anlamına gelir. --cachedgeçersiz kılar seyahatseverlerin Git normal çalışma dizinden onları silme davranışı ve işlemekten silinmesini evreleme ve markaları işlemekten hazır evreleme alanda faaliyet sadece git'e. Git, dosyaların yerel kopyalarını saklamak istediğinizi böyle söylersiniz.
entheh

2
Bu iyi çalışıyor, ama önce yapmam gerekiyordu: git reset name_of_fileyukarıda açıklananların çalışması için
Edvard Haugland

248

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

Gitinizdeki tüm dosyaları / klasörleri yok sayacak ve böylece her birini manuel olarak seçmeniz gerekecek.


Bu benim için çalışmayı durdurmuş 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

4
Teşekkürler, bu bana çok yardımcı oldu! Windows powershell kullanıyorsanız şunları yapabilirsinizforeach ($i in iex 'git ls-files -i --exclude-from=.gitignore') { git rm --cached $i }
Matthew

10
İkinci yaklaşımınızı denedim, tüm dosyaları yerel gitimden kaldırdı!
artnikpro

2
Bence alt dizine gitmeli ve yapmalısın. Yanlışsam düzelt.

Bugün ne öğrendik, çocuklar? "Stack Overflow'da bulduğunuz rastgele kodu çalıştırmayın!"
Jonathan Landrum

49

Cevabım gereğince: Git deposundan bir dizin nasıl kaldırılır?

Klasörü / dizini yalnızca git deposundan kaldırmak ve yerelden kaldırmak için 3 basit adımı deneyin.


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ü yoksayma adımları

Sonraki klasörlerden gelen bu klasörü yoksaymak için .gitignore adlı kökte bir dosya oluşturun ve bu klasör adını bu klasöre koyun. İstediğiniz kadar koyabilirsiniz

.gitignore dosyası şöyle görünecektir

/FolderName

dizini kaldır


1
Tam da aradığım şey buydu. Teşekkürler :)
Rohit Singh

@Rohit Singh
eirenaios

9

Blundell'in ilk cevabı benim için işe yaramadı. 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

Aşağıdaki ifadeyi çalıştırarak önce silinecek dosyaları kontrol etmenizi öneririz:

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

Visual studio için varsayılan bir .gitignore dosyası kullanıyordum ve projedeki tüm günlük ve bin klasörlerini kaldırdığımı fark ettim, ki bu benim eylemim değildi.


5

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

Github Desktop GUI kullanarak çok basittir.

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

  2. Senin düzenleyin .gitignoredosya ve github sayfasından kaldırma ana deposu olacağını klasör girişi kaldırmak.

  3. Proje klasörünü tamamlayın ve senkronize edin.

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

  5. .gitignoreDosyayı yeniden düzenleyin .

Bu kadar.


5

Blundell'in cevabı işe yaramalı, ama bazı tuhaf nedenlerden dolayı benimle olmadı. İlk önce bir dosyaya ilk komut tarafından verilen dosya adlarını pipetlemeliyim ve daha sonra bu dosyaya geçip bu dosyayı tek tek silmeliydim.

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

Bu yöntem standart .gitignore davranışını uygular ve yoksayılması gereken dosyaların el ile belirtilmesini gerektirmez .

Kullanamıyorum --exclude-from=.gitignoreartık: / - İşte güncellenen bir yöntem vardır:

Genel tavsiye: temiz bir repo ile başlayın - her şey yapıldı, çalışma dizininde veya dizinde bekleyen hiçbir şey yok ve bir yedek alın !

#commit up-to-date .gitignore (if not already existing)
#this command must be run on each branch
git add .gitignore
git commit -m "Create .gitignore"

#apply standard git ignore behavior only to current index, not working directory (--cached)
#if this command returns nothing, ensure /.git/info/exclude AND/OR .gitignore exist
#this command must be run on each branch
git ls-files -z --ignored --exclude-standard | xargs -0 git rm --cached

#optionally add anything to the index that was previously ignored but now shouldn't be:
git add *

#commit again
#optionally use the --amend flag to merge this commit with the previous one instead of creating 2 commits.

git commit -m "re-applied modified .gitignore"

#other devs who pull after this commit is pushed will see the  newly-.gitignored files DELETED

Yeni göz ardı edilen dosyaları dalın taahhüt geçmişinden de temizlemeniz gerekiyorsa veya yeni göz ardı edilen dosyaların gelecekteki çekmelerden silinmesini istemiyorsanız, bu yanıta bakın .


0

PowerShell'den çalışıyorsanız, aşağıdakileri tek bir 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

Sonra git push --force --all.

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


Kullanmak, kullanmaktan nasıl git filter-branchfarklıdır git rm? Aslında bir sürümünü kullanmak zorunda düşünüyordum git filter-branchama burada çoğu yorum kullanmanızı öneririz git rm. Anladığım kadarıyla git rmsadece geçerli çalışma dizininden ve dizinden kaldırır. Ancak daha önce eklenen birden fazla taahhüt varsa, yine de depoda olacaktır.
alpha_989

Sağ. git rmdosyayı gelecekteki en son işlemden kaldıracaktır. git filter-branchtarihin tamamından kaldıralım. Ayrıca bakınız: help.github.com/articles/…
Shaun Luttin
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.