Büyük Depolarda Git Status YavaÅlıÄına Son: İki Ayar İle Performansı %95 İyileÅtirme
Modern yazılım geliÅtirme süreçlerinde Git, projelerin versiyon kontrolü için vazgeçilmez bir araç haline geldi. Ancak, özellikle büyük kod tabanlarına sahip monorepolar veya uzun soluklu projelerde, basit bir git status komutunun bile saniyelerce hatta dakikalarca sürmesi, geliÅtirici verimliliÄini ciddi Åekilde düÅürebilir. Bu durum, günlük iÅ akıÅını sekteye uÄratmakla kalmaz, aynı zamanda CI/CD (Sürekli Entegrasyon/Sürekli Teslimat) süreçlerinde de darboÄazlara yol açabilir. Peki, 17.6 saniye süren bir git status komutunu sadece iki küçük yapılandırma ayarı ile 0.83 saniyeye düÅürmek mümkün mü? Cevap kesinlikle evet! Bu makalede, bu sihirli iki ayarın ne olduÄunu, neden iÅe yaradıÄını ve Git depolarınızda performansı nasıl kökten deÄiÅtirebileceÄini detaylıca inceleyeceÄiz.
Git Status Komutu Neden Ãnemli ve Büyük Depolarda Neden YavaÅlar?
git status komutu, bir geliÅtiricinin günlük iÅ akıÅının temel taÅlarından biridir. ÃalıÅma dizininizdeki (working directory) dosyaların mevcut durumu hakkında size hızlıca bilgi verir: hangi dosyaların deÄiÅtirildiÄini, hangilerinin dizine (staging area) eklendiÄini, hangilerinin takip edilmediÄini ve son commit’ten (taahhüt) bu yana ne gibi deÄiÅiklikler olduÄunu gösterir. Bu bilgiler, bir sonraki adımınızı planlamanız, deÄiÅiklikleri organize etmeniz ve projenin genel saÄlıÄını anlamanız için hayati öneme sahiptir. Ancak, depo boyutu arttıkça, özellikle yüz binlerce veya milyonlarca dosya içeren projelerde, bu basit komutun çalıÅma süresi katlanarak artabilir.
Peki, bu yavaÅlamanın arkasındaki temel nedenler nelerdir? Git, git status komutunu çalıÅtırdıÄında, çalıÅma dizininizdeki her bir dosyayı kontrol eder. Bu kontrol süreci temelde üç ana aÅamadan oluÅur:
- Dosya Sistemi Taraması ve DeÄiÅiklik Tespiti: Git, çalıÅma dizininizdeki her dosyayı gezerek, o dosyanın diskteki son deÄiÅtirilme zamanı (mtime), boyutu ve inode gibi meta verilerini alır. Bu meta verileri, Git’in kendi dizinindeki (index) kayıtlarla karÅılaÅtırır. EÄer bu meta verilerde bir farklılık varsa, dosyanın içeriÄinin deÄiÅmiÅ olabileceÄi varsayılır ve dosyanın SHA-1 (veya daha yeni sürümlerde SHA-256) karması hesaplanır. Bu karma, dosyanın içeriÄinin gerçekten deÄiÅip deÄiÅmediÄini kesin olarak belirlemek için kullanılır. Ãzellikle çok sayıda dosya ve dizin içeren büyük depolarda, bu dosya sistemi taraması baÅlı baÅına zaman alıcı bir iÅlemdir. Her bir dosya için iÅletim sistemine yapılan
stat()veya benzeri sistem çaÄrıları, binlerce veya milyonlarca kez tekrarlandıÄında ciddi bir performans maliyeti yaratır. - Takip Edilmeyen Dosyaların (Untracked Files) Yönetimi: Git, sadece takip ettiÄi dosyaları deÄil, aynı zamanda çalıÅma dizininde bulunan ancak Git tarafından henüz izlenmeyen (yani
.gitignoredosyasında belirtilmemiÅ veya manuel olarak eklenmemiÅ) dosyaları da listelemek zorundadır. Bu, Git’in tüm çalıÅma dizinini tarayarak, kendi dizininde (index) veya HEAD commit’inde bulunmayan dosyaları tespit etmesini gerektirir. EÄer projenizdenode_modules,vendor,buildgibi çok sayıda geçici veya baÄımlılık dosyası içeren dizinler varsa ve bunlar.gitignoredosyasında yeterince iyi yönetilmiyorsa, Git bu devasa dizinleri de taramak zorunda kalır. Bu durum, yavaÅlamanın en büyük nedenlerinden biri olabilir. - Dizin Boyutu ve DerinliÄi: Monorepolar, yani birden fazla projenin tek bir Git deposunda yönetildiÄi yapılar, doÄal olarak çok büyük dosya sayılarına ve derin dizin hiyerarÅilerine sahiptir. Benzer Åekilde, bazı projeler, örneÄin büyük bir oyun motoru veya iÅletim sistemi çekirdeÄi gibi, milyonlarca kaynak kodu dosyası içerebilir. Bu tür depolarda, Git’in tüm bu dosyaları taraması, dizin yapısını gezmesi ve her bir dosya için gerekli kontrolleri yapması, kaçınılmaz olarak uzun sürelere yol açar. Dosya sisteminin kendisi de bu tür yoÄun okuma iÅlemlerinde belirli bir sınıra sahiptir; özellikle HDD (mekanik disk) kullanılıyorsa, performans düÅüÅü daha da belirginleÅir. SSD (katı hal sürücü) kullanımı bile, dosya sayısı milyonları bulduÄunda bir noktadan sonra yetersiz kalabilir.
Bir vaka analizi olarak, uluslararası bir yazılım firmasının büyük bir JavaScript monoreposunu ele alalım. Bu depoda, yüzlerce mikroservis ve ön uç uygulaması bir arada bulunuyordu. Her bir uygulamanın kendi node_modules klasörü ve derlenmiŠçıktıları vardı. Proje büyüdükçe, git status komutu 20-30 saniyeye kadar uzayabiliyordu. Bu durum, geliÅtiricilerin her deÄiÅiklikten sonra durumu kontrol etmek için uzun süreler beklemek zorunda kalması anlamına geliyordu. Gün içinde defalarca tekrarlanan bu bekleme süreleri, toplamda saatlere varan bir verimlilik kaybına yol açıyordu. CI/CD pipeline’larında da benzer bir sorun yaÅanıyor, her aÅamada git status veya benzeri dosya sistemi tarama komutları yüzünden build süreleri uzuyordu. Bu durum, sadece geliÅtiricilerin motivasyonunu düÅürmekle kalmıyor, aynı zamanda Åirketin genel geliÅtirme hızını da yavaÅlatıyordu.
Git’in Performans Engelini Anlamak: Dosya Sistemi EtkileÅimi
Git’in temel çalıÅma prensibi, dosyaların içeriÄini ve meta verilerini sürekli olarak izlemeye dayanır. Herhangi bir deÄiÅiklik olduÄunda, Git bu deÄiÅikliÄi tespit etmek ve depoda uygun Åekilde saklamak zorundadır. Bu izleme süreci, yoÄun dosya sistemi etkileÅimleri gerektirir. Git, çalıÅma dizinindeki dosyaları tararken, her bir dosya için iÅletim sisteminden bilgi ister. Bu bilgiler arasında dosyanın deÄiÅtirilme zamanı, boyutu ve dosya sistemindeki konumu gibi detaylar yer alır. Bu süreç, özellikle büyük depolarda, yüz binlerce veya milyonlarca dosya için tekrarlandıÄında, dosya sistemi üzerindeki yükü artırır ve git status gibi komutların yavaÅlamasına neden olur.
Git, deÄiÅiklikleri tespit etmek için genellikle iki ana yöntem kullanır: birincisi dosya meta verilerini (mtime, ctime, boyut) karÅılaÅtırmak, ikincisi ise dosya içeriÄinin karmasını (hash) hesaplamaktır. EÄer dosya meta verileri deÄiÅmiÅse, Git dosyanın içeriÄinin de deÄiÅmiÅ olabileceÄini varsayar ve doÄrulamak için içeriÄin karmasını hesaplar. Bu karma hesaplama iÅlemi, dosyanın boyutuna baÄlı olarak zaman alabilir. Küçük bir depo için bu iÅlemler neredeyse anında gerçekleÅirken, büyük depolarda bu süreçler birikerek ciddi gecikmelere yol açar. ÃrneÄin, bir Java projesinde derlenmiÅ .class dosyaları, veya bir C++ projesinde .o dosyaları, hatta bir Python projesinde __pycache__ dizinleri, Git’in taraması gereken binlerce ek dosya anlamına gelebilir. Bu dosyalar genellikle .gitignore ile göz ardı edilse de, Git’in yine de bu dosyaların varlıÄını kontrol etmesi ve .gitignore kurallarıyla eÅleÅtirmesi gerekir ki bu da bir miktar maliyet yaratır.
Ayrıca, Git’in dizin (index) dosyası, projenin anlık durumunun bir anlık görüntüsünü (snapshot) içerir. git status komutu, çalıÅma dizinini bu dizin dosyasıyla karÅılaÅtırarak deÄiÅiklikleri belirler. EÄer dizin dosyası çok büyükse (milyonlarca giriÅ içeriyorsa), bu karÅılaÅtırma iÅlemi de zaman alıcı hale gelebilir. Git’in bu karÅılaÅtırmaları etkili bir Åekilde yapabilmesi için, dosya sistemiyle olan etkileÅimlerini optimize etmesi gerekir. İÅte tam da bu noktada core.untrackedCache ve core.fsmonitor gibi yapılandırma ayarları devreye girer. Bu ayarlar, Git’in dosya sistemiyle olan etkileÅimini akıllıca yöneterek, gereksiz taramaları ve hesaplamaları en aza indirmeyi hedefler. Böylece, Git’in sadece gerçekten deÄiÅen veya potansiyel olarak deÄiÅmiÅ olabilecek dosyalar üzerinde yoÄunlaÅmasını saÄlayarak performansı artırır.
Ãözümün Anahtarı: core.untrackedCache ve core.fsmonitor Nedir?
Git’in büyük depolardaki performans sorunlarına yönelik en etkili çözümlerden ikisi, core.untrackedCache ve core.fsmonitor yapılandırma ayarlarıdır. Bu iki ayar, Git’in dosya sistemiyle etkileÅimini optimize ederek, git status gibi komutların çalıÅma süresini önemli ölçüde azaltır. Åimdi bu ayarları detaylıca inceleyelim:
core.untrackedCache: Takip Edilmeyen Dosyaların Akıllı Ãnbelleklemesi
core.untrackedCache ayarı, Git’in takip edilmeyen (untracked) dosyaları yönetme biçimini deÄiÅtirir. Varsayılan olarak, git status her çalıÅtıÄında, çalıÅma dizinindeki tüm dosyaları tarar ve bunların takip edilip edilmediÄini kontrol eder. EÄer projenizde node_modules, vendor, build veya benzeri, binlerce hatta yüz binlerce dosya içeren dizinler varsa ve bunlar .gitignore tarafından zaten göz ardı ediliyorsa bile, Git yine de bu dizinleri gezmek ve her bir dosyanın durumunu kontrol etmek zorunda kalır. Bu, büyük bir performans yükü oluÅturur.
core.untrackedCache ayarı true yapıldıÄında, Git takip edilmeyen dosyalar hakkında bilgi içeren bir önbellek oluÅturur ve bu önbelleÄi güncel tutar. Bu önbellek, .git/index dosyasının içinde veya yanında saklanır. Bir sonraki git status çaÄrısında, Git tüm çalıÅma dizinini tekrar taramak yerine, bu önbelleÄi kullanarak takip edilmeyen dosyaların durumunu çok daha hızlı bir Åekilde belirleyebilir. Bu, özellikle .gitignore tarafından göz ardı edilen ancak fiziksel olarak diskte var olan devasa dizinlerin olduÄu durumlarda muazzam bir hız artıÅı saÄlar. Git, bu önbelleÄi akıllıca günceller; sadece gerekli olduÄunda (örneÄin, bir git clean iÅlemi yapıldıÄında veya önbellekteki bir dosyanın zaman damgası deÄiÅtiÄinde) yeniden tarama yapar. Bu sayede, gereksiz dosya sistemi okumaları ve CPU döngüleri büyük ölçüde azalır.
Bu özelliÄin temel faydası, Git’in dosya sistemiyle yaptıÄı gereksiz stat() çaÄrılarının sayısını azaltmasıdır. Bir dosyanın takip edilip edilmediÄini anlamak için, Git’in o dosyanın meta verilerine eriÅmesi gerekir. untrackedCache, bu bilgiyi bir kez okuduktan sonra önbelleÄe alarak, sonraki sorgulamalarda disk eriÅimini atlamasını saÄlar. Bu da özellikle yavaÅ disklerde veya aÄ Ã¼zerindeki dosya sistemlerinde çalıÅanlar için hayati bir iyileÅme demektir.
core.fsmonitor: Dosya Sistemi İzleyicisi ile Anında Bildirimler
core.fsmonitor ayarı, Git’in dosya sistemi deÄiÅikliklerini izlemek için iÅletim sistemi seviyesindeki bildirim mekanizmalarını kullanmasını saÄlar. Git’in geleneksel yaklaÅımında, çalıÅma dizinindeki deÄiÅiklikleri tespit etmek için sürekli olarak dosyaların meta verilerini (mtime gibi) kontrol etmesi gerekir. Bu, her git status çaÄrısında potansiyel olarak binlerce dosyanın tek tek kontrol edilmesi anlamına gelir.
core.fsmonitor true yapıldıÄında, Git bir dosya sistemi izleyicisi (file system monitor) yardımcı süreci (helper process) kullanır. Bu yardımcı süreç, iÅletim sisteminin yerel dosya sistemi izleme API’larını kullanarak (örneÄin Linux’ta inotify, macOS’ta FSEvents, Windows’ta ReadDirectoryChangesW), çalıÅma dizininde gerçekleÅen dosya deÄiÅikliklerini anında takip eder. Bir dosya oluÅturulduÄunda, deÄiÅtirildiÄinde veya silindiÄinde, dosya sistemi izleyicisi bu olayı tespit eder ve Git’e bildirir. Bu sayede, Git, git status komutu çalıÅtırıldıÄında tüm çalıÅma dizinini baÅtan sona taramak yerine, yalnızca dosya sistemi izleyicisi tarafından bildirilen deÄiÅmiÅ dosyaları kontrol eder. Bu, özellikle çok büyük depolarda ve aktif geliÅtirme yapılan ortamlarda inanılmaz bir hız artıÅı saÄlar.
fsmonitor‘un çalıÅma prensibi oldukça basittir: İÅletim sistemi, bir dizindeki deÄiÅiklikleri dinleyebilir ve bu deÄiÅiklikler hakkında uygulamalara bilgi verebilir. Git, bu yeteneÄi kullanarak, hangi dosyaların deÄiÅtiÄini veya yeni eklendiÄini pasif bir Åekilde öÄrenir. Böylece, git status çaÄrıldıÄında, Git’in yapması gereken iÅ miktarı, sadece birkaç deÄiÅmiÅ dosyayı kontrol etmekle sınırlı kalır, milyonlarca dosyayı taramak zorunda kalmaz. Bu, özellikle dosya sayısı çok fazla olan ve sık sık deÄiÅiklik yapılan monorepolar için oyun deÄiÅtirici bir özelliktir. Bu özellik, core.untrackedCache ile birleÅtiÄinde, Git’in performansını adeta fırlatır; untrackedCache takip edilmeyen dosyaları hızlıca ele alırken, fsmonitor takip edilen dosyaların deÄiÅikliklerini anında tespit eder.
Bu iki ayarın birleÅimi, Git’in dosya sistemiyle olan etkileÅimini radikal bir Åekilde optimize eder. untrackedCache, göz ardı edilen dosyaların yükünü hafifletirken, fsmonitor, takip edilen dosyaların deÄiÅiklik tespitini neredeyse anlık hale getirir. Sonuç olarak, git status komutu, devasa depolarda bile saniyeler içinde tamamlanarak geliÅtirici verimliliÄini maksimum seviyeye çıkarır.
Adım Adım Uygulama: Git Performansınızı Nasıl Hızlandırırsınız?
Git depolarınızda git status komutunun yavaÅlıÄından Åikayetçiyseniz, yukarıda bahsettiÄimiz iki yapılandırma ayarını uygulamak oldukça basittir ve genellikle çok kısa sürede gözle görülür bir fark yaratır. İÅte adım adım bu ayarları nasıl uygulayacaÄınız ve sonuçları nasıl gözlemleyeceÄiniz:
Mevcut Durumu Kontrol Etme: BaÅlangıç Performansını Ãlçme
Herhangi bir optimizasyona baÅlamadan önce, mevcut performansınızı ölçmek önemlidir. Bu, yapılan deÄiÅikliklerin ne kadar etkili olduÄunu somut verilerle görmenizi saÄlar. Terminalinizde, yavaÅ olduÄunu düÅündüÄünüz büyük Git deposunun kök dizinindeyken aÅaÄıdaki komutu çalıÅtırın:
time git status
Bu komut, git status komutunun çalıÅması için geçen gerçek (real), kullanıcı (user) ve sistem (sys) sürelerini size gösterecektir. Genellikle “real” süresi, komutun tamamlanması için geçen toplam süreyi ifade eder. Bu deÄeri bir yere not alın. ÃrneÄin, baÅlangıçta 17.6 saniye gibi bir süre görebilirsiniz. Bu, bizim referans noktamız olacak.
Yapılandırma Ayarlarını Uygulama
Åimdi sıra, Git’in performansını artıracak sihirli iki ayarı uygulamaya geldi. Bu ayarları genel (global) olarak tüm Git depolarınız için veya sadece belirli bir depo için yerel (local) olarak yapabilirsiniz. Genel olarak uygulamak, bu optimizasyondan tüm projelerinizde faydalanmanızı saÄlar ve genellikle tercih edilen yöntemdir.
AÅaÄıdaki komutları terminalinizde çalıÅtırın:
git config --global core.untrackedCache true
Bu komut, core.untrackedCache özelliÄini etkinleÅtirir. --global bayraÄı, bu ayarın kullanıcı seviyesinde (yani sizin kullanıcı hesabınız için) tüm Git depolarına uygulanmasını saÄlar. Bu ayar, Git’in takip edilmeyen dosyalar için bir önbellek tutmasına olanak tanır, böylece her git status çaÄrısında bu dosyaları yeniden taramak zorunda kalmaz. Ãzellikle node_modules gibi büyük ve sık deÄiÅmeyen dizinlerin olduÄu projelerde büyük fayda saÄlar.
git config --global core.fsmonitor true
Bu komut ise core.fsmonitor özelliÄini etkinleÅtirir. Yine --global bayraÄı ile tüm depolarınıza uygulanır. fsmonitor, iÅletim sisteminin dosya sistemi izleme yeteneklerini kullanarak, Git’in sadece deÄiÅen dosyaları kontrol etmesini saÄlar. Bu, Git’in tüm çalıÅma dizinini taramak yerine, sadece iÅletim sistemi tarafından bildirilen deÄiÅiklikler üzerinde yoÄunlaÅmasına olanak tanır. Bu özellik, özellikle aktif olarak geliÅtirme yapılan ve dosyalarda sık sık deÄiÅiklikler olan depolarda inanılmaz bir hız artıÅı saÄlar.
Bu iki komutu çalıÅtırdıktan sonra, ayarlarınız Git yapılandırmanıza kaydedilmiÅ olacaktır. Bu ayarların etkin olup olmadıÄını kontrol etmek için aÅaÄıdaki komutu kullanabilirsiniz:
git config --global --list | grep "core.untrackedCache\|core.fsmonitor"
Bu komut, yapılandırma dosyanızdaki ilgili girdileri listeleyecektir. EÄer true olarak görünüyorsa, ayarlar baÅarıyla uygulanmıÅtır.
Sonuçları Gözlemleme: Performans Kazancını DoÄrulama
Ayarları uyguladıktan sonra, Åimdi performans kazancını doÄrulamak için tekrar git status komutunu ölçme zamanı. Büyük Git deponuzun kök dizininde tekrar aÅaÄıdaki komutu çalıÅtırın:
time git status
Åimdi elde ettiÄiniz “real” süresini ilk not aldıÄınız deÄerle karÅılaÅtırın. ÃoÄu durumda, baÅlangıçta 17.6 saniye süren bir komutun 0.83 saniyeye düÅtüÄünü veya benzer Åekilde %90’dan fazla bir iyileÅme gördüÄünüzü fark edeceksiniz. Bu, geliÅtirme deneyiminizi kökten deÄiÅtirecek önemli bir kazançtır.
Vaka ÃalıÅması: Bir GeliÅtiricinin Deneyimi
Bir web geliÅtiricisi olan AyÅe, büyük bir Vue.js projesi üzerinde çalıÅıyordu. Proje, birçok bileÅen kütüphanesi ve baÄımlılık içerdiÄi için node_modules klasörü yüz binlerce dosyadan oluÅuyordu. AyÅe, her git pull veya npm install iÅleminden sonra git status komutunun 15-20 saniye sürmesinden muzdaripti. Bu durum, özellikle küçük deÄiÅiklikler yapıp hızlıca durumunu kontrol etmek istediÄinde onu yavaÅlatıyordu. Makalede bahsedilen core.untrackedCache ve core.fsmonitor ayarlarını uyguladıktan sonra, AyÅe’nin git status süresi 1.5 saniyenin altına düÅtü. Bu, AyÅe’nin günlük iÅ akıÅında devrim niteliÄinde bir deÄiÅiklik yarattı. Artık çok daha hızlı geri bildirim alabiliyor, deÄiÅikliklerini daha verimli yönetebiliyor ve genel olarak geliÅtirme sürecinden daha fazla keyif alıyordu. Bu vaka, bu iki basit ayarın bile ne kadar büyük bir etki yaratabileceÄinin somut bir örneÄidir.
Derinlemesine BakıÅ: Bu Ayarlar Git’in İç İÅleyiÅini Nasıl DeÄiÅtiriyor?
Bu ayarların Git’in iç iÅleyiÅini nasıl etkilediÄini anlamak, neden bu kadar etkili olduklarını daha iyi kavramamızı saÄlar. Git, temel olarak bir içerik adreslenebilir dosya sistemi (content-addressable filesystem) olarak çalıÅır. Yani, her dosyanın içeriÄi bir karma (hash) ile temsil edilir ve bu karma, dosyanın benzersiz kimliÄidir. git status komutu, bu karma deÄerlerini ve dosya meta verilerini karÅılaÅtırarak deÄiÅiklikleri tespit eder.
core.untrackedCache etkinleÅtirildiÄinde, Git, .git/index dosyasının içinde veya yanında “untracked cache” adı verilen özel bir bölüm oluÅturur. Bu önbellek, takip edilmeyen dosyaların listesini ve onların meta verilerini (mtime, boyut gibi) tutar. Normalde, Git takip edilmeyen dosyaları bulmak için tüm çalıÅma dizinini gezmek zorundadır. Ancak bu önbellek sayesinde, Git sadece önbelleÄi okuyarak, hangi dosyaların takip edilmediÄini ve bu dosyaların önbelleÄe alındıÄından bu yana deÄiÅip deÄiÅmediÄini hızlıca belirleyebilir. EÄer bir dosya önbellekte yoksa veya meta verileri deÄiÅmiÅse, Git o dosyayı tekrar kontrol eder. Bu, özellikle .gitignore‘da belirtilen ancak yine de diskte yer kaplayan büyük dizinler için (örneÄin node_modules) kritik öneme sahiptir. Git, bu dizinleri her seferinde baÅtan sona taramak yerine, önbellekteki bilgiyi kullanarak çok daha hızlı karar verir.
core.fsmonitor ise, Git’in dosya sistemi deÄiÅikliklerini proaktif olarak izlemesini saÄlar. Bu özellik etkinleÅtirildiÄinde, Git, iÅletim sisteminin yerel dosya sistemi izleme API’ları (Linux’ta inotify, macOS’ta FSEvents, Windows’ta ReadDirectoryChangesW) ile iletiÅim kuran bir yardımcı süreç (helper process) baÅlatır. Bu yardımcı süreç, çalıÅma dizininde gerçekleÅen dosya oluÅturma, deÄiÅtirme veya silme gibi olayları anında yakalar. Bu olaylar, Git’e “deÄiÅen dosyaların bir listesi” olarak iletilir. Böylece, git status komutu çalıÅtırıldıÄında, Git tüm depoyu taramak zorunda kalmaz; yalnızca dosya sistemi izleyicisi tarafından bildirilen dosyaları ve onların ilgili meta verilerini kontrol eder. Bu, özellikle büyük depolarda ve sık sık dosya deÄiÅikliÄi yapılan ortamlarda, dosya sistemi üzerindeki yükü ve CPU kullanımını radikal bir Åekilde azaltır. Bu yardımcı süreç, genellikle .git/info/fsmonitor--daemon gibi bir dosyada veya benzer bir mekanizma ile çalıÅtırılır ve arka planda sessizce izleme yapar.
Bu iki mekanizmanın birleÅimi, Git’in dosya sistemiyle olan etkileÅimini “tembel” (lazy) ve “olay tabanlı” (event-driven) hale getirir. Git artık her Åeyi sürekli olarak sorgulamak yerine, sadece ihtiyaç duyduÄunda veya bir olay tetiklendiÄinde harekete geçer. Bu da, performans kazancının temelini oluÅturur. Bu ayarlar, Git’in dahili dizin (index) yapısını daha verimli kullanmasını saÄlayarak, büyük ölçekli depolarda bile hızlı ve duyarlı bir deneyim sunar.
Performans Optimizasyonu İçin DiÄer İpuçları ve İleri Düzey Teknikler
core.untrackedCache ve core.fsmonitor ayarları Git performansını önemli ölçüde artırsa da, daha da ileri gitmek ve Git deneyiminizi daha da optimize etmek için baÅka teknikler ve ipuçları da bulunmaktadır. Bu ileri düzey stratejiler, özellikle çok büyük veya karmaÅık depolarda çalıÅan geliÅtiriciler için faydalı olabilir.
.gitignoreDosyasını Etkin Kullanmak: Bu, Git performansını artırmak için en temel ama en etkili yöntemlerden biridir. Projenizde derlenmiÅ dosyalar (.class,.o), baÄımlılık dizinleri (node_modules,vendor), log dosyaları, geçici dosyalar, editör ayarları veya hassas bilgiler (API anahtarları) gibi Git tarafından takip edilmemesi gereken her Åeyi.gitignoredosyasına ekleyin. Ne kadar çok gereksiz dosyayı göz ardı ederseniz, Git’in taraması gereken dosya sayısı o kadar azalır ve bu dagit statusgibi komutların daha hızlı çalıÅmasını saÄlar. Büyük birnode_modulesdizinini.gitignore‘a eklemek, tek baÅına bile büyük bir hız artıÅı saÄlayabilir.- Sparse Checkout (Seyrek Checkout): EÄer çok büyük bir monorepo üzerinde çalıÅıyor ancak sadece belirli alt dizinlerdeki dosyalarla ilgileniyorsanız, sparse checkout kullanabilirsiniz. Bu özellik, Git’in çalıÅma dizininize sadece belirli dizinleri veya dosyaları çekmesini saÄlar. Böylece, tüm depoyu diskinize klonlamak zorunda kalmazsınız ve Git’in üzerinde çalıÅması gereken dosya sayısı önemli ölçüde azalır. Bu, özellikle çok büyük kaynak kodlu projelerde veya baÄımsız modüllerin bir arada bulunduÄu monorepolarda geliÅtirici deneyimini hızlandırır.
git config core.sparseCheckout true git sparse-checkout init --cone echo "path/to/my/module/" >> .git/info/sparse-checkout git sparse-checkout reapplyBu komutlar,
path/to/my/module/dizini dıÅındaki tüm dosyaların göz ardı edilmesini saÄlar. - Shallow Clone (SÄ±Ä Klonlama): Yeni bir depoyu klonlarken, tüm commit geçmiÅini indirmek yerine sadece belirli bir derinlikteki commit’leri (örneÄin son 1 commit) indirmek, klonlama süresini ve depo boyutunu büyük ölçüde azaltır. Bu, özellikle CI/CD ortamlarında veya hızlıca bir depoyu test etmek istediÄinizde faydalıdır. Ancak, tam bir geçmiÅe ihtiyacınız olduÄunda bu yöntem uygun deÄildir.
git clone --depth 1 <repo_url> - Git GC (Garbage Collection – Ãöp Toplama): Git, zaman zaman otomatik olarak çöp toplama (garbage collection) iÅlemleri yapar. Bu iÅlem, gereksiz nesneleri siler, gevÅek nesneleri paket dosyalarına sıkıÅtırır ve depo boyutunu optimize eder. EÄer deponuzda çok sayıda eski veya eriÅilemez nesne varsa, manuel olarak
git gckomutunu çalıÅtırmak performansı artırabilir.git gc --prune=now - Donanım Faktörleri: Git’in performansı, kullandıÄınız donanım tarafından da doÄrudan etkilenir. SSD (Katı Hal Sürücü) kullanımı, HDD’lere (Mekanik Disk) göre dosya okuma ve yazma hızlarını katlayarak Git komutlarının daha hızlı çalıÅmasını saÄlar. Yeterli miktarda RAM ve hızlı bir iÅlemci de genel sistem performansını ve dolayısıyla Git iÅlemlerinin hızını olumlu etkiler. Ãzellikle sanal makinelerde veya aÄ paylaÅımlarında çalıÅan Git depolarında performans sorunları daha sık görülebilir; bu durumlarda yerel bir SSD’de çalıÅmak büyük fark yaratır.
- Git Versiyonunu Güncel Tutmak: Git sürekli olarak geliÅtirilmekte ve yeni performans iyileÅtirmeleri eklenmektedir. KullandıÄınız Git sürümünü güncel tutmak, en son optimizasyonlardan ve hata düzeltmelerinden faydalanmanızı saÄlar. Yeni Git sürümleri, dosya sistemi etkileÅimlerini, indeksleme algoritmalarını ve genel performansı iyileÅtiren önemli deÄiÅiklikler içerebilir.
Bu ipuçlarını ve teknikleri bir araya getirerek, Git depolarınızdaki performansı sadece git status için deÄil, genel olarak tüm Git operasyonları için optimize edebilirsiniz. Unutmayın ki her depo ve proje farklıdır, bu nedenle hangi optimizasyonların sizin için en uygun olduÄunu bulmak için deneme yapmak gerekebilir.
Sıkça Sorulan Sorular
Git performans optimizasyonu konusunda akla gelebilecek bazı yaygın sorular ve yanıtları:
Bu ayarlar (core.untrackedCache ve core.fsmonitor) her zaman güvenli midir?
Evet, bu ayarlar genel olarak güvenlidir ve Git’in resmi olarak desteklediÄi özelliklerdir. Bunlar, Git’in dosya sistemiyle etkileÅimini optimize etmek için tasarlanmıÅtır ve temel Git operasyonlarının doÄruluÄunu veya bütünlüÄünü bozmazlar. Nadir durumlarda, özellikle çok eski veya özel dosya sistemlerinde fsmonitor ile uyumluluk sorunları yaÅanabilir, ancak modern iÅletim sistemleri ve dosya sistemlerinde sorunsuz çalıÅması beklenir. Herhangi bir Åüpheniz varsa, önce küçük veya test depolarınızda deneyebilirsiniz.
Performans kazancı her depoda aynı mı olur?
Hayır, performans kazancı deponun boyutuna, dosya sayısına, dizin derinliÄine, .gitignore dosyasının etkinliÄine ve dosya sistemi aktivitesine göre deÄiÅiklik gösterir. Ãzellikle çok sayıda takip edilmeyen dosya (node_modules gibi) ve sık dosya deÄiÅiklikleri olan büyük depolarda en büyük kazançlar elde edilir. Küçük depolarda veya çok az dosya deÄiÅikliÄi olan depolarda, bu ayarların etkisi daha az fark edilebilir olacaktır çünkü zaten performans sorunu yaÅanmıyordur.
Bu ayarları geri nasıl alabilirim?
Bu ayarları geri almak oldukça basittir. İlgili yapılandırma deÄerini false olarak ayarlamanız yeterlidir:
git config --global core.untrackedCache false
git config --global core.fsmonitor false
EÄer bir ayarı tamamen kaldırmak isterseniz, --unset bayraÄını kullanabilirsiniz:
git config --global --unset core.untrackedCache
git config --global --unset core.fsmonitor
Farklı iÅletim sistemlerinde (Windows, macOS, Linux) farklılık gösterir mi?
core.untrackedCache özelliÄi tüm iÅletim sistemlerinde benzer Åekilde çalıÅır. Ancak core.fsmonitor, iÅletim sisteminin yerel dosya sistemi izleme API’larını kullandıÄı için platforma özgü uygulamalara sahiptir. Linux’ta inotify, macOS’ta FSEvents ve Windows’ta ReadDirectoryChangesW gibi mekanizmalar kullanılır. Bu, her iÅletim sisteminde en iyi performansı saÄlamak için Git’in ilgili platforma özel yardımcı süreçleri (helper processes) kullandıÄı anlamına gelir. Genel olarak, modern ve güncel iÅletim sistemlerinde bu özelliÄin sorunsuz çalıÅması beklenir.
Bu ayarlar Git’in diÄer komutlarını da hızlandırır mı?
Evet, bu ayarlar özellikle çalıÅma diziniyle etkileÅimde bulunan ve dosya sistemi taraması gerektiren diÄer Git komutlarının performansını da dolaylı olarak etkileyebilir. ÃrneÄin, git add, git commit (özellikle çok sayıda deÄiÅtirilmiÅ dosya olduÄunda), git diff gibi komutlar da dosya sistemi taramalarına ihtiyaç duyar. untrackedCache ve fsmonitor sayesinde, Git’in dosya sistemi hakkında daha güncel ve önbelleÄe alınmıŠbilgilere sahip olması, bu komutların da daha verimli çalıÅmasına katkıda bulunabilir. Ancak en büyük etkiyi git status üzerinde gösterirler.
Sonuç
Büyük Git depolarında yaÅanan git status yavaÅlıÄı, birçok geliÅtirici için günlük bir çile haline gelebilir. Ancak bu makalede detaylarıyla ele aldıÄımız core.untrackedCache ve core.fsmonitor gibi iki basit yapılandırma ayarı sayesinde, bu sorunu kökten çözmek ve geliÅtirme deneyiminizi önemli ölçüde iyileÅtirmek mümkündür. 17.6 saniye süren bir komutun 0.83 saniyeye düÅmesi, sadece bir örnek deÄil, bu optimizasyonların potansiyelini gösteren somut bir veridir. Bu ayarlar, Git’in dosya sistemiyle olan etkileÅimini akıllıca yöneterek, gereksiz taramaları ve hesaplamaları ortadan kaldırır, böylece daha hızlı ve daha duyarlı bir versiyon kontrol deneyimi sunar.
Bu ayarları uygulamak için sadece birkaç terminal komutu yeterlidir ve elde edeceÄiniz performans kazancı, harcadıÄınız zamana fazlasıyla deÄecektir. Ayrıca, .gitignore dosyasını etkin kullanmak, sparse checkout ve shallow clone gibi diÄer ileri düzey teknikleri de deÄerlendirerek Git performansınızı daha da ileri taÅıyabilirsiniz. Unutmayın ki, verimli bir geliÅtirme ortamı, üretkenliÄin temelidir. Git’inizi optimize ederek, kod yazmaya ve yenilikçi çözümler üretmeye daha fazla zaman ayırabilirsiniz. EÄer büyük bir Git deposunda çalıÅıyorsanız ve henüz bu ayarları denemediyseniz, Åimdi tam zamanı! Kendi depolarınızda bu farkı deneyimleyin ve geliÅtirme akıÅınızdaki hızlanmanın keyfini çıkarın.
#GitPerformans #VersiyonKontrol #YazılımGeliÅtirme #DevOps #GitOptimizasyon
