Страницы

Поиск по вопросам

пятница, 5 октября 2018 г.

Для чего нужен флаг bare

Для чего нужен флаг --bare при клонировании/создании репозитория?
Что он даёт при переносе репозитория?


Ответ

совсем короткая формулировка
вот вам надо, допустим, скопировать архив с одного сервера на другой, и вам дают инструкцию:
скопируйте архив с сервера1 на локальную машину распакуйте архив скопируйте архив на сервер2
а зачем, спрашивается, здесь нужен пункт 2, про распаковку архива??? не нужен. вот и при копировании хранилища аналогичная ситуация — а зачем извлекать из хранилища содержимое рабочего каталога? не нужно. для этого и пригодится опция --bare
более обстоятельный ответ
начать надо, пожалуй, с иллюстрации того, что, собственно, представляет собой git-хранилище (часто используется термин «git-репозиторий»).
вот оно, свежесозданное хранилище, не отслеживающее (пока) ни одного файла, но уже содержащее 9 каталогов и 13 файлов (в разных версиях и сборках программы git конкретные цифры могут, конечно, слегка отличаться), необходимый минимум, который позволит программе git начать отслеживание файлов вашего проекта (ну, почти необходимый — без файлов с примерами из каталога hooks можно было бы и обойтись):
$ tree -F . ├── branches/ ├── config* ├── description ├── HEAD ├── hooks/ │   ├── applypatch-msg.sample* │   ├── commit-msg.sample* │   ├── post-update.sample* │   ├── pre-applypatch.sample* │   ├── pre-commit.sample* │   ├── prepare-commit-msg.sample* │   ├── pre-push.sample* │   ├── pre-rebase.sample* │   └── update.sample* ├── info/ │   └── exclude ├── objects/ │   ├── info/ │   └── pack/ └── refs/ ├── heads/ └── tags/
9 directories, 13 files
эти файлы и каталоги появятся в текущем (изначально пустом) каталоге после выполнения команды:
$ git init --bare
а если опустить опцию --bare, все они будут «спрятаны под капотом» — программа git создаст их не в текущем каталоге, а в подкаталоге .git (точка в начале имени служит для того, чтобы в unix-подобной операционной системе этот подкаталог по умолчанию не показывался при получении листинга каталога).
«спрятаны» они будут не только «для эстетики» и не только потому, что эти «внутренние потроха» для «обычного» пользователя программы git представляют мало интереса. основная цель — «освободить» текущий каталог под собственно файлы (и каталоги) вашего проекта. в этом случае он (текущий каталог) будет выполнять функции рабочего каталога (working tree в оригинальной документации, другой нередко встречающийся перевод — рабочая копия).

если при хранилище имеется рабочий каталог, то такое хранилище называют «не-bare-хранилищем», или «хранилищем с рабочим каталогом», а чаще, для краткости — просто «хранилищем». а если рабочего каталога нет, то такое хранилище называют «bare-хранилищем» (дословно — «голым»).

а какая польза от такого «bare-хранилища»? какой практический смысл в нём? что с ним можно сделать?
ну, с точки зрения «конечного» пользователя (чаще всего — программиста) пользы, действительно, мало, ведь не видно же файлов/каталогов проекта. а вот с точки зрения программы git — это полноценное хранилище, которое можно клонировать, делать из него pull-ы, а в него — push-ы. именно в таком виде (без рабочего каталога) располагаются хранилища на таких серверах, как github.com, bitbucket.org и тому подобных. программа git легко может извлечь и отобразить любую информацию из такого хранилища: историю коммитов, листинг файлов проекта, содержимое любого из файлов проекта в том состоянии, как он выглядел после любого из коммитов, и так далее и тому подобное.

опцию --bare можно использовать и вместе с командой clone: в этом случае в текущем (или указанном) каталоге будет сначала создан «костяк» хранилища (состоящий из вышеперечисленного набора 13-ти файлов и 9-ти каталогов), который будет наполнен информацией из клонируемого хранилища (в основном это коснётся каталога objects — именно в нём хранятся git-объекты: коммиты, деревья и блобы).
а вот если выполнять команду clone без этой опции, то, во-первых, хранилище будет помещено в подкаталог .git, а не непосредственно в текущий каталог, а во-вторых, после наполнения хранилища будут дополнительно извлечены в текущий каталог все файлы и каталоги проекта.

стоит ещё отметить, что признак хранилища — «bare/не-bare» — хранится в файле config внутри хранилища в виде строчки bare=true или bare=false в секции [core]

ах, да, совсем забыл:
Что он (подразумевается опция --bare) даёт при переносе репозитория?
из вышеизложенного, надеюсь, стало понятно, что эта опция в случае переноса хранилища с одного сервера на другой позволяет не делать ненужную (в данном случае) работу: сэкономить такты процессора (на извлечение файлов/каталогов проекта), сэкономить ресурс винчестера на излишних операциях чтения/записи, сберечь немного электроэнергии, и, в конечном счёте, отдалить тепловую смерть вселенной. это же реальная цель существования человечества, верно?

Комментариев нет:

Отправить комментарий