.Git klasörümü nasıl temizleyebilirim? Proje dizinimi temizledim, ancak .git hala çok büyük


86

.Git / nesneler benim raylar dizin yanlışlıkla üretilen çöp megabayt yüzlerce sildikten sonra, hala büyük olduğunu tahmin ediyorlar.

git add -ADizini güncellemek ve var olmayan dosyaları kaldırmak için diğer komutların yanı sıra denedim . Belki de yanlış bir şekilde, dizindeki iki karakter adına sahip dosyaların bloblar olduğunu anladım. Önceki taahhütlere geri dönmeyi denedim, ancak şans yok.

Bu dizini temizlemek için ne yapabilirim?

Yanıtlar:


139
  • Dosyaları ekleyip kaldırdıysanız, lekeler hala var ancak sarkıyor. git fsckulaşılamayan blobları listeleyecek ve git pruneonları silecektir.

  • Dosyaları eklediyseniz, işlediyseniz ve sonra geri git reset --hard HEAD^döndüyseniz, biraz daha derine takılırlar. git fsckherhangi bir sarkan commit veya blob'u listelemeyecektir , çünkü şubenizin reflog'u onları tutmaktadır. İşte sadece geçmişinizde bulunan nesnelerin kalmasını sağlamanın bir yolu:

    git reflog expire --expire=now --all
    git repack -ad  # Remove dangling objects from packfiles
    git prune       # Remove dangling loose objects
    
  • Başka bir yol da depoyu klonlamaktır, çünkü bu yalnızca erişilebilir nesneleri taşıyacaktır. Bununla birlikte, sarkan nesneler paketlendiyse (ve birçok işlem gerçekleştirdiyseniz, git otomatik olarak paketlenmiş olabilir), o zaman yerel bir klon tüm paket dosyasını taşıyacaktır:

    git clone foo bar                 # bad
    git clone --no-hardlinks foo bar  # also bad
    

    Git'i yeni bir paketi hesaplamaya zorlamak için bir protokol belirtmelisiniz:

    git clone file://foo bar  # good
    

Evet, sorunu fark etmeden önce taahhüt verdim. Son komut dışında her şeyi denedim. Bunu proje dizinimden çalıştırdığımda "uyarı: Görünüşe göre boş bir havuz klonlamışsınız." Belgeleri okudum ama çok ağır şeyler. Klonu doğru kaynağa nasıl yönlendirebilirim?
light24bulbs

1
@user file://fooURL, geçerli dizine bağlıdır ve bir file:///home/me/foo(üç eğik çizgi) mutlaktır.
Josh Lee

Teşekkürler! bu boyutu ikiye böldü, ancak benim paketim hala deponun geri kalanının on katı büyüklüğünde.
Budamayı

1
@user Eğer bir sürü commit hatalı olarak büyük dosyalara sahipse, o zaman onları seçmek için git-filter-branch kullanmak isteyebilirsiniz .
Josh Lee

2
Üzgünüm, hiçbir etkisi olmadı. Geliştirme ekibim, boyutun artık kabul edilebilir ancak elverişsiz bir aralıkta olduğunu söylüyor. Beni kaşıkla beslemeye devam edecek vaktin varsa bu harika olurdu, ama beni ayağa kaldırdın. Teşekkürler jleedev.
light24bulbs


15

Sparkleshare, birçok kez devasa görüntüler çekmeyi başaramadıktan sonra git'imde 13GB tmp_pack_ dosyası oluşturdu. Yardımcı olan tek şey ...

rm -f .git/objects/*/tmp_*

"git gc" bu dosyaları kaldırmadı.


Bu oldukça kaba kuvvet çözümü ama işe yaramaması için hiçbir sebep göremiyorum. Güzel!
light24bulbs

1
Umutsuz durumlar çaresiz önlemler gerektirir, Bir cazibe gibi çalıştı! Tks.
medina

rm linux komutu için mi? Windows kullanıcısı sonra @cat ne olacak?
gumuruh

7

Budama ve yeniden paketleme işleminden sonra hala büyük bir deponuz varsa ( gc --aggressive --prune=tomorrow...) o zaman tek olanı aramaya gidebilirsiniz:

git rev-list --objects --all |
    while read sha1 fname
    do 
        echo -e "$(git cat-file -s $sha1)\t$\t$fname"
    done | sort -n

Bu size artan boyutta sıralı bir nesne listesi verecektir. Suçluyu deponuzdan çıkarmak için git-filter-branch kullanabilirsiniz.

Yardım için http://progit.org/book/ch9-7.html'deki "Nesneleri Kaldırma" konusuna bakın.


@DavidJames ipucu için teşekkürler. Daha da okunabilir hale
getirdim

Sadece başka birinin bunun üzerine düşmesi durumunda: parantez içindeki bağımsız değişkenlerde bir yazım hatası var: olmalı --aggressive. Düzenlemeye çalıştım, ancak bu kadar küçük bir yazım hatasını düzenleyemeyeceğiniz ortaya çıktı.
hellobenallan

@hellobenallan not için teşekkürler, düzeltildi
sehe

1

Tekrarlı:

find ./ -iname '*.!*' -size 0 -delete
for i in */.git; do ( echo $i; cd $i/..; git gc --aggressive --prune=now --force; ); done
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.