Git Durumunun Tamamlanması Uzun Zaman Alıyor


85

gitBir Windows makinesinde yerel bir dizindeki dosyaları yönetmek için kullanıyorum - burada hiçbir ağ dahil değil, başka bir makineye / makineden itmiyorum veya çekmiyorum. Dizinimde belki 100 dosya var, tüm test dosyaları oldukça küçük. Koştuğumda git status, düzenli olarak tamamlanması 20-30 saniye sürüyor. Bu normal mi? Hızlandırmak için yapabileceğim bir şey var mı veya depomun durumunu görmenin daha iyi bir yolu var mı (değiştirilen dosyalar, izlenmeyen dosyalar, vb.)? Diğer gitkomutlar çok daha hızlı tamamlanıyor gibi görünüyor.


Hangi git sürümünü kullanıyorsunuz? Lütfen msysGit Google Grubunda veya git posta listesinde (git [at] vger.kernel.org, abone olmanıza gerek yoktur) yardım istemeyi düşünün, belki de bu git'te bir hatadır.
Jakub Narębski

Yanıtlar:


129

Git gc'yi denediniz mi? Bu, git deposundaki eksiklikleri temizler.


3
Bu hile yaptı gibi görünüyor. Ancak birkaç işlemden sonra deponun temizlenebilecek bu kadar çok şeyi almasına çok şaşırdım - teşekkürler!
Matt McMinn

4
Hehe, ben sadece komutu git statuskullanarak çalıştırdım ve time30.464'lük "gerçek" bir zaman elde ettim. git gcSonra bir time git statuskez daha koştum ve gerçek 35.409'luk bir zaman elde ettim. Oldukça tuhaf.
RyanScottLewis

14
Bu, depolarımın çoğu için beni 33 saniyeden 1 saniyenin altına düşürdü. Git'in size o noktaya gelmeye başladığınızda bunu yapmanızı söylemesi güzel olurdu. Buna ihtiyaç olduğunu asla bilmiyordum.
XP84

Bir git statussatırda birden çok kez çalıştırıldığında , sonraki çalıştırmalar ilkinin yalnızca bir kısmını alır. Yani, koşuyorsanız git status, o zaman git gcve sonra git statustekrar, süper hızlı çalışması bekleniyor.
kiewic

7

Benzer bir sorunda, mevcut git depomun altındaki bir dizinde git deposu bulunmasının büyük bir yavaşlamaya neden olduğunu buldum.

İkincil git deposunu başka bir yere taşıdım ve şimdi hız çok yüksek!


Benzer bir problem ekliyorum. Ne oldu git init bir alt dizinde yaptı. Sorun şu ki, alt dizinin biraz gizli olması (değişiklikleri görmek için içeride git durumunu yapmanız gerekir) ama sanırım git hala bunları hesaplamaya çalışıyor. Alt dizini görmezden geliyorum ve şimdi her şey yolunda.
mb14

6

Bir çeşit virüs koruma yazılımı kullanıyor musunuz? Belki bu olaylara müdahale ediyordur. git1000 dosyalık depolara sahip pencerelerde benim için çok hızlı.


1
Evet, işveren TrendMicro OfficeScan'i zorunlu kıldı. Virüs tarayıcısını öldürdüm, git durumuyla aynı sonuçlar.
Matt McMinn

1
Bu temanın bir başka çeşidi, kutunuzu oldukça yavaşlatabilen Credant gibi anında şifreleme yazılımıdır.
Don Branson

Benim için sorun buydu. Kaspersky antivirüs öldürüldü ve durum 1 saniyeden kısa oldu.
Robin Winslow

5

Yeniden paketlemeyi denediniz mi? git-repack .

Aksi takdirde, dizini çoğaltmayı ve yinelenen dizindeki .git klasörünü silmeyi deneyin. Sonra yeni bir git dizini oluşturun ve hala yavaş olup olmadığına bakın.

Hala yavaşsa, bir sistem veya donanım sorunu gibi görünür. Git benim için yüzlerce dosyanın durumunu 5 saniyeden daha kısa sürede bitiriyor.


repack yardımcı olmuş gibi görünüyordu - çalıştırdıktan sonra durumu çalıştırdım ve hemen geri döndü. Ancak birkaç saniye bekledim ve tekrar koştum ve 30 saniye sürdü. Dizini kopyalamaya çalıştım ve aynı sorunu yaşadım.
Matt McMinn

Hmm, ilginç. Harici sürücünüz var mı? Veya bir USB flaş çubuğu? Depoyu oraya kopyalamayı deneyin ve herhangi bir fark olup olmadığına bakın. Şu anda takılı olduğu sürücüde bir sorun olabilir.
thedz

USB sürücüde fark yok.
Matt McMinn

Bu gerçekten tuhaf. Bu noktada gerçekten tek söyleyebileceğim, bilmediğim. Deponuzu kopyalamayı deneyebilir ve başka birinin bilgisayarında deneyebilirsiniz - bu, en azından size sisteminizde yerel bir sorun olup olmadığını söylemelidir.
thedz

4

Bazı nedenlerden dolayı git status, depo klasörünü yeni bir konuma taşıdıktan veya kopyaladıktan sonra özellikle yavaş.

Sonraki çalıştırmalar bu durumda genellikle daha hızlıdır.


1
İlk çalıştırmada bu yavaşlıktan kaçınmanın bir yolu var mı? Git gc'yi denedim, ancak yardımcı olmadı. Dosyaları kopyaladıktan sonra yalnızca ilk seferde gerçekleştiği için sorun olmadı.
franksands

Başlangıçtaki yavaşlıktan kaçınmanın bir yolunu bilmiyorum, ancak bunu yapabilecek bir komut olsaydı, muhtemelen ilk git statuskomutla aynı şeyi yapıyor olacaktı, bu yüzden tamamlanması muhtemelen aynı miktarda zaman alacaktı.
DanJAB

4

Benim git statusçok yavaştım (bir dakikaya kadar) çünkü global .gitignoredosya, erişilemeyen bir ağ paylaşımında depolanan Windows kullanıcı profilimde bulunuyordu.

git config --global core.excludesfile
gibi bir şey gösterdi \\Nxxxx0\User\Username\Eigene Dateien\gitignore_global.txt

Bazı nedenlerden \\Nxxxx0dolayı erişilemezdi ve kullanıcı profilim bir yedekleme sisteminden yüklendi \\Nxxxxx1. Bunu anlamak biraz zaman aldı, çünkü genellikle kullanıcı profilim bir kurumsal başlangıç ​​betiği tarafından bir sürücü harfine bağlı ve bu sürücü harfine erişmek her zamanki gibi çalışıyordu. Git-config'in neden sürücü harfini değil de ağ paylaşımını kullandığından emin değilim (muhtemelen daha genç bir ben suçluyum)

Ayarlandıktan sonra
git config --global core.excludesfile $HOME/Eigene\ Dateien/gitignore_global.txt
git statusnormal hıza geri döndü.


3

Koşu git fsck, geçmişte bu sorunu benim için çözdü.


3

Benim için yavaşlık, çok sayıda izlenmemiş dosyaya (komut dosyalarından geçici ve çıktı dosyaları) sahip olmasından kaynaklanıyordu. İzlenmeyen dosyaları git status -unohariç tutan, çok daha hızlı çalıştırılan ve gereksinimlerimi karşılayan çalışma


1

Benim için sorun, yerel sabit diskime klonlanmış birçok farklı depom olmasıydı, ne kadar çok deponuz varsa git durumu gibi komutları çalıştırmak o kadar uzun sürecek.

Artık yerel olarak ihtiyaç duymadığım birçok depoyu sildim ve git durumum 1 dakikadan 5 saniyeye çıktı.

Burada buna benzer bir cevap göremiyorum.


1
Bunun git statusbir dizinde çalıştırdığınız standardı hiçbir şekilde etkileyebileceğini sanmıyorum . Depolarınız farklı dizinlere teslim ediliyorsa, bir seferde yalnızca git statusbiri için çalıştırabilirsiniz . Git depolarınız çakışıyorsa farklı bir hikaye olabilir, ancak bu yine de kötü bir fikirdir.
Hubert Grzeskowiak

@HubertGrzeskowiak kesinlikle yapabilir. Benim için sabit diskimin farklı yerlerinde bulunuyorlardı ama git status yazarken yükleme sürelerimi büyük ölçüde etkiledi. Yinelenen depoları kaldırdıktan sonra, anında birkaç dakikadan 5 saniyeye kadar hızlandı.
Jack Perry

1

git statusİyileştirilecek bir başka özellik de (Git 2.14.x / 2.15, Q4 2017'de) göz ardı edilen dosyaları da göstermesidir ( git status --ignored)

" git status --ignored", herhangi bir izlenen yolu olmayan bir dizinin göz ardı edildiğini fark ettiğinde, yine de dizindeki yok sayılan tüm yolları numaralandırır, bu da gereksizdir.
Kod yolu, bu ek yükten kaçınmak için optimize edilmiştir.

Bkz. Commit 5aaa7fd (18 Eyl 2017), Jameson Miller ( jamill) .
(Göre Birleştirilmiş Junio Cı Hamano - gitster- içinde işlemek 075bc9c , 29 Eylül 2017)

Performansını artırın git status --ignored

Boş olmayan yok sayılmış dizinleri listelemek istediğinde dizin listeleme mantığının performansını artırın. Boş olmayan yok sayılmış dizinleri göstermek için, mevcut mantık, yok sayılmış bir dizinin tüm içeriğini yinelemeli olarak yineleyecektir.
Bu değişiklik, ilk dosyayı bulduğunda içerikte yinelemeyi durdurmak için optimizasyonu sunar. Bu, yok sayılmış dizinlerde çok sayıda dosya bulunan depolarda 'git durumu - imzalanmış' performansında önemli bir iyileşme sağlayabilir.

Göz ardı edilen 400 dizinde 196.000 dosyadan oluşan örnek bir havuzdaki performans farkına bir örnek için:

| Command                    |  Time (s) |
| -------------------------- | --------- |
| git status                 |   1.2     |
| git status --ignored (old) |   3.9     |
| git status --ignored (new) |   1.4     |

Daha fazla iyileştirme için (Git 2.17, Q2 2018'de ayarlanmıştır), bu yanıta bakın .


Burada tamamen rastgele örnek: node_modulesbu mükemmel değişimden etkilenebilir. Sadece belki.
Seth Battin

1

Git'in eski sürümlerinde git durumuyla ilgili bir performans sorunu var - daha fazla bilgi için Git durumu performansını iyileştirmenin yolları bölümüne bakın .

git 2.13'te 1 düzeltme ve 2.17 tane daha var. 2.7'den 2.23'e geçtim ve yavaş durumu çözdü. Yakında 2.24 için planlanan başka bir iyileştirme var.


0

Benim durumumda yavaşlık, git statusprojedeki dosyaların sahibinden farklı bir kullanıcı olarak çalıştırılmasından kaynaklanıyordu .

Her durumda geçerli olmasa chownda, mevcut kullanıcınız için basit bir hile yapabilir.


-13

Ödemenizin yeni bir klonuyla başlamayı deneyin.

git clone myrepo mynewrepo

ve sonra mynewrepo'da git durumunu yapın.

Alternatif olarak ve daha cesursanız, mevcut kasanızdaki çöpü temizleyin.

git clean -dfx

Bu, git'in bazı (muhtemelen büyük) yok sayılan veya teslim edilmeyen dosyaları taramasını önler.


Görmezden gelen tüm dosyalarınızı silmenin (git clean'in yaptığı) yardımcı olacağını sanmıyorum, zaten onları görmezden geliyor. Git clean'i çalıştırmak büyük olasılıkla tüm yapılandırma dosyalarınızı vb. Yeniden klonlama (önce ihtiyacınız olması durumunda eski deponuzu kaydetmek) git clean'i çalıştırmaktan çok daha iyidir ve aynı etkiye sahiptir.
XP84

5
Bu yanıta katılmıyorum, git clean -dfx'i çalıştırmak işleri bozabilir.
Marcel Valdez Orozco
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.