Git
Chapters ▾ 2nd Edition

10.1 Git на ниско ниво - Plumbing и Porcelain команди

Може да сте стигнали до тази глава прескачайки директно от много по-ранна такава, а може и да сте изчели последователно всичко до тук — и в двата случая стигаме до мястото, в което ще разгледаме как работят вътрешните механизми на Git. Като автори на книгата сме на мнение, че информацията в следващите секции е фундаментално важна, ако искате да оцените изцяло колко полезен и мощен инструмент е Git. От друга страна обаче стоят опасенията, че тази информация може да е смущаваща и ненужно сложна за начинаещите. По тази причина решихме, че е добре главата да е последна в книгата и оставяме на читателя да прецени кога да я прочете.

След като сме стигнали дотук, нека започнем. Първо, да припомним отново, че Git фундаментално представлява вид файлова система, позволяваща адресиране на съдържание, с VCS интерфейс написан върху нея. Ще научим повече за това след малко.

В ранните версии на Git (преди версия 1.5), потребителският интерфейс беше значително по-сложен, понеже ударението беше върху функционалностите на файловата система, вместо върху една по-полиранa VCS. В последните няколко години потребителският интерфейс претърпя значителни подобрения, сега е много изчистен и лесен за ползване, въпреки че старите стереотипни схващания за ранните трудни и сложни за овладяване UI версии, все още витаят наоколо.

Content-addressable filesystem слоят на Git е изключително впечатляващ аспект от системата, така че ще започнем с него, а след това ще разгледаме транспортните механизми и възможностите за поддръжка на хранилищата, с които евентуално бихте имали нужда да работите.

Plumbing и Porcelain команди

В книгата дотук използвахме около 30 на брой подкоманди на Git като checkout, branch, remote, и т.н. Но понеже Git отначало беше само набор от инструменти за контрол на версиите, вместо пълнофункционална user-friendly VCS, тя разполага с много подкоманди, които вършат работата на ниско ниво и са проектирани да се използват взаимно в UNIX-стил или да бъдат извиквани от скриптове. Тези команди от по-ниско ниво в Git се наричат “plumbing” команди, докато по-потребителски ориентираните са получили наименованието “porcelain” команди.

Както виждате, в деветте глави дотук, работихме почти само с porcelain командите. В тази глава обаче, акцентът ще е върху plumbing командите, които дават достъп до вътрешните Git механизми и демонстрират как и защо Git се справя със задачите си. Много от тези команди не са предназначени за ръчно използване от командния ред, вместо това те са подходящи за градивни елементи в множество странични инструменти и специфични скриптове.

Изпълнявайки git init в дадена директория, Git създава поддиректорията .git, която пази почти всичко, което системата съхранява и манипулира. Ако искате да архивирате или клонирате вашето хранилище, то копирането на тази единична директория ви дава почти всичко необходимо за целта. Цялата тази глава от книгата се занимава със съдържанието на въпросната директория. Ето как изглежда една току що инициализирана .git директория:

$ ls -F1
config
description
HEAD
hooks/
info/
objects/
refs/

В зависимост от версията на Git, може да видите и допълнителни неща тук, но в общи линии това е прясно git init хранилище. Файлът description се използва само от програмата GitWeb, не ни засяга в момента. Файлът config пази конфигурационните опции за конкретния проект, а директорията info съдържа глобалния exclude файл за игнориране на пътища, които не искате да вмъквате в .gitignore файл. Директорията hooks съхранява клиентските и сървърни hook скриптове, на които обърнахме внимание в Git Hooks.

Остават четири важни елемента: HEAD и (все още липсващите) index файлове и директориите objects и refs. Именно тези елементи са в ядрото на Git. Директорията objects пази цялото съдържание на вашата база данни, директорията refs съхранява указатели в къмит обекти в тези данни (клонове, тагове, remotes и др.). Файлът HEAD сочи към клона, съдържанието на който текущо е извлечено в работната директория, а файлът index е мястото, където Git пази информацията от индексната област. Сега ще разгледаме всеки от тези елементи в детайли.