Библиотека сайта rus-linux.net
Git
Глава 6 из книги "Архитектура приложений с открытым исходным кодом", том 2.
Оригинал: Git
Автор: Susan Potter
Перевод: А.Панин
6.5. Репозиторий, данные индексирования и рабочие области
Давайте приступим к непосредственному углубленному исследованию Git на примере локального репозитория для понимания всего лишь нескольких фундаментальных концепций.
$ mkdir testgit $ cd testgit $ git init
Теперь в нашем распоряжении пустой, но инициализированный Git-репозиторий, расположенный в директории testgit. Мы можем создавать ветви, добавлять данные, создавать тэги и даже обмениваться данными с другими локальными или удаленными репозиториями Git. Возможен даже обмен данными с репозиториями других типов систем контроля версий при условии использования небольшого набора специальных команд приложения git.
git init создает поддиректорию .git в директории testgit. Давайте рассмотрим ее содержимое:
tree .git/
.git/
|-- HEAD
|-- config
|-- description
|-- hooks
| |-- applypatch-msg.sample
| |-- commit-msg.sample
| |-- post-commit.sample
| |-- post-receive.sample
| |-- post-update.sample
| |-- pre-applypatch.sample
| |-- pre-commit.sample
| |-- pre-rebase.sample
| |-- prepare-commit-msg.sample
| |-- update.sample
|-- info
| |-- exclude
|-- objects
| |-- info
| |-- pack
|-- refs
|-- heads
|-- tags
.git по умолчанию является поддиректорией корневой рабочей директории testgit. Она содержит несколько различных типов файлов и директорий:
- Файлы конфигурации (Configuration): файлы
.git/config,.git/descriptionи.git/info/excludeучаствуют в процессе конфигурации локального репозитория. - Директория сценариев (Hooks): директория
.git/hooksсодержит сценарии, которые могут выполняться в моменты наступления определенных событий в рамках жизненного цикла репозитория. - Файл рабочего пространства (Staging Area): файл
.git/index(которого пока нет в нашем листинге, представленном выше) будет содержать описание рабочего пространства, соответствующего нашей рабочей директории. - База данных объектов (Object Database): директория
.git/objectsявляется стандартной базой данных объектов системы Git, которая содержит все данные или указатели на локальные данные. Все объекты являются неизменяемыми с момента создания. - Директория ссылок (References): директория
.git/refsявляется стандартным местом для хранения указателей, ссылающихся и на локальные, и на удаленные ветви, а также ветви с тэгами и рабочие ветви. Ссылка является указателем на объект, обычно типаtagилиcommit. Управление ссылками осуществляется вне базы данных объектов для возможности изменения ссылок в процессе развития репозитория. В особых случаях ссылки могут указывать на другие ссылки, причем примером такого случая является ветвьHEAD.
Директория .git на самом деле является репозиторием. Директория, в которой хранится набор рабочих файлов, является рабочей директорией (working directory), которая обычно является родительской для директории .git (или для репозитория). В том случае, если бы вы создавали удаленный репозиторий Git, в котором не было рабочей директории, вам пришлось бы инициализировать его с помощью команды git init --bare. Эта команда позволила бы просто создать директорию репозитория непосредственно в корневой директории вместо создания репозитория в форме поддиректории рабочей директории с файлами.
Другим очень важным файлом является файл индексирования Git (Git Index): .git/index. Он позволяет создать временное рабочее пространство между локальной рабочей директорией и локальным репозиторием. Индексирование подразумевает хранение данных специфичных изменений в одном файле (или в большем количестве файлов), предназначенных для последующего применения. Даже в том случае, если вы вносите изменения, относящиеся к разным типам функций, эти изменения могут быть внесены в исходный код в рамках единственной операции, сопровождающейся подробным пояснением, позволяющим логически разделить их. Для выборочного сохранения определенных изменений в файле или наборе файлов вы можете использовать команду git add -p.
Данные изменений Git по умолчанию хранятся в единственном файле, расположенном в директории репозитория. Пути к этим трем пространствам хранения данных в рамках дерева директорий могут задаваться с помощью переменных окружения.
git checkout [ветвь]
Эта команда приведет к переводу ссылки HEAD-ветви с локального репозитория на текущую ветвь (т.е.refs/heads/master), заполнению файла индексирования данными для выбранной ветви и обновлению содержимого рабочей директории для соответствия данным выбранной ветви.git add [файлы]
Эта команда приведет к созданию перекрестных ссылок с использованием контрольных сумм между файлами, описанными в файле индексирования для того, чтобы установить необходимость обновления файла индексирования для измененных файлов в соответствии с версией рабочей директории. В директории Git (или репозитории) ничего не изменится.
.git (или репозитории).
$ GIT_DIR=$PWD/.git $ cat $GIT_DIR/HEAD ref: refs/heads/master $ MY_CURRENT_BRANCH=$(cat .git/HEAD | sed 's/ref: //g') $ cat $GIT_DIR/$MY_CURRENT_BRANCH cat: .git/refs/heads/master: No such file or directory
Мы столкнулись с ошибкой из-за того, что перед добавлением любых данных в репозиторий Git не задается никаких ветвей кроме стандартной для Git ветви с именем master, причем самой ветви может и не существовать.
$ git commit -m "Initial empty commit" --allow-empty $ git branch * master $ cat $GIT_DIR/$MY_CURRENT_BRANCH 3bce5b130b17b7ce2f98d17b2998e32b1bc29d68 $ git cat-file -p $(cat $GIT_DIR/$MY_CURRENT_BRANCH)
Здесь мы наблюдаем представление данных в рамках базы данных объектов Git.
Следующий раздел: База данных объектов
