Ось що мені не подобається у git:
Перш за все, я думаю, що розподілена ідея летить перед реальністю. Кожен, хто насправді використовує git, робить це централізовано, навіть Лінус Торвальдс. Якби ядро управлялося розподіленим способом, це означало б, що я фактично не міг завантажити "офіційні" джерела ядра - їх не було б - мені довелося б вирішити, чи хочу я версію Лінуса чи версію Джо, або версія Білла. Це, очевидно, було б смішно, і тому існує офіційне визначення, яке Linus контролює за допомогою централізованого робочого процесу.
Якщо ви визнаєте, що хочете централізоване визначення ваших матеріалів, тоді стає зрозумілим, що роль сервера та клієнта абсолютно різні, тому догма про те, що програмне забезпечення клієнта та сервера має бути однаковим, стає суто обмежувальною. Догма про те , що клієнт і сервер дані повинні бути таким же , стає очевидно смішно, особливо в кодовому , що отримало п'ятнадцять років історії , що ніхто НЕ піклується про , але все б клон.
Те, що ми насправді хочемо зробити зі всіма цими старими речами, засипаємо їх у шафу і забуваємо, що вони там, як і будь-який звичайний VCS. Той факт, що git щодня перетягує все це туди-сюди по мережі, дуже небезпечний, тому що це дратує вас, щоб його обрізати. Ця обрізка передбачає багато нудних рішень, і це може піти не так. Отже, люди, мабуть, зберігатимуть цілу серію знімків з різних моментів історії, але чи не для цього був призначений контроль над джерелами? Ця проблема не існувала, поки хтось не винайшов розподілену модель.
Git активно заохочує людей переписувати історію, і вищесказане, мабуть, одна з причин цього. Кожен звичайний VCS робить переписування історії неможливою для всіх, крім адміністраторів, і переконує, що у адміністраторів немає підстав розглядати її. Виправте мене, якщо я помиляюся, але, наскільки мені відомо, git не надає жодного способу надати звичайним користувачам доступ до запису, але забороняє їм переписувати історію. Це означає, що будь-який розробник із незадоволенням (або який все ще бореться з кривою навчання) може зіткнути всю кодову базу. Як нам затягнути цю? Ну, або ви регулярно створюєте резервні копії всієї історії, тобто ви тримаєте історію в квадраті, або ви забороняєте доступ до записів усім, крім деяких бідних дернів, які отримували б всі різниці по електронній пошті та зливали їх вручну.
Давайте візьмемо приклад добре фінансуваного великого проекту і подивимось, як git працює для них: Android. Одного разу я вирішив пограти з самою системою android. Я дізнався, що мав використовувати купу сценаріїв, що називаються repo, щоб дістатись їх git. Деякі з репо виконуються на клієнті, а деякі - на сервері, але обидва самі по собі ілюструють той факт, що git є неповним у будь-якій якості. Сталося так, що я не міг дістати джерела близько тижня, а потім взагалі відмовився. Мені довелося б отримати справді величезну кількість даних з декількох різних сховищ, але сервер був повністю перевантажений такими людьми, як я. Час очікування репо закінчувався, і він не зміг відновити роботу з того місця, де він закінчився. Якщо git настільки розповсюджуваний, ви могли б подумати, що вони я зробив якусь рівну рівну річ, щоб зняти навантаження на цьому одному сервері. Git можна розповсюджувати, але це не сервер. Git + repo - це сервер, але репо не розповсюджується, тому що це лише спеціальна колекція хаків.
Подібною ілюстрацією неадекватності git є гітоліт (і його предок, який, мабуть, працював не так добре.) Gitolite описує свою роботу як полегшення розгортання git-сервера. Знову ж таки, саме існування цієї речі доводить, що git - це не сервер, не більше, ніж клієнт. Більше того, це ніколи не буде, бо якби воно переросло в будь-яке, воно б зрадило своїм основним принципам.
Навіть якби ти вірив у розподілену річ, git все одно був би хаосом. Наприклад, що таке філія? Вони кажуть, що ви неявно робите гілку кожного разу, коли клонуєте сховище, але це не може бути таким самим, як гілка в одному сховищі. Отже, це принаймні дві різні речі, які називаються філіями. Але потім ви також можете перемотати репо і просто розпочати редагування. Це як другий тип гілок, чи знову щось інше? Можливо, це залежить від того, який тип репо у вас є - о так - мабуть, репо - це не дуже чітка концепція. Є нормальні і голі. Ви не можете натиснути на звичайний, оскільки гола частина може вийти з синхронізації з деревом джерела. Але не можна cvsimport до голого, тому що вони не думали про це. Отже, вам потрібно cvsimport до нормального, клонувати це до оголеного, який вдарили розробники, і cvsexport - до робочої копії cvs, яку ще потрібно перевірити на cvs. Кому можна заважати? Звідки взялися всі ці ускладнення? З самої розподіленої ідеї. Зрештою я кинув гітоліт, тому що він накладав на мене ще більше цих обмежень.
Git каже, що розгалуження має бути легким, але багато компаній вже мають серйозну проблему неправдивих філій, тому я б подумав, що розгалуження має бути важливим рішенням із суворим контролем. Тут виконавці дійсно сяють ...
У perforce вам рідко потрібні гілки, оскільки ви можете дуже гнучко жонглювати наборами змін. Наприклад, звичайний робочий процес полягає в тому, що ви синхронізуєтесь з останньою відомою доброю версією на головній лінії, а потім пишете свою функцію. Щоразу, коли ви намагаєтесь змінити файл, різниця цього файлу додається до "набору змін за замовчуванням". Коли ви намагаєтеся перевірити набір змін, він автоматично намагається об'єднати новини з основної лінії у ваш набір змін (ефективно перебазуючи їх), а потім фіксує. Цей робочий процес застосовується, навіть якщо вам не потрібно його розуміти. Таким чином, Mainline збирає історію змін, які ви зможете легко вибирати пізніше. Наприклад, припустимо, ви хочете повернути старий, скажімо, той, що був попереднім. Ви синхронізуєтесь із моментом до зміни, що позначається, позначте файли, що зазнали впливу, як частину набору змін, синхронізувати з моментом після і об’єднати з "завжди моїм". (Там було щось дуже цікаве: синхронізація не означає мати те саме - якщо файл можна редагувати (тобто в активному наборі змін), він не буде заблокований синхронізацією, але позначений як належний для вирішення.) Тепер у вас є список змін, який скасовує правопорушник. Об’єднайте наступні новини, і у вас буде список змін, який ви зможете прокласти поверх основної лінії, щоб отримати бажаний ефект. Жодного разу ми не переписували жодної історії. Об’єднайте наступні новини, і у вас буде список змін, який ви зможете прокласти поверх основної лінії, щоб отримати бажаний ефект. Жодного разу ми не переписували жодної історії. Об’єднайте наступні новини, і у вас буде список змін, який ви зможете прокласти поверх основної лінії, щоб отримати бажаний ефект. Жодного разу ми не переписували жодної історії.
Тепер, припустимо, що на половині цього процесу хтось підбігає до вас і каже вам кинути все і виправити якусь помилку. Ви просто надаєте списку змін за замовчуванням ім'я (фактично число), а потім "призупиняєте" його, виправляєте помилку в пустому списку змін за замовчуванням, фіксуєте його та поновлюєте названий список змін. Типово, що одночасно призупиняється кілька списків змін, коли ви пробуєте різні речі. Це просто та приватно. Ви отримуєте те, що ви дійсно хочете від режиму відділення, без спокуси зволікати чи куряти від злиття на основну лінію.
Я припускаю, що теоретично було б можливо зробити щось подібне в git, але git робить практично все можливе, а не затверджувати схвалений робочий процес. Централізована модель - це сукупність дійсних спрощень щодо розподіленої моделі, яка є недійсним узагальненням. Він настільки узагальнений, що в основному очікує від вас, що ви реалізуєте контроль над джерелом поверх нього, як це робить репо.
Інша справа - реплікація. У git все можливо, тому вам доведеться розібратися в цьому самі. Працюючи, ви отримуєте ефективно кеш-пам’ять без громадянства. Єдина конфігурація, яку йому потрібно знати, - це де знаходиться ведучий, і клієнти можуть на свій розсуд вказувати на головний або кеш. Це п’ятихвилинна робота, і вона не може піти не так.
У вас також є тригери та настроювані форми для затвердження оглядів коду, посилань на bugzilla тощо, і звичайно, у вас є гілки, коли вони вам дійсно потрібні. Це не чітко, але це близько, і його просто встановити та обслуговувати.
Загалом, я думаю, що якщо ви знаєте, що будете працювати централізовано, як це роблять усі, ви можете скористатися інструментом, розробленим з урахуванням цього. Git переоцінений через жахливу дотепність Лінуса разом зі схильністю людей йти один за одним навколо, як вівці, але його основний сенс існування насправді не витримує здорового глузду, і, слідуючи йому, git пов'язує власні руки з дві величезні догми про те, що (а) програмне забезпечення та (б) дані повинні бути однаковими як для клієнта, так і для сервера, і це завжди буде ускладнювати та кульгати при централізованій роботі.