2010-08-11 1 views
57

Son zamanlarda, metin editörlerimin kullandığı proje dosyalarının (başka bir önemsiz ile birlikte) proje için git deposunu eklediğini fark ettim. Aslında projenin bir parçası olmadıklarından onları kaldırmak istiyorum, ancak git rm eski sürümleri depodan kaldırmıyor ve umut verici görünen başka bir şey bulamadım.Bir dosyayı tamamen bir depodan nasıl kaldırabilirim?

+3

kısmi yinelenen alabilirsiniz: http://stackoverflow.com/questions/307828/git-remove-file-accidentally-added-to - deposu http://stackoverflow.com/questions/1216733/remove-a-directory-permanently-from-git – Cascabel

cevap

110

İstediğiniz araç git filter-branch'dur. Onun kullanımı temelde here tarif, ancak:

$ git filter-branch --tree-filter 'rm -f my_file' HEAD 

her taahhüt gelen "my_file" kaldıracaktır.

Bunun her bir işlemi yeniden yazdığına dikkat edin, bu nedenle uzak bir depoya bastığınızda, (a) güncelleştirmeyi zorlamanız gerekir ve (b) sizden çektiği herkesin artık yinelenen taahhütleri olacaktır (yeniden yazdığınızdan git rebase man page'da açıklandığı gibi).

+15

'--prune-empty 'eklemenizi öneririm, böylece sonuç olarak oluşturulan herhangi bir boş taahhüt kaldırılır çok. – fnkr

+0

Bu, farklı dizinlerde aynı ada sahip birçok dosya ile nasıl bir depoda çalışır? Aynı ada sahip tüm dosyaları siliyor mu? – CodeMonkey

+1

@CodeMonkey: Bu durumda, daha uzun ve benzersiz bir yol kullanırsınız. – mipadi

5

git filter-branch bunun için uygundur, ancak repo geçmişinizin değişeceğinden ve işlemin devam etmesinden sonra işlemenin karmalarının farklı olacağından emin olun. Ayrıca alan boşaltmak istiyorsanız

, sana git forget-blob kullanmanızı öneririz yalnız git filter-branch hala uzaktan kumanda, reflog, etiketler ve böyle tarafından başvurulan edilebilir gibi git, dosyanızı unutmak yapmaz çünkü.

git forget-blob main.c.swp

Kesinlikle önceki sorulara kapsadığı fazla bilgi here