it-swarm.dev

Sürüm denetimi ne zaman çok büyük?

Birkaç yerde "Büyük taahhütte bulunma" duydum ama aslında "büyük" bir taahhüt ne olduğunu anlamadım. İlgili olsa bile bir grup dosya üzerinde çalışıyorsanız büyük mü? Bir projenin kaç parçası üzerinde aynı anda çalışmalısınız?

Bana göre, "küçük taahhütler" yapmaya çalışırken sorun yaşıyorum çünkü başka bir şey yaratan başka bir şey yaratan bir şeyi unutuyorum ya da yaratıyorum. Sonra böyle şeyler ile sonuçlanır:

 Özel giden kuyruğu yaptı 
 
 Bot 
 - Yeni alan msgQueue, bir SingleThreadExecutor 
 - mesaj gönderilinceye kadar sendMsg bloklarından başka bir şey değildir ve mesajlar 
 gönderilen 
 - adminExist çağrıları güncellendiğinde (denetleyiciye bakın) 
 - Mesaj 
 
 Denetleyici 
 -Yeni alan msgWait mesajlar arasında bekleme süresini belirtir 
 - Hizmet eklentilerinin başlatılması reloadPlugins'e taşındı 
 - adminExists, Global yöneticiler nedeniyle Sunucudan taşındı. Kanal, 
 Sunucu ve global düzeyde kontroller 
 
 Admin 
 - Admin 
 'In uygun nesnesini alan yeni getServer ve getChannel yöntemleri 
 
 BotEvent 
 - toString () ayrıca şovun ekstra ve ekstra1 
 
 Kanal 
 - kanal alanı yeniden adlandırıldı 
 int) kanalındaki sabit yazım hatası 
 
 Sunucu 
 - adminExists, Denetleyici 
 
 PluginExecutor 
 - Küçük testlere taşındı eklendi, daha sonra kaldırılacak 
 
 JS Eklentileri 
 - Çerçeve değişikliklerine güncellendi 
 - InstanceTracker.getController (), Controller.instance 
 ile değiştirildi - VLC şimdi kendi dosyasında konuşuyor 
 
 Çeşitli NB proje güncellemeleri ve değişiklikleri 
 
 --- 
 
 Etkilenen dosyalar 
 /Trunk/Quackbot-Core/dist/Quackbot-Core.jar[.____. DeğiştirModify /trunk/Quackbot-Core/dist/README.TXT[.____.ülürModify /trunk/Quackbot-Core/nbproject/private/private.properties[.____. Remodify/trunk/Quackbot-Core/nbproject/p rivate/private.xml 
 /trunk/Quackbot-Core/src/Quackbot/Bot.Java[.____. DeğiştirModify /trunk/Quackbot-Core/src/Quackbot/Controller.Java
 /Trunk/Quackbot-Core/src/Quackbot/PluginExecutor.Java[.____. DeğiştirModify /trunk/Quackbot-Core/src/Quackbot/info/Admin.Java[.____. src/Quackbot/info/BotEvent.Java 
 /trunk/Quackbot-Core/src/Quackbot/info/Channel.Java[.____. Değiştir /trunk/Quackbot-Core/src/Quackbot/info/Sunucu.Java 
 /Trunk/Quackbot-GUI/dist/Quackbot-GUI.jar[.____. DeğiştirModify /trunk/Quackbot-GUI/dist/README.TXT[.____. CialisModify/trunk/Quackbot-GUI/dist/lib/Quackbot-Core.jar 
 /Trunk/Quackbot-GUI/nbproject/private/private.properties[.____. DeğiştirModify/trunk/Quackbot-GUI/nbproject/private/private.xml 
 /trunk/Quackbot-GUI/src/Quackbot/GUI.Java[.____. DeğiştirModify /trunk/Quackbot-GUI/src/Quackbot/log/ControlAppender.Java
 /Trunk/Quackbot-GUI/src/Quackbot/log/WriteOutput.Java[.____. Sil/DeğiştirModify/t runk/Quackbot-Impl/dist/Quackbot-Impl.jar 
 /trunk/Quackbot-Impl/dist/README.TXT[.____. DeğiştirModify/trunk/Quackbot-Impl/dist/lib/Quackbot- Core.jar 
 /Trunk/Quackbot-Impl/dist/lib/Quackbot-GUI.jar[.____. DeğiştirModify /trunk/Quackbot-Impl/dist/lib/Quackbot-Plugins.jar
 /Trunk/Quackbot-Impl/lib/javarebel.stats[.____. Değiştirin /trunk/Quackbot-Impl/lib/jrebel.info[.____. DeğiştirModify/trunk/Quackbot-Impl/nbproject/private/private.properties 
 /trunk/Quackbot-Impl/nbproject/private/private.xml[.____. DeğiştirModify /trunk/Quackbot-Impl/nbproject/project.properties[.____. CialisModify/trunk/Quackbot-Impl/eklentileri/CMD'ler/Yönetici/reload.js 
 /Trunk/Quackbot-Impl/plugins/CMDs/Operator/hostBan[.____. ekleyinModify/trunk/Quackbot-Impl/plugins/CMDs/Operatör/mute.js 
 /Trunk/Quackbot-Impl/plugins/CMDs/lyokofreak/curPlaying.js[.____. DeğiştirModify /trunk/Quackbot-Impl/plugins/CMDs/lyokofreak/lfautomode.js 
 Değiştir /trunk/Quackbot-Impl/plugins/listeners/onJoin.js[._ ___.] /Trunk/Quackbot-Impl/plugins/listeners/onQuit.js[.____. DeğiştirModify /trunk/Quackbot-Impl/plugins/testCase.js[.____. GenişletilmişAdd/trunk/Quackbot-Impl/plugins /utils/whatsPlaying.js[.____. CialisModify /trunk/Quackbot-Impl/src/Quackbot/impl/SandBox.Java[.____. MixedAdd /trunk/Quackbot-Impl/vlc_http[.____. /Quackbot-Impl/vlc_http/current.html[.____. CialisModify /trunk/Quackbot-Plugins/dist/Quackbot-Plugins.jar[.____. CialisModify /trunk/Quackbot-Plugins/dist/README.TXT 
 /Trunk/Quackbot-Plugins/dist/lib/Quackbot-Core.jar[.____. Değiştir/değiştir /trunk/Quackbot-Plugins/nbproject/private/private.properties[.____. -Plugins/nbproject/private/private.xml 
 /Trunk/Quackbot-Plugins/src/Quackbot/plugins/JSPlugin.Java[.____. Değiştir /trunk/Quackbot-Plugins/src/Quackbot/plugins/JSPlugin.Java[.____. Remix /trunk/Quackbot-Plugins/vlc_http
 /Trunk/global-lib/jrebel.jar
 Ekleyin

Evet ....

Sorular için:

  • Bir taahhüt çok büyük olduğunda (--- (açık olmayan şeyler) bazı faktörler nelerdir?
  • Bu tür taahhütleri nasıl önleyebilirsiniz? Lütfen ayrıntı verin
  • İşler hızlı bir şekilde ilerlerken yarı erken gelişim aşamalarınız ne zaman olur? Devasa taahhütler hala iyi mi?
67
TheLQ

Bana göre, "küçük taahhütler" yapmaya çalışırken sorun yaşıyorum çünkü başka bir şey yaratan başka bir şey yaratan bir şeyi unutuyorum ya da yaratıyorum.

Bu bir problem. Çalışmanızı daha küçük, daha yönetilebilir parçalara bölmek için öğrenmeniz gerekir.

Büyük taahhütlerle ilgili sorun:

  • Çok kişili bir projede, taahhütlerinizin diğer geliştiricilerin çözmesi için çatışmalara neden olma olasılığı artar.
  • Günlük iletilerinde neler yapıldığını doğru olarak tanımlamak daha zordur.
  • Değişikliklerin yapıldığı sırayı izlemek ve böylece problemlerin nedenini anlamak daha zordur.
  • Çok fazla taahhüt edilmemiş işi kaybetme olasılığını arttırır.

Bazen büyük taahhütler kaçınılmazdır; Örneğin. büyük bir API'yi değiştirmeniz gerekiyorsa. Ama normalde durum böyle değil. Ve kendinizi bu durumda bulursanız, muhtemelen bir şube oluşturmak ve orada çalışmanızı yapmak için iyi bir fikirdir ... çok sayıda küçük taahhütle ... ve bitirdiğinizde yeniden bütünleşin.

(Başka bir durum, ilk içe aktarma işlemidir, ancak bu, yukarıda listelenen sorunlar açısından sorunlu DEĞİLDİR.)

68
Stephen C

Tek Sorumluluk İlkesi.

Her kaynak kontrol taahhüdü sadece bir amaca hizmet etmelidir. Özetinize "ve" veya "ayrıca" kelimesini koymanız gerekiyorsa, onu bölmeniz gerekir.

Çalışma kopyanızda birçok ayrı ilgisiz veya yarı ilişkili değişiklikle sonuçlanmak çok yaygındır. Buna "karışık çalışma kopyası sorunu" denir ve disiplinli geliştiriciler için bile kaçınmak çok zordur. Bununla birlikte, Git ve Mercurial size bunu çözmek için araçlar sunar - git add -p veya yığın seçimi ve TortoiseHg'deki Mercurial Kuyrukları .

40
jammycakes

Müşterinin belirli bir değişiklik yapmasını istediğini düşünün; örneğin, "her ne olursa olsun" tarihinden sonraki iki gün içinde bir şeyin veya başka bir şeyin yapılamayacağına dair bir kural eklemek için. Sonra, değişikliği yaptıktan sonra, fikirlerini değiştirirler. Taahhüdünüzü geri almak isteyeceksiniz. Eğer ilgisiz raporların sıralama düzenini değiştirmekle ilgili bazı şeylerle doluysa, hayatınız bir sefalettir.

Bir iş öğesi, bir değişiklik kümesi. İstemciden bir istek, bir değişiklik kümesi. Fikrinizi değiştirebileceğiniz bir şey, bir değişiklik kümesi. Bazen bu tek bir kod satırı anlamına gelir. Bazen veritabanı şeması da dahil olmak üzere on farklı dosyadır. Bu iyi.

26
Kate Gregory

Büyük taahhütler, hepsi aynı kovaya girmeyen tonlarca değişiklik olduğunda. Denetleyici mantığını değiştirirsem, veritabanı bağlantısı modelini, sonra da bazı misc. senaryoları, hepsini tek bir taahhüt altında toplamamalıyım.

Önleme tamamladığınız şeye göre taahhütte bulunmaktır. Yukarıdaki örnekte, denetleyici mantığından sonra, veritabanı çalışmasından sonra ve komut dosyalarından sonra çalışacağım. Taahhüt etmeyi bırakmayın çünkü siz neyin değiştiğini biliyorsunuz. Diğer insanlar "Değişen şeyler" günlük mesajına bakacak ve ne içtiğinizi merak edecektir.

İlk ithalat muhtemelen sahip olmanız gereken en büyük taahhütlerdir. Sıfırdan bir sistem mi kuruyorsunuz? Tabii birkaç büyük taahhüt var. Dengeledikten sonra, işleri düzenli tutmanın zamanı geldi.

10
Josh K

Önceden büyük bir kod yığını üzerinde çalışacağınızı biliyorsanız, kodunuzun senkronize kalmasını sağlamak için düzenli olarak kodu ana hattan aşağı çekerken belirli özelliğiniz için bir şube oluşturmanızı öneririm. Şube üzerinde çalışmayı bitirdiğinizde, tüm değişikliklerinizi ana hatta geri alın. Bu şekilde, diğer ekip üyeleri büyük bir taahhüt gördüklerinde şaşırmayacak ve/veya rahatsız olmayacaklardır. Ayrıca, şeyleri kırma şansı daha azdır. İşleri daha küçük taahhütlere ayırmak için pratik yapmaya devam edin. Zamanla ikinci doğa olacak.

7
ysolik

Bu örnek çok büyük bir taahhüdü göstermektedir.

Genel bir kural olarak, bir cümle veya bir metin satırındaki değişikliği açıklayın. (Bu kurala dayanarak, taahhüt 10-15 daha küçük olanlara bölünmelidir.) Bir satırdaki bir taahhüdü yeterince yorumlayamazsanız, zaten çok büyüktür.

Daha küçük taahhütler uygulamak için, not defterinizde (veya Not Defteri'nde) önceden değiştirdiğiniz veya eklediğiniz şeyleri not edin. Uzun bir liste haline gelmeden önce veya not defterinde zaten olanla ilişkili olmayan bir kod değişikliği yapmadan önce işlem yapın.

7
azheglov

Alanımda (fizik modelleme), bugün çıktıda 6 ay önce depoda olmayan bir hata keşfediyorum. Bu olduğunda, revizyonlar üzerinde ikili bir arama yapacağım:

  1. Modeli 3 ay önce çalıştır
  2. Hata hala çıktıdaysa, modeli 4,5 ay önce çalıştırın
  3. ... kötü çıktı veren taahhüdü bulana kadar tekrarlayın

Hata korkunç bir işin içine girdiğinde, sorunun kaynağını bulmak için ince dişli bir tarakla oturmam gerekiyor. Taahhüt az sayıda dosyaya dokunursa, sorunu ortaya çıkaran kod satırlarını izlemek daha az acı verir.

Sorununuzu bir dizi küçük göreve ayırmanızı tavsiye ederim (her görevi bir hata izleyiciye koymak). Her görevi tamamlarken bir taahhütte bulunun (ve hata izleyicinizdeki o hata/özelliği kapatın).

6
Pete

Gerçekten önemli olan taahhüdün büyüklüğü değil, taahhütlerinizin nasıl organize edildiğini belirlemesi gereken değişikliğin kapsamı.

Örneğin, __macro1 ila __macro2 200 dosya değiştiren büyük bir kod tabanında. Bu durumda 200 taahhüt aklı başında olamaz.

Sonuç olarak, depoyu herhangi bir revizyonda çekebilme ve oluşturma işine sahip olabilmektir. libfoo yerine libbar olarak değiştirdiniz mi? Değişikliğin yapı komut dosyalarınızı ve Makefiles'lerinizi (veya uygulanabilir olanı) güncellemeyi içerdiğini umuyorum.

Bazen, bir şeyi başaran bir dizi deneysel değişiklik yapmanız gerekebilir, bu durumda daha sonra geri dönmeniz gerekirse hangi kapsamın sizin için daha önemli olduğunu belirlemeniz gerekir. Biri diğerine bağlı mı? Hepsini bir kerede tek bir revizyonda taahhüt edin. Aksi halde, bu durumda, değişiklik başına bir taahhüt öneririm. Yine de başka bir dalda ya da başka bir repoda böyle bir şey yapıyor olmalısınız.

Evet olsa da, tek bir dosyayı önceki bir revizyona (böylece bir dosyayı daha büyük bir taahhütten destekleyerek) geri döndürme gücüne sahipsiniz, böylece bunu daha sonra yolda biseksiyon gibi araçları batırır ve geçmişi kirletir.

"Tamam, testler geçer, sanırım bu işe yarar .. ama kötü giderse kolayca geri alabilir miyim?" .. sonunda makul taahhütlerde bulunacaksınız.

5
Tim Post

Burada kavranması gereken şey, bu bağlamda "Büyük" ün taahhütlerin fiziksel boyutu değil (genellikle ikisi el ele gidecek olsa da) sayıdaki belirgin değişikliklerle ilgilidir.

küçük taahhütlerde bulunduğu gibi "büyük taahhütlerde bulunma" meselesi o kadar da küçük değildir - kendi kendine küçük değişiklikler yapmak için idealdir.

Değişiklik günlüğünden ayrı olarak (ve güvenle) işlenmiş olabilecek bir dizi şeyiniz olduğu açıktır ve bu nedenle çok büyük olduğu oldukça açıktır.

Bunun bir sorun olabilmesinin nedeni, son taahhüdünüzün şu anda yaptığınız değişiklikler için referans noktanız olması ve örneğin, ilk biti doğru alıp bir sonraki biti yanlış hale getirmenin kolay bir yolu olmamasıdır. çalışmanızı hata yapmaya başladığınız noktaya geri döndürmek (BTDTGTTS).

Tabii ki bazen değişiklikler sadece büyüktür - büyük ölçekli yeniden düzenleme - ve başkaları tarafından önerildiği gibi bu, dallanmanız gereken yerdir, bu şekilde bireysel taahhütleriniz, ana geliştirme gövdesinden ayrılan şeyleri zaman zaman kırsa da, sorun ve erken ve sık taahhüt etmeye devam.

Bir şey daha - eğer işinizin ortasında daha fazla dikkat gerektiren bir şey ortaya çıkarsa, ayrı olarak (ideal olarak tamamen farklı bir klasör kümesinde) değiştirmeniz ve ayrı olarak işlemeniz gerekir.

Tüm bunlar için asıl zorluk, mekaniğin zihniyeti değil - bir taahhüt, her seferinde yaptığınız bir yedek kopya değil, aynı zamanda her bir taahhüdün yol boyunca bir inç çakıl olduğunu ve birçok şeyde yanlış bir şey olmadığını ve bir mafya taahhüdünde farklı şeyleri bir araya getirmenin, bir kod yığınında bir munging belirsizliği ile ilgili işlevsellik parçalarını bir araya getirmesi kadar kötüdür.

4
Murph

En azından, kendinize ne zaman düşündüğünüzü taahhüt etmek için kendinizi eğitin "Şimdiye kadarki ilerlememi seviyorum ve yapmak üzere olduğum değişiklikler bir felaketse kaybetmek istemiyorum." Daha sonra, denediğiniz herhangi bir çıkmazı veya bir sorunu izlemek için eklediğiniz özel hata ayıklama kodunu uçurmak için VCS'den yararlanma seçeneğiniz vardır. (örneğin git reset --hard veya rm -rf *; svn update)

4
Ken Bloom

Zor ve hızlı bir kural yok, taahhüdünüzün çok büyük olduğu bir bölme çizgisi yok.

Ancak is ancak, daha küçük taahhütlerin daha iyi olduğu konusunda bir rehber vardır, yani (her satırı taahhüt etmek aşırı aşırıdır).

Bu tür yönergeleri aklımda tutuyorum:

  • Tek bir işlem yalnızca bir hata düzeltmesi için değişiklikler içermelidir
  • Tek bir taahhüt yarım günden fazla çalışma içermemelidir
  • Tek bir taahhüt yapıyı bozmamalıdır

Tabii ki - bunlar aklımda tuttuğum şeyler - YMMV. Farklı geliştiriciler, farklı ayrıntı düzeylerini destekler.

2
Bevan

Taahhüt ne kadar küçük olursa, potansiyel bir gerilemenin tam olarak nereden geldiğini bulmak o kadar kolay olacaktır.

İdeal olarak, bir taahhüt, kod tabanındaki en küçük tutarlı değişiklik anlamında (bir hata, özellik vb. İle ilgili) atom olmalıdır.

Taahhüt boyutunu küçük tutmak için özel ipuçlarına gelince, VCS'nize ve nasıl kurulduğuna büyük ölçüde bağlıdır: yerel olarak taahhütte bulunabilmeniz veya sunucudaki kendi şubenizde çalışabilmeniz gerekir.

Anahtar, her atomik değişiklik yaptığınızda "özel" dalınıza bağlı kalmaktır ve daha sonra şubenizi düzenli olarak, örneğin her hafta birleştirebilirsiniz.

Bir dvcs kullanarak iş akışınız şöyle görünebilir:

code code code
git commit       // create commit locally with meaningful message
code code code
git commit       // create commit locally with meaningful message
code code code
git commit       // create commit locally with meaningful message
...
git Push         // Push your previous commits to the team server

Merkezi bir vcs kullanma:

svn copy trunk my_feature_branch  // create your private branch
svn co my_private_branch          //
code code code
svn commit                        // commit on your private branch with meaningful comment
code code code
svn commit                        // commit on your private branch with meaningful comment
code code code
svn commit                        // commit on your private branch with meaningful comment
...
svn merge my_feature_branch trunk  // all your previous commit are merged to main/master branch
1
Xavier T.

Benim durumumda, sunucu sistemine (SVN) bir sunucunun dosyalarını taahhüt etmeye çalışıyorum. Bu ilk taahhüt ve gerçekten büyük bir proje (birkaç GB) olduğu gibi indirmek istemiyorum ve ben istemciler sunucu kapalı ilk taahhüt yapmak istiyorum.

Sorun, istemcinin paylaşılan bir sunucuda olması, svn istemcisinin bir dakikadan fazla çalışması durumunda öldürülür (veya başka bir yazılım).

Bir alternatif, projeyi bilgisayarıma indirmek ve oradan ilk taahhüdü yapmak olabilir, ancak SVN'de büyük taahhüdü daha fazla işlem yöntemlerine benzetmek için bir seçenek olup olmadığını bilmek istiyorum.

Önümdeki geliştirici asla bir sürüm kontrol sistemi kullanmadı.

0
CGeorges

Sorularınızı cevaplamak için:

1) Benim için standart taahhüt birden fazla şey yapıyorsa büyük kabul edilir. Aslında bir hatayı düzeltmek veya bir özellik eklemek demek.

2) Bir şeyi bitirdiğinizde bir alışkanlık ve bir kural haline getirerek bu tür taahhütleri önleyin.

3) Gelişimin yarı-erken aşamalarında, taahhütlerin daha sonra kullanılacak dosyaların ilk oluşturulmasını içermesine izin veriyorum.

Bitirdiğimde, tanımlayabileceğiniz tüm hataların düzeltildiğini ve yapıyı taahhüt ederek kırmayacağınızı belirtmek isterim.

Evet, bu çok sayıda işlem gerçekleştirir, ancak değişikliklerden yalnızca birinin bir soruna neden olduğu aynı zamanda taahhüt edilen büyük bir değişiklik serisini geri almak zorunda kalmadan, tam olarak neyin kırıldığını tam olarak geri almanıza izin verir.

Mercurial ve Git gibi dağıtılmış sürüm kontrol sistemleri (DVCS) için kuralların biraz değiştiğini de belirtmek isterim. Bunlardan birini kullanmanız durumunda, bir değişiklik yaptığınızda taahhütte bulunuyorsunuz, ancak henüz test etmediniz ve daha sonra çalışırken merkezi depoya aktarıyorsunuz. Yapıyı bozma konusunda endişelenmeden kodunuzda daha fazla değişiklik yapmanıza izin verdiği için bu tercih edilir.

0
indyK1ng

Muhtemelen mükemmelliğin daha fazla bir şey alamayacağınız zaman olduğunu duymuşsunuzdur. Bu ayrıca taahhüt boyutu için standardınızı da tanımlamalıdır.

Bu "mükemmel" boyutun nerede olduğu projenize bağlıdır. Harici müşterilere gönderiyorsanız, iyi bir boyut, bir sonrakini zamanında bitirmediyseniz rahat nakliye yapacağınız en küçük artış olabilir. Dahili, sık konuşlandırılan uygulamalar oluşturuyorsanız, en iyi boyut, hiçbir şeyi bozmayan (ve sizi istediğiniz yere yaklaştıran) en küçük artış olabilir.

Modern sürüm kontrol sistemleri, kolay dallanma, etkileşimli yeniden bastırma, aşamalandırma alanı vb.İle iyi taahhütler oluşturmanıza yardımcı olur.

0
Peter Eisentraut

İşlem iletileri yalnızca bir satır olmalıdır (ve git max 60 karakter için). Taahhüt edilen kod miktarı, açıklayıcı mesajı bu sınır dahilinde tutacak kadar küçük olmalıdır.

Ben her zaman taahhüt eğilimi (daha da şimdi şimdi git gittik) bir parça var, çünkü "neden" şeylerin bu şekilde yapıldığını yakalamak için izin verir.

0
user1249

Bazen bütün gün birkaç farklı mantıksal olarak farklı chagnes üzerinde çalışıyorsunuz ve kodunuzu arada tutmayı unutuyorsunuz. git citool kullanmak, çalışırken gün boyunca çok dikkatli olmasanız bile, çalışmanızı günün sonunda Nice ısırık büyüklüğünde parçalara ayırmak için çok yararlı olabilir.

git citool, bir dosyanın hangi belirli parçalarının (veya hangi belirli satırların) belirli bir taahhüde yükleneceğini seçmenize izin verebilir, böylece aynı dosyada yapılan değişiklikleri (çakışmayan) çeşitli işlemlere ayırabilirsiniz.

(Subversion kullandığınız anlaşılıyor. Subversion için bunu yapan bir araç bilmiyorum, ancak git için Subversion adaptörü olan git-svn, hayatınızı değiştirecek olanı kullanabilirsiniz.)

0
Ken Bloom

Taahhüt ne kadar büyük olursa, yapıyı kırma ve ekibinizin geri kalanı tarafından ödeme alma olasılığınız o kadar yüksek olur. Taahhüt değişikliklerini günde iki kez deniyorum. Öğle yemeğinden hemen önce ve eve gitmeden önce. Yani 12:00 ve 16:30 her şeyi çalışmaya ve çalışmaya hazır olsun denemek. Bu uygulamanın benim için işe yaradığını görüyorum.

0
Nickz