İşte git hakkında sevmediğim şeyler:
Öncelikle, dağıtılan fikrin gerçekliğe aykırı olduğunu düşünüyorum. Aslında git kullanan herkes, Linus Torvalds bile bunu merkezi bir şekilde yapıyor. Çekirdek dağıtılmış bir şekilde yönetildiyse, bu aslında "resmi" çekirdek kaynaklarını indiremeyeceğim anlamına gelirdi - bir tane olmazdı - Linus'un sürümünü mü yoksa Joe'nun sürümünü mü istediğime karar vermem gerekirdi. veya Bill'in versiyonu. Bu açıkça saçma olurdu ve bu yüzden Linus'un merkezi bir iş akışı kullanarak kontrol ettiği resmi bir tanım var.
Malzemelerinizin merkezi bir tanımını istediğinizi kabul ederseniz, sunucu ve istemci rollerinin tamamen farklı olduğu anlaşılır, bu nedenle istemci ve sunucu yazılımlarının aynı olması gerektiği dogması tamamen sınırlayıcı hale gelir. İstemci ve sunucu verilerinin aynı olması gerektiği dogması , özellikle kimsenin umursamadığı ancak herkesin klonlamak zorunda kalacağı on beş yıllık bir kod tabanında açıkça saçma hale geliyor.
Tüm bu eski şeylerle aslında yapmak istediğimiz şey, onu bir dolaba tıkmak ve orada olduğunu unutmaktır, tıpkı normal VCS'nin yaptığı gibi. Git'in her şeyi ağ üzerinden her gün ileri geri taşıması çok tehlikelidir, çünkü onu budamak için sizi rahatsız eder. Bu budama, birçok sıkıcı karar gerektirir ve ters gidebilir. Yani insanlar muhtemelen tarihin çeşitli noktalarından bir dizi anlık görüntü deposu tutacaklar, ancak ilk başta kaynak kontrolü bunun için miydi? Bu sorun, birisi dağıtılmış modeli icat edene kadar mevcut değildi.
Git, insanları tarihi yeniden yazmaya aktif olarak teşvik ediyor ve yukarıdakiler muhtemelen bunun bir nedenidir. Her normal VCS, geçmişi yeniden yazmayı yöneticiler dışında herkes için imkansız hale getirir ve yöneticilerin bunu düşünmek için hiçbir nedeni olmadığından emin olur. Yanılıyorsam düzelt ama bildiğim kadarıyla git normal kullanıcılara yazma erişimi vermenin hiçbir yolunu sağlamıyor, ancak geçmişi yeniden yazmalarını yasaklıyor. Bu, kin besleyen (veya hala öğrenme eğrisiyle mücadele eden) herhangi bir geliştiricinin tüm kod tabanını çöpe atabileceği anlamına gelir. Bunu nasıl sıkılaştırırız? Peki, ya tüm geçmişin düzenli yedeklerini yaparsınız, yani geçmişin karesini alırsınız ya da tüm farkları e-posta ile alıp elle birleştirecek bazı zavallı çocuklar dışında hepsine yazma erişimini yasaklarsınız.
İyi finanse edilen büyük bir proje örneğini ele alalım ve git'in onlar için nasıl çalıştığını görelim: Android. Bir keresinde android sisteminin kendisiyle oynamaya karar verdim. Gitlerine ulaşmak için repo adlı bir dizi komut dosyası kullanmam gerektiğini öğrendim. Depoların bir kısmı istemcide ve bazıları sunucuda çalışır, ancak her ikisi de, varlıkları gereği git'in her iki kapasitede de eksik olduğunu göstermektedir. Bir hafta kadar kaynakları alamadım ve sonra tamamen pes ettim. Birkaç farklı depodan gerçekten büyük miktarda veri çekmem gerekirdi, ancak sunucu benim gibi insanlarla tamamen aşırı yüklenmişti. Repo zaman aşımına uğradı ve zaman aşımına uğradığı yerden devam edemedi. Git bu kadar dağıtılabilirse, onların o tek sunucudaki yükü hafifletmek için bir tür eşler arası şey yaptım. Git dağıtılabilir, ancak bir sunucu değil. Git + repo bir sunucudur, ancak repo dağıtılamaz çünkü bu sadece geçici bir hack koleksiyonu.
Git'in yetersizliğinin benzer bir örneği gitolittir (ve görünüşe göre pek iyi çalışmayan atası). Gitolite işini git sunucusunun dağıtımını kolaylaştırmak olarak tanımlıyor. Yine, bu şeyin varlığı, git'in bir istemci olduğu kadar bir sunucu olmadığını da kanıtlıyor. Dahası, asla olmayacak, çünkü eğer ikisinden biri haline gelirse, kurucu ilkelerine ihanet etmiş olur.
Dağıtılmış şeye inanmış olsanız bile, git yine de bir karmaşa olurdu. Mesela şube nedir? Bir depoyu her klonladığınızda örtük olarak bir dal oluşturduğunuzu söylerler, ancak bu tek bir depodaki bir dal ile aynı şey olamaz. Yani dallar olarak adlandırılan en az iki farklı şey var. Ancak daha sonra bir depoda geri sarabilir ve düzenlemeye başlayabilirsiniz. Bu ikinci tür dal gibi mi, yoksa yine farklı bir şey mi? Belki de ne tür bir repoya sahip olduğunuza bağlıdır - oh evet - görünüşe göre repo da çok net bir kavram değil. Normal ve çıplak olanlar var. Normal bir parçayı zorlayamazsınız çünkü çıplak kısım kaynak ağacıyla senkronize olmayabilir. Ama bunu düşünmedikleri için çıplak bir tanesine aktaramazsınız. Bu yüzden normal bir tane cvsimport yapmalısınız, bunu, geliştiricilerin vurduğu çıplak bir dosyaya kopyalayın ve bunu, hala cvs'de kontrol edilmesi gereken bir cvs çalışan kopyasına aktarın. Kimler rahatsız olabilir? Tüm bu komplikasyonlar nereden geldi? Dağıtılmış fikrin kendisinden. Sonunda gitolitten kurtuldum çünkü bana bu kısıtlamalardan daha fazlasını dayatıyordu.
Git, dallanmanın hafif olması gerektiğini söylüyor, ancak birçok şirketin halihazırda ciddi bir sahtekar şube sorunu var, bu nedenle dallara ayırmanın katı polislik ile önemli bir karar olması gerektiğini düşünmüştüm. Performansın gerçekten parladığı yer burası ...
Perforce olarak nadiren dallara ihtiyaç duyarsınız çünkü değişiklik setlerini çok çevik bir şekilde halledebilirsiniz. Örneğin, olağan iş akışı, ana hat üzerinde bilinen en son iyi sürümle senkronize etmeniz ve ardından özelliğinizi yazmanızdır. Bir dosyayı değiştirmeye çalıştığınızda, o dosyanın farkı "varsayılan değişiklik kümenize" eklenir. Değişiklik kümesini kontrol etmeye çalıştığınızda, otomatik olarak ana hattaki haberleri değişiklik kümenizle birleştirmeye çalışır (etkili bir şekilde yeniden oluşturur) ve sonra taahhüt eder. Bu iş akışı, anlamanıza bile gerek kalmadan uygulanır. Böylece Mainline, daha sonra kolayca seçebileceğiniz bir değişiklik geçmişi toplar. Örneğin, eskisini, örneğin öncekinden öncekini geri döndürmek istediğinizi varsayalım. Sorun teşkil eden değişiklikten önceki ana senkronize edersiniz, etkilenen dosyaları değişiklik kümesinin bir parçası olarak işaretlersiniz, sonraki ana senkronize edin ve "her zaman benim" ile birleştirin. (Orada çok ilginç bir şey vardı: senkronizasyon aynı şeye sahip olmak anlamına gelmez - eğer bir dosya düzenlenebilirse (yani aktif bir değişiklik kümesindeyse), senkronizasyon tarafından engellenmez, ancak çözülme tarihi olarak işaretlenir.) suçlu olanı geri alan bir değişiklik listesi. Sonraki haberlerde birleşin ve istediğiniz etkiyi elde etmek için ana hattın tepesine yerleştirebileceğiniz bir değişiklik listeniz var. Hiçbir noktada tarihi yeniden yazmadık. Sonraki haberlerde birleşin ve istediğiniz etkiyi elde etmek için ana hattın tepesine yerleştirebileceğiniz bir değişiklik listeniz var. Hiçbir noktada tarihi yeniden yazmadık. Sonraki haberlerde birleşin ve istediğiniz etkiyi elde etmek için ana hattın tepesine yerleştirebileceğiniz bir değişiklik listeniz var. Hiçbir noktada tarihi yeniden yazmadık.
Şimdi, bu sürecin yarısını varsayarsak, birisi size koşar ve her şeyi bırakıp bazı hataları düzeltmenizi söyler. Varsayılan değişiklik listenize bir ad verin (aslında bir sayı), sonra onu "askıya alın", şimdi boş olan varsayılan değişiklik listesindeki hatayı düzeltin, uygulayın ve adlandırılmış değişiklik listesini devam ettirin. Farklı şeyler denediğiniz bir anda birkaç değişiklik listesinin askıya alınması tipik bir durumdur. Kolay ve özeldir. Şube rejiminden gerçekten istediğinizi, erteleme ya da ana hatta birleşmekten vazgeçme cazibesi olmadan elde edersiniz.
Sanırım git'te benzer bir şey yapmak teorik olarak mümkün olabilir, ancak git, onayladığımız bir iş akışını öne sürmek yerine pratik olarak her şeyi mümkün kılıyor. Merkezi model, geçersiz bir genelleme olan dağıtılmış modele göre bir dizi geçerli basitleştirmedir. O kadar genelleştirilmiş ki, temelde sizden repo gibi, bunun üzerine kaynak kontrolü uygulamanızı bekliyor.
Diğer şey ise çoğaltma. Git'te her şey mümkündür, bu yüzden kendiniz çözmelisiniz. Perforce olarak, etkin bir durum bilgisiz önbellek elde edersiniz. Bilmesi gereken tek yapılandırma, ana birimin nerede olduğudur ve istemciler kendi takdirlerine göre ana veya önbelleği işaret edebilir. Bu beş dakikalık bir iş ve yanlış gidemez.
Ayrıca kod incelemelerini, bugzilla referanslarını vb. İleri sürmek için tetikleyiciler ve özelleştirilebilir formlarınız var ve elbette gerçekten ihtiyaç duyduğunuz zamanlar için şubeleriniz var. Anlaşılır değil, ancak yakın ve kurulumu ve bakımı son derece kolay.
Sonuç olarak, herkesin yaptığı gibi merkezi bir şekilde çalışacağınızı biliyorsanız, bunun için tasarlanmış bir araç da kullanabilirsiniz. Git, Linus'un korkunç zekasıyla birlikte insanların koyun gibi birbirlerini takip etme eğilimi nedeniyle abartılıyor, ancak asıl varoluş nedeni aslında sağduyuya dayanmıyor ve onu takip ederek git, kendi elleriyle (a) yazılım ve (b) verilerin hem istemcide hem de sunucuda aynı olması gerektiğine dair iki büyük dogma ve bu her zaman merkezi işte karmaşık ve sakat hale getirecek.