Git klasörünün boyutunu azaltmanın bir yolu var mı?


156

Görünüşe göre projem gittikçe büyüyor commit/push. Git klasörü temizlemenin bir yolu var mı?

Yanıtlar:


214

Ne istediğinden emin değilim. Her şeyden önce, elbette her taahhüt / itme dizini biraz daha büyüyecektir, çünkü bu ek taahhütlerin her birini saklaması gerekir.

Ancak, muhtemelen git gc"gereksiz dosyaları temizler ve yerel havuzu optimize eder" istersiniz ( manuel sayfa ).

Başka olasılıkla ilgili komut git cleanhangi silmek için ağacı (dan izlenmeyen dosyaları manuel sayfa ).


30
git clean -d -f -x, .gitignore ve benzerlerinde listelenen dosyaları siler. Örneğin git'e ait olmayan çalışma alanları, Pod klasörü vb.
Kalle

102
WARNING@Kalle tarafından yukarıda yazılan komut , sadece ".gitignore içinde listelenen dosyalar" değil , HER ŞEKİLDE KULLANILMAMIŞ <DOSYA VE DİZİNİN GİT KÖKÜNÜZDE kaldırılmasını sağlar. Git tarafından takip edilip edilmediğine bakılmaksızın Git tarafından izlenmeyen her şey silinir. (üzerinde yer alan duruma dikkat edin ) yalnızca geçerli kuralı olan öğeleri kaldıracaktır . Bu uyarıya dikkat edin: Hiçbir zaman çalıştırmak ile, etkileşimli modda çalışan ya olmaksızın yerine ya da en azından ilk bir prova yapıyor - ile daha sonra tekrar . .gitignoregit clean -dfXX.gitignore git clean-i-f-n-f
Adrian Günter

5
Veya yedek yapma :-)
Mateen Ulhaq

61

Çalıştırmak:

git remote prune origin

Daha önce kaldırılmış originancak yerel olarak hala kullanılabilir durumda olan tüm eski izleme dallarını siler remotes/origin.

git gc --auto

' G arbage C ollection ' - temizlik görevlerini yürütür (revizyonları sıkıştırır, gevşek / erişilemeyen nesneleri kaldırır). --autoBayrak ilk herhangi bir iş gerekip gerekmediğini belirler ve eğer herhangi bir şey yapmadan çıkışlar.


4
Bunların ne yaptığına dair bazı açıklamalar? Onları Google'a çevirebileceğimizi ve belgelerini arayabileceğimizi biliyorum, ancak yalnızca kod veya komutlar içerdiğinde yanıtınızın kısa bir açıklamasını yapmak yaygın bir uygulamadır.
Dzhuneyt

28

Git repo'nuzun her taahhütte ciddi şekilde büyüyeceği bir senaryo, düzenli olarak oluşturduğunuz ikili dosyaları yürüttüğünüz senaryodur . Depolama alanları metin dosyasından daha etkili olmayacaktır .

Başka sen içindeki dosyaların çok büyük sayıda biridir biri (a olan repo Git sınırı (yerine birkaç subrepos arasında) submodules olarak yönetilen ).

Git Space hakkındaki bu makalede , AlBlue şunlardan bahseder:

Git'in (ve Hg'nin ve diğer DVCS'lerin), (büyük) ikili dosyaların teslim edildiği, ardından silindikleri bir sorundan muzdarip olduğunu unutmayın; çünkü bunlar güncel olmasa bile depoda görünecek ve yer kaplayacaklardır .

Git deponuzda büyük ikili dosyalar varsa, şunları düşünebilirsiniz:

Ben de belirtildiği gibi " Ne Git'te dosya sınırları (sayı ve boyut)? Hangi daha yeni," (2015, bu cevap sonrası 5 yıl) Git LFS GitHub depolayarak (o büyük dosyaları yönetmek için bir yoldur dışında Git deposu).


1
Git büyük dosya desteği, rutin olarak eklenen / güncellenen büyük ikili dosyalarınız (resimler gibi) varsa yardımcı olur. Bkz. Git-lfs.github.com . Github tarafından desteklenen süper uygulaması kolaydır. Tüm ekip üyelerinin işbirliği içinde kullanabilmeleri için yüklemeleri gerekir.
Eric Woods

@EricWoods True. Git-LFS'den daha önce bahsetmiştim (64 kez: stackoverflow.com/search?tab=newest&q=user%3a6309%20git-lfs ). Bu eski cevabı buna göre düzenledim.
VonC

Ha, gerçekten! 9 yaşından büyük bir cevabın hala ne kadar alakalı olduğu komik (ve şimdi LFS bilgisi ile daha da fazla).
Eric Woods

22

evet evet, git gcçözüm, doğal olarak,

ve yerel olarak - sadece yerel havuzu silebilir ve tekrar klonlayabilirsiniz,

ama burada daha önemli bir şey var ...

o büyük git ve harici öğelerin işlenmesi için beklediğiniz saniye, harcanan saatler süren verimsiz zamana kadar toplanan uzun dakikalara toplanır,

Yeni oluştur (tamamen değil, sadece bir kolu) sıfırdan depo , dosyaların sadece son sürümü de dahil olmak üzere doğal tüm geçmişini gevşek edeceğiz

ancak kod dünyasında duygusal olmanın zamanı olmadığında, her taahhüt veya farkın 5 yıllık kodunun tamamı boyunca sürüklenmenin bir anlamı yoktur, nostaljik olursanız, eski git ve dışsalları bir yerde saklayabilirsiniz:]

ancak, bir noktada gerçekten ilerlemeniz gerekir:]

ekibiniz size teşekkür edecek!


12
Tamamen katılıyorum, son zamanlarda bu yaklaşımı eski bir depo ile aldık ve geriye bakmadık; iyi, esas olarak yapamadığımız için, ama ne demek istediğimi biliyorsun :)
WhatIsHeDoing

13

Bu komutu çalıştırmak son derece tehlikelidir, ancak tüm git kurtarma / yedekleme dosyalarınızı silerek deponuzu küçültür:

git reflog expire --expire=now --all && git gc --prune=now --aggressive

Git deponuzu bazı kötü komutlardan kurtarmak için kullandığı tüm dosyaları silecektir, örneğin, yaptıysanız git reset --hard, genellikle kaybolan dosyaları kurtarabilirsiniz. Ama komuttan git reset --hardönce yaparsanız git reflog expire..., her şeyi kaybettiniz. Şimdi, tek umudunuz, dosya sisteminizi analiz eden ve geçersiz kılınmamışsa silinmiş dosyaları kurtarmaya çalışan bir araç kullanmaktır.


3
Buna gerçekten son derece tehlikeli demezdim . Sadece dikkatli olman gereken bir ţeyi etiketleyecektim . Benim tecrübelerime göre, çok azı yeniden yapılanmaya ya da ulaşılamayan nesnelere dokunuyor - çoğu orada olduklarını ya da onlarla nasıl etkileşime gireceklerini bile bilmiyorlar ve bu yüzden yararlı olacakları durumlarda ya da çok korkunç bir şekilde yapılıyorlar verimsiz yol. Bu komutların ne yapacağını bilmiyorsanız ve anlayamıyorsanız, o zaman güvenle çalıştırabileceğinizi söyleyebilirim!
Chris Morgan

10

git clean -d -f -i bunu yapmanın en iyi yoludur.

Bu, daha kontrollü bir şekilde temizlemeye yardımcı olacaktır.

-i interaktif anlamına gelir.


3
OP'nin sorusu belirsiz olsa da, bu açıdan iyi bir cevap olsa da git clean, dizinin temizlenmesi kadar repoyu temizlemek için olmadığını belirtmek isterim . Körü körüne kopyalayıp yapıştıran kullanıcılar için; bu, yerel olarak gerçekten isteyebileceğiniz izlenmemiş dosyaları / dizinleri kaldırır.
sraboy

git clean -d -x -f derinlemesine temizlemek istiyorsanız güzel çalışıyor
Rishabh Jain

2

Büzülecek mi bilmiyorum, ama çalıştırdıktan sonra git clean, sık sık da yaparım git repack -ad, bu da paket dosyalarının sayısını azaltır.


5
repack git gcsürecin bir parçası , bu yüzden ayrı çalıştırmaya gerek yok
artkoshelev
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.