Git dosyasından bir dosyayı yerel dosya sisteminden silmeden kaldırma


3046

İlk işlemim bazı günlük dosyaları içeriyordu. Ben ekledik *logkardeşime karşı .gitignoreve şimdi benim deposundan günlük dosyalarını kaldırmak istiyorum.

git rm mylogfile.log

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

Nasıl repo bu dosyayı kaldırabilirsiniz olmadan dosyanın benim yerel kopyasını silme?



14
En çok dile getirilen cevabın bazıları için tehlikeli olduğunu belirtmek gerekir. Eğer yerel sonra çekme gücü sayesinde git den kaldırıldı başka yerde bu dosyaları aktarırken daha uzak bir repo kullanıyorsanız sadece silinecektir . Bu yanıtlardan birinde belirtilir, ancak yorum yapılmaz.
RichieHH

Yanıtlar:


4353

Gönderen adam dosyası :

Verildiğinde --cached, hazırlanmış içeriğin dalın ucuyla veya diskteki dosyayla eşleşmesi ve dosyanın yalnızca dizinden kaldırılmasına izin vermesi gerekir.

Yani, tek bir dosya için:

git rm --cached mylogfile.log

ve tek bir dizin için:

git rm --cached -r mydirectory

151
Kolayca cevapsızdır çünkü kendini açıklayıcı değildir svn rm --keep-local.
Martin

114
Ancak uzak sunuculardaki dosyaları nasıl koruyabilirim? Bu benim yerel olanı tutar, ancak başka bir sunucudan itip çekersem dosya silinir. Ayrıca dosya için bir .gitignore ekledim, ancak yine de kaldırıldı
spankmaster79

6
git pullgit rm
Sonradan

9
Cevapta komutu çalıştırdıktan sonra git commit -m "Commit message"ve kullanmanız gerektiğini belirtmek gerekir git push. Başka aşamalı değişiklikleriniz varsa (kontrol edin git status), bu zamanda da taahhüt edilecektir.
Sinjai

9
Bu en çok kabul edilen cevap olduğu için yapmaz, ne istenir, ne yaptığımı anlatacağım. Komutu kullanıyorum git rm --cached mylogfile.logve dosyayı depodan siliyorum. Verimli sistemdeki dosyayı kaybetmemek için dosyanın bir yedeğini alıp bundan sonra çekin. Dosya daha önce belirtildiği gibi silinir ve yedeklemenizden geri kopyalanması gerekir. Bu oldukça acı verici, ama bu sorun için daha iyi bir çözüm bulamadım.
Marcel Grolms

275

Klasörün tamamını depodan kaldırmak için (Yeniden Paylaşma dosyaları gibi), şunu yapın:

git rm -r --cached folderName

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


13
Sadece gelecekteki ziyaretçiler için eklenen bir not: Tarayıcının repoya "Senkronize Edilmesi" için GUI kullanmayın. Bu, dosyaları yerel deponuza geri çekecektir. Git Push repo branchDosyaları gerçekten uzaktan kumandadan kaldırmak için bir yapmanız gerekir .
RubberDuck

211

Ayrıca, yerel dosya sisteminden silmeden dosyaları .gitignore'nuza dayalı olarak depodan kaldırabilirsiniz:

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

Alternatif olarak, Windows Powershell'de:

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

7
Windows üzerinde çalışmaz. git ls-files -i -X ​​.gitignore çalışır, ancak dosyaları 'git rm' e nasıl göndereceğimi bilmiyorum. Bunu nasıl yapacağınızı biliyor musunuz?
Erik Z

17
Cmd-console yerine Git Bash kullanıyorsanız Windows üzerinde çalışır
Andreas Zita

17
Bunu sev. Dosya adında boşluk olan bazı dosyaları vardı dışında çalıştı. Ben buna burada çözüm modifiye: git ls-files -i -X .gitignore | xargs -I{} git rm --cached "{}". Lütfen bu çözümü değiştirmeyi veya cevabı buraya eklemeyi düşünün, çünkü sahip olmak harika bir araç ...
mpettis

Denemedim ama aynı zamanda .gitkeepdepoda boş bir klasörü koruyan dosyaları da kaldıracak mı test edilmelidir . Örneğin. .gitignoreklasör içeren uploadsve repo takip etmek zorunda .gitkeep. Altındaki tüm repo uploadskaldırarak da kaldıracak .gitkeep.
Vladimir Vukanac

Bu öneri powershell'de mükemmel çalıştı: git rm --cached $ (git ls-files -i -X ​​.gitignore)
geekandglitter

89

Cevabım gereğince: /programming/6313126/how-to-remove-a-directory-in-my-github-repository

Klasörü / dizini veya dosyayı yalnızca git deposundan kaldırmak, yerel değil kaldırmak için 3 basit adımı deneyin.


Dizini kaldırma adımları

git rm -r --cached File-or-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


@gaurav yardımcı oldu sevindim!
eirenaios

69

Ayrıca, hassas veriler (ör. Parola içeren bir dosya) taahhüt ettiyseniz, veriyi depo geçmişinden tamamen silmeniz gerekir. İşte bunun nasıl yapılacağını açıklayan bir kılavuz: http://help.github.com/remove-sensitive-data/


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

1
Ayrıca git bfg repo temizleyici aracını daha kolay ve daha hızlı kullandığımı fark ettim .
lubed Yukarı Slug

64

Daha genel bir çözüm:

  1. .gitignoreDosyayı düzenle .

    ECHO mylogfile.log >> .gitignore

  2. Tüm öğeleri dizinden kaldır.

    git rm -r -f --cached .

  3. Dizini yeniden oluştur.

    git add .

  4. Yeni taahhütte bulun

    git commit -m "Removed mylogfile.log"


2
Bu gerçekten dosyayı silecek mi?
Mr_and_Mrs_D

6
GitHub'dan mı? HAYIR. Github'a zaten ittiyseniz, siteden kaldırmaz. Ancak yerel git deponuzu güncelleyecektir.
mAsT3RpEE

5
Sildiğiniz yorum aslında daha fazla ortadan kaldırıldı :) Çözümün sorunu, rm --cashedbir çektiğinde sonunda dosyayı silmesidir - değil mi? Ve insanların "Dosyayı yerel dosya sisteminden silmeden depodan kaldır" dediklerinde bu istemez . Şimdi yukarıdaki çözüm neden kabul edildi beni - muhtemelen OP tek başına çalışıyordu ve hiç çekilmedi? Dunno. Github "bir kez her zaman orada itti" sorunu ofc anlamak
Mr_and_Mrs_D

Github'a sormadığınız sürece% 100'lük bir çözüm olduğunu düşünmüyorum. Şimdilik buna sadık kal. Dosya kopyala, gitignore'a ekle, gerçek git rm -r yap, taahhüt, it, dosyayı geri yükle. Başka bir çözüm bulmayı başardın mı?
mAsT3RpEE

9
Benim sorunum github değil - onlar çekerken dosya aslında iş arkadaşlarından silinecek olmasıdır . Ben yok dosya silinecek istiyorum. Bu bana geçmişte büyük sorunlara neden oldu. Gerçekten çözüm gerçekten olup olmadığını merak Yani gelmez dosyayı silin. Ayrıca, kabul edilen cevaba ilişkin yoruma bakınız: stackoverflow.com/questions/1143796/…
Mr_and_Mrs_D

24

Git, değiştirilmemiş olduğunu varsayarak bu dosyaları yok saymanızı sağlar. Bu git update-index --assume-unchanged path/to/file.txtkomut çalıştırılarak yapılır . Bir dosyayı bu şekilde işaretledikten sonra git, o dosyadaki değişiklikleri tamamen yok sayar; git durumu veya git diff çalıştırıldığında görünmezler ve hiçbir zaman taahhüt edilmezler.

( Https://help.github.com/articles/ignoring-files adresinden )

Bu nedenle, onu silmemek, ancak sonsuza dek değişiklikleri göz ardı etmek. Bunun sadece yerel olarak çalıştığını düşünüyorum, bu nedenle işçiler yukarıdakiyle aynı komutu çalıştırmadıkça hala değişiklikler görebilirler. (Yine de bunu doğrulamanız gerekiyor.)

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


2
Hm, bunu yapıyorum ama bir başkası depoda değişiklik yaparsa dosyanın üzerine yazılabileceğini görüyorum.
AlxVallejo

17

Sadece bir dosyanın izini kaldırmak ve yerel ve uzak repo'dan silmek istemiyorsanız bu komutu kullanın:

git update-index --assume-unchanged  file_name_with_path

2
Bu iyi bir yanıt olsa da, bunun genellikle bir dosyayı "kaldırılmadığını", insanların genellikle bu sözcüğü Git ile kullandığını, yani izlenmemiş bir dosyanın depo geçmişinde olmayan ve hiç bulunmadığı bir dosyayı "çözmediğini" belirtmek önemlidir. . Bu yanıtın yaptığı şey dosyayı depoda tutmak, ancak Git'in dosyada değişiklik yapıldığını fark etmesini önlemek. Bunun bazı önemli farklılıkları vardır - en önemlisi, dosya başkaları için hala mevcuttur ve başka biri dosyada değişiklik yapar ve çekerseniz, yerel kopyanızın onayı olmadan üzerine yazılabilir.
Soren Bjornstad

8

Yukarıdaki cevaplar benim için işe yaramadı. Ben kullanılan filter-branchtüm taahhüt dosyaları kaldırmak için.

Git deposundaki bir dosyayı şu yöntemlerle kaldırın:

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

Git deposundan bir klasörü aşağıdaki yollarla kaldırın:

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

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

Aşağıdakileri kullanarak bir taahhüt belirtebilirsiniz:

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

Veya bir aralık:

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

Her şeyi uzaktan kumanda etmek için şunları yapabilirsiniz:

git push origin master --force

2
Bu git rm -r --cached NAME, yerel git
deponuzdan

1
Bu git tarihini yeniden yazar ve sonra - zorlamak gerekir, bu sanırım soru ile biraz kapsam dışı. Halka açık ünlü bir repoda, tarih çizgisini böyle değiştiremezsiniz, çünkü herkes zaten klonlamış olan repo çekerken sorunlar yaşayacaktır.
Guillaume Perrot

0

Dosyaları yoksayın, dosyaları git'ten kaldırın, git'i güncelleyin (kaldırma için).

Not: Bu, hassas bilgiler için geçmişle ilgilenmez.

Bu süreç git ile neler olup bittiğini kesinlikle kavramaktadır. Zamanla, bunu kazandıktan sonra, aşağıdaki gibi işlemleri yapmayı öğrendim:

1) dosyaları yoksay

  • .gitignoreBunları yoksaymak için projeyi ekleyin veya güncelleyin - sizinki gibi birçok durumda üst dizin, örneğin log/, kullanılacak normal ifade olacaktır.
  • taahhüt ve bu .gitignoredosya değişikliği itin (itme ihtiyacınız varsa emin değilim, eğer yapılırsa zarar yok).

2) Dosyaları git'ten kaldırın (yalnızca).

  • Şimdi dosyaları git'ten kaldır (yalnızca) git remove --cached some_dir/
  • Hala yerel olarak kaldıklarını kontrol edin (yapmalılar!).

3) Bu değişikliği ekleyin ve uygulayın (aksi takdirde kafa karıştırıcı "ekle" komutuna rağmen, bu "bir şeyler silmek" eklemek için bir değişikliktir!)

  • git add .
  • git commit -m"removal"
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.