Soru Bir dosyayı yerel dosya sisteminden silmeden Git deposundan kaldırın.


İlk işlemim bazı günlük dosyaları içeriyordu. ekledim *log benim için .gitignoreve şimdi günlük dosyalarını depomdan kaldırmak istiyorum.

git rm mylogfile.log

bir dosyayı depodan kaldıracak, ancak yerel dosya sisteminden de kaldıracaktır.

Bu dosyayı repo'dan nasıl kaldırabilirim olmadan dosyanın yerel kopyasını mı siliyorum?


2439
2017-07-17 14:56


Menşei


Kopyası İzlemeyi durdur ve Git'teki bir dosyadaki değişiklikleri yok say


Cevaplar:


Tek dosya için:

git rm --cached mylogfile.log

Tek dizin için:

git rm --cached -r mydirectory

3508
2017-07-17 14:57



Teşekkürler! Bunu nasıl kaçırdığımdan emin değilim ... "- Önbellek verildiğinde, aşamalı içeriğin ya dalın ya da disk üzerindeki dosyanın eşleşmesi gerekir, böylece dosyanın sadece dizinden kaldırılmasına izin verilir ." - mveerman
belki de kendini açıklayıcı olarak değil çünkü --keep-local. - Martin
@DGGenuine, --keep-local bir argüman svn rm - bdonlan
bdonian teşekkürler. Yeni git-rm sürümü için bir seçenek olmalı. İronik olarak bu sayfa, "git rm" --keep-local "" maddesini kullanırken en yüksek sonuç - Carl G
Ama uzak sunuculardaki dosyaları nasıl korurum? Bu yerel olanı tutar, ancak başka bir sunucudan itip çekersem, dosya silinir. Dosya için bir .gitignore ekledim, ancak yine de kaldırılıyor - spankmaster79


Tüm klasörü bir repo'dan (Resharper dosyaları gibi) kaldırmak için şunu yapın:

git rm -r --cached folderName

Bazı yeniden paylaşım dosyaları yaptım ve diğer proje kullanıcıları için bunların devam etmesini istemedim.


249
2018-04-04 18:14



Gelecek ziyaretçiler için eklenmiş bir not: Repo'ya geri dönüşü "Senkronize Et" için bir GUI kullanmayın. Bu, dosyaları yerel repo'ya geri çekecek. Sen yapmak zorundasın Git Push repo branch dosyaları uzaktan kaldırmak için. - RubberDuck
@RubberDuck 3 yaşındaki bir cevap ve benim için çalışan tek çözüm :) Teşekkürler - Mariusz


Ayrıca, dosyaları yerel dosya sisteminden silmeden .gitignore temel alarak depodan da kaldırabilirsiniz:

git rm --cached `git ls-files -i -X .gitignore`

Veya, alternatif olarak, Windows Powershell'de:

git rm --cached $(git ls-files -i -X .gitignore)

163
2018-01-31 10:05



Windows üzerinde çalışmıyor. git ls-files -i -X ​​.gitignore çalışır, ancak dosyaları 'git rm' dosyasına nasıl göndereceğimi bilmiyorum. Bunu nasıl yapacağını biliyor musun? - Erik Z
Cmd-console yerine Git Bash'i kullanırsanız, Windows'ta çalışır - Andreas Zita
Bunu sev. Dosya isminde boşluk bırakan bazı dosyalarım dışında çalıştım. Buradaki çözümü değiştirdim: git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}". Lütfen bu çözümü buradaki cevaba göre değiştirmeyi veya eklemeyi düşünün, çünkü sahip olmak için harika bir araçtır ... - mpettis
Denemedim ama test edilmeli. .gitkeep depodaki boş bir klasörü korur. Örneğin. .gitignore klasör içermesi uploads ve repo takip etmek zorunda kalıyor .gitkeep. Repo'lardan tümünü kaldırarak uploads ayrıca kaldıracaktır .gitkeep. - Vladimir Vukanac
Not: iç içe geçmiş .gitignore dosyalarıyla çalışmaz - acidjunk


Ayrıca, hassas verileri (ör. Şifreler içeren bir dosya) sizde de yapmış olsaydınız, bunu depo tarihçesinden tamamen silmelisiniz. İşte bunun nasıl yapılacağını açıklayan bir rehber: http://help.github.com/remove-sensitive-data/


66
2017-08-21 12:16



Bu cevap, başka bir web sitesine bağlanmak yerine bu görevi tamamlamak için gerekli komutları içermelidir. - Florian Lemaitre


Benim cevabım buraya göre: https://stackoverflow.com/questions/6313126/how-to-remove-a-directory-in-my-github-repository

Klasör / dizin veya dosya kaldırmak için sadece git deposundan ve yerel denemeden 3 basit adımdan.


Dizini kaldırmak için adımlar

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

Bir sonraki sayfada bu klasörü yok saymanın adımları

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

.gitignore dosya böyle görünecek

/FolderName

remove directory


58
2017-08-24 12:16



Merak etme, bulanıklığı nasıl yaptın? - kmort
@kmort Haha, Google Chrome tarayıcısının "Harika Ekran Görüntüsü" aracını kullanarak yaptım, gerçekten hızlıydı bu yüzden dağınık görünüyordu. Bunun için özür dilerim!! awesomescreenshot.com - eirenaios


Daha genel bir çözüm:

  1. Düzenle .gitignore dosya.

    ECHO mylogfile.log >> .gitignore

  2. Dizinden tüm öğeleri kaldırın.

    git rm -r -f --cached .

  3. Yeniden indeksi.

    git add .

  4. Yeni taahhütte bulun

    git commit -m "Removed mylogfile.log"


54
2017-12-13 11:42



Bu aslında dosyayı silecek mi? - Mr_and_Mrs_D
GitHub'dan mı? YOK HAYIR. Github'a zaten zorlamışsanız, siteden kaldırmayacaktır. Ancak yerel git deponuzu günceller. - mAsT3RpEE
Bence bunu istiyorsun: help.github.com/articles/remove-sensitive-data - mAsT3RpEE
Sildiğiniz yorum aslında daha da ortadan kaldırıldı :) Çözümle ilgili sorun rm --cashed Bir çeker zaman sonunda dosyayı silecektir - değil mi? Ve bu insanların söyledikleri gibi değil "Depodan bir dosyayı kaldır yerel dosya sisteminden silmeden".Şimdi niçin kabul edilen çözüm benim dışımdaydı - muhtemelen OP tek başına çalışıyordu ve hiç çekilmiyordu? Dunno," her zaman bir kez itildi "meselesini anladım. - Mr_and_Mrs_D
Benim problemim github değil - bu dosya aslında iş arkadaşlarından çekildikleri zaman silinecek. ben yapamaz dosyanın silinmesini istiyorum. Bu geçmişte bana büyük sorunlara neden oldu. Yani gerçekten gerçekten bir çözüm olup olmadığını merak ediyordum değil dosyayı silin. Ayrıca kabul edilen cevabın inn'e bakınız: stackoverflow.com/questions/1143796/... - Mr_and_Mrs_D


Git, değişmediklerini varsayarak bu dosyaları görmezden gelmenizi sağlar. Bu   koşarak yapılır git update-index --assume-unchanged path/to/file.txt Komut. Bir dosyayı bir kez işaretledikten sonra gitir   Bu dosyadaki değişiklikleri tamamen yoksay; ne zaman ortaya çıkacaklar   git status veya git diff çalıştıran, ne de onlar taahhüt olacaktır.

(Gönderen https://help.github.com/articles/ignoring-files)

Bu nedenle, onu silmemek, ancak sonsuza kadar değişiklikleri göz ardı etmek. Bunun sadece yerel olarak çalıştığını düşünüyorum, bu nedenle iş arkadaşları yukarıdaki gibi aynı komutu kullanmadıkça değişiklikleri görebilirler. (Yine de bunu doğrulamalısınız.)

Not: Bu doğrudan soruyu yanıtlamamaktadır, ancak diğer cevapların yorumlarındaki takip sorularına dayanmaktadır.


18
2018-01-28 11:46



Hm, bunu yapıyorum ama birilerinin repo üzerinde değişiklik yapması durumunda dosyanın üzerine yazılabildiğini görüyorum. - AlxVallejo


Yukarıdaki cevaplar benim için işe yaramadı. Tüm taahhüt edilen dosyaları kaldırmak için filtre şubesi kullandım

Git deposundaki bir dosyayı şu şekilde kaldır:

git filter-branch --tree-filter 'rm  file'

Git deposundan bir klasörü şu şekilde kaldırın:

git filter-branch --tree-filter 'rm -rf directory'

Bu, dizini veya dosyayı tüm işlemlerden kaldırır

kullanarak bir taahhüt belirtebilirsiniz:

git filter-branch --tree-filter 'rm -rf directory' HEAD

Ya da bir aralık

git filter-branch --tree-filter 'rm -rf vendor/gems' t49dse..HEAD

Her şeyi uzaktan yönlendirmek için şunları yapabilirsiniz:

git push origin master --force

4
2018-01-12 13:59



Bununla birlikte git rm -r --cached NAME yerel git repo'undan kaldırmanın ve daha sonra çekenleri etkilemesini engelleyen bir hiledir (dosya veya dizinin geçmişini sil'den silerek). - notbad.jpeg
Bu, git tarihini tekrar yazar ve sonra - zorlamanız gerekir - tahmin ettiğim soru ile bu biraz kapsam dışıdır. Halka açık bir repoda tarih sahnesini değiştiremezsiniz, tıpkı repodayı klonlayan herkes çekerken sorun çıkarır. - Guillaume Perrot
Teşekkürler, nihayet birisi herhangi bir dış araç kullanmadan adım adım yöntemle eski adımı açıklıyor. - realtebo