Git

Git (вим. "гіт" [1]) - розподілена система керування версіями файлів. Проект був створений Лінус Торвальдс для управління розробкою ядра Linux, перша версія випущена 7 квітня 2005. На сьогоднішній день підтримується Джун Хама.

Прикладами проектів, що використовують Git, є ядро Linux, Android, Drupal, Cairo, GNU Core Utilities, Mesa, Wine, Chromium, Compiz Fusion, FlightGear, jQuery, PHP, NASM, MediaWiki і деякі дистрибутиви Linux (див. нижче).

Програма є вільною та випущена під ліцензією GNU GPL версії 2.


1. Можливості

Система спроектована як набір програм, спеціально розроблених з урахуванням їх використання в скриптах. Це дозволяє зручно створювати спеціалізовані системи контролю версій на базі Git або користувальницькі інтерфейси. Наприклад, Cogito є саме таким прикладом фронтенда до репозиторіїв Git, а StGit використовує Git для управління колекцією патчів.

Git підтримує швидке розділення і злиття версій, включає інструменти для візуалізації і навігації по нелінійної історії розробки. Як і Darcs, BitKeeper, Mercurial, Bazaar та Monotone, Git надає кожному розробнику локальну копію всієї історії розробки, зміни копіюються з одного сховища в інший.

Віддалений доступ до репозиторіїв Git забезпечується git-daemon, SSH - або HTTP -сервером. TCP-сервіс git-daemon входить в дистрибутив Git і є разом з SSH найбільш поширеним і надійним методом доступу. Метод доступу по HTTP, незважаючи на ряд обмежень, дуже популярний в контрольованих мережах, тому що дозволяє використовувати існуючі конфігурації мережевих фільтрів.


2. Особливості реалізації

Ядро Git являє собою набір утиліт командного рядка з параметрами. Всі налаштування зберігаються в текстових файлах конфігурації. Така реалізація робить Git легко портіруемим на будь-яку платформу і дає можливість легко інтегрувати Git в інші системи (зокрема, створювати графічні git-клієнти з будь-яким бажаним інтерфейсом).

Репозиторій Git являє собою каталог файлової системи, в якому знаходяться файли конфігурації репозиторію, файли журналів, що зберігають операції, що виконуються над репозиторієм, індекс, що описує розташування файлів і сховище, що містить власне файли. Структура сховища файлів не відображає реальну структуру зберігається в репозиторії файлового дерева, вона орієнтована на підвищення швидкості виконання операцій з репозиторієм. Коли ядро ​​обробляє команду зміни (неважливо, при локальних змінах або при отриманні патча від іншого вузла), воно створює в сховище нові файли, що відповідають новим станам змінених файлів. Істотно, що ніякі операції не змінюють вмісту вже існуючих в сховище файлів.

За замовчуванням репозиторій зберігається в підкаталозі з назвою ". Git" в кореневому каталозі робочої копії дерева файлів, що зберігається в репозиторії. Будь файлове дерево в системі можна перетворити в репозиторій git, віддавши команду створення сховища з кореневого каталогу цього дерева (або вказавши кореневий каталог в параметрах програми). Репозиторій може бути імпортований з іншого вузла, доступного по мережі. При імпорті нового репозиторію автоматично створюється робоча копія, відповідна останньому зафіксованому станом імпортованого репозиторію (тобто не копіюються зміни в робочій копії вихідного вузла, для яких на тому вузлі не була виконана команда commit).


3. Переваги та недоліки

Переваги та недоліки git у порівнянні з централізованими системами керування версіями (такими як, наприклад, Subversion) типові для будь розподіленої системи і описані в статті " Система керування версіями ". Якщо ж порівнювати git з" спорідненими "їй розподіленими системами, можна відзначити, що git спочатку ідеологічно орієнтований на роботу зі змінами, а не з файлами," одиницею обробки "для нього є набір змін, або патч. Ця особливість простежується як у структурі самої системи (зокрема - в структурі репозиторію), так і в принципах побудови команд; вона відбивається на продуктивності системи в різних варіантах її використання і на перевагах та недоліках git в порівнянні з іншими DVCS.

Часто звані переваги git перед іншими DVCS:

  • Висока продуктивність.
  • Розвинені засоби інтеграції з іншими VCS, зокрема, з CVS, SVN та Mercurial. Крім різноспрямованих конвертерів репозиторіїв, наявні в комплекті програмні засоби дозволяють розробникам використовувати git при розміщенні центрального репозиторія в SVN або CVS, крім того, git може імітувати cvs-сервер, забезпечуючи роботу через клієнтські додатки і підтримку в середовищах розробки, спеціально не підтримують git.
  • Продумана система команд, що дозволяє зручно вбудовувати git в скрипти.
  • Якісний веб-інтерфейс "з коробки".
  • Репозиторії git можуть поширюватися і оновлюватися загальносистемними файловими утилітами архівації та поновлення, такими як rsync, завдяки тому, що фіксації змін і синхронізації не змінюють існуючі файли з даними, а тільки додають нові (за винятком деяких службових файлів, які можуть бути автоматично оновлені за допомогою наявних у складі системи утиліт). Для роздачі репозиторію по мережі достатньо будь-якого веб-сервера.

У числі недоліків git зазвичай називають:

  • Відсутність переносимої на інші операційні системи підтримки шляхів в кодуванні Unicode в Microsoft Windows. Якщо шлях містить символи, відмінні від ANSI, то їх підтримка з командного рядка вимагає специфічних настройок, які не гарантують правильного відображення файлових імен при користуванні тим же репозиторієм з інших ОС. Одним із способів вирішення проблеми для git 1.7 є використання спеціально пропатченних консольного клієнта. Інший варіант - використання графічних утиліт, що працюють безпосередньо через API, таких як TortoiseGit.
  • Деяка незручність для користувачів, які переходять з інших VCS. Команди git, орієнтовані на набори змін, а не на файли, можуть викликати подив у користувачів, які звикли до файл-орієнтованим VCS, таким як SVN. Наприклад, команда "add", яка в більшості систем керування версіями виробляє додавання файлу до проекту, в git підготовляє до фіксації зроблені у файлах зміни. При цьому зберігається не патч, що описує зміни, а нова версія цільового файлу.
  • Використання для ідентифікації ревізій хешей SHA1, що призводить до необхідності оперувати довгими рядками замість коротких номерів версій, як у багатьох інших системах (хоча в командах допускається використання неповних хеш-рядків).
  • Великі накладні витрати при роботі з проектами, в яких робляться численні незв'язані між собою зміни файлів. При роботі в такому режимі розміри наборів змін стають досить великі і відбувається швидке зростання обсягу репозиторіїв.
  • Великі витрати часу, у порівнянні з файл-орієнтованими системами, на формування історії конкретного файлу, історії правок конкретного користувача, пошуку змін, що відносяться до заданого місця певного файлу.
  • Відсутність окремої команди перейменування / перенесення файлу, яка відображалася б в історії як відповідне єдине дію. Існуючий скрипт git mv фактично виконує перейменування, копіювання файлу і видалення його на старому місці, що вимагає спеціального аналізу для визначення, що насправді файл був просто перенесений (цей аналіз виконується автоматично командами перегляду історії).
  • Система працює тільки з файлами і їх вмістом, і не відстежує порожні каталоги.
  • Деякі команди працюють несподівано, зокрема, можуть призводити до неочевидним помилок або вимагати для правильної роботи вказівки спеціальних параметрів, коли застосовуються до початково пустому репозиторию або до сховища, в якому ще не було зроблено жодного комміта.

У ряді публікацій, що відносяться переважно до 2005-2008 років можна зустріти також нарікання щодо документації git, відсутність зручної windows-версії і зручних графічних клієнтів. В даний час ця критика неактуальна: існує версія git на основі MinGW ("рідна" збірка під Windows), і кілька високоякісних графічних клієнтів для різних операційних систем, зокрема, під Windows є клієнт TortoiseGit, ідеологічно дуже близький до поширеній TortoiseSVN - клієнтові SVN, вбудовується в оболонку Windows.


4. Графічні інтерфейси

  • SmartGit - багатоплатформовий інтерфейс для Git на Java.
  • gitk - проста і швидка програма, написана на Tcl / Tk, поширюється з самим Git.
  • QGit, інтерфейс якого написаний з використанням Qt, багато в чому схожий з gitk, але дещо відрізняється набором можливостей. В даний час існують реалізації на Qt3 і Qt4.
  • Giggle - варіант на Gtk +.
  • gitg - ще один інтерфейс для gtk + / GNOME
  • Git Extensions - багатоплатформовий варіант на . NET.
  • TortoiseGit - інтерфейс, реалізований як розширення для провідника Windows.
  • Git-cola - багатоплатформовий інтерфейс на Python.
  • GitX - оболонка для Mac OS X з інтерфейсом Cocoa, інтерфейс схожий з gitk.
  • Gitti - оболонка для Mac OS X з інтерфейсом Cocoa.
  • Gitbox - оболонка для Mac OS X з інтерфейсом Cocoa.
  • Github -клієнт

4.1. Фронтенді для веб

  • gerrit - програмне забезпечення з веб-інтерфейсом для організації спільної інспекції коду.
  • gitweb - написаний на Perl (Kay Sievers). Більшість наведених нижче великих публічних git-репозитаріїв його і застосовує.
  • wit - написаний на Python (Christian Meder, проект не підтримується)
  • gitarella - Ruby (Diego Petten)
  • git-php - PHP (Zack Bartel, проект не підтримується, мається допрацьована копія на гітхабе)
  • cgit - написаний на C (Lars Hjemli)
  • cogito - фронтенд з командами спроектовані для користувачів звиклих до CVS і SVN (Petr Baudis) - застаріла і з осені 2006 більше не розвивається, що робить неможливим її використання з новими версіями git
  • StGit - написана на Python система управління колекцією патчів (Catalin Marinas)
  • ViewGit - написаний на PHP. Під ліцензією GNU AGPLv3.
  • GitList - написаний на PHP. Активно розвивається.

5. Обмін змінами з іншими системами контролю версій

  • CVS - імпорт і експорт, емуляція CVS-сервера, в стандартному постачанні
  • Subversion - імпорт і експорт (частково), в стандартному постачанні
  • . Tar.gz,. Tar.bz2 (серії версіонірованих файлів) - імпорт і експорт, в стандартному постачанні

6. Проекти, що використовують Git

Git застосовується в багатьох проектах; можна відзначити як апстриму (Англ.) , Так і дистрибутиви Linux:


Примітки

  1. git - dictionary.reference.com / browse / git? qsrc = 2446