Для чего нужен флаг --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) даёт при переносе репозитория?
из вышеизложенного, надеюсь, стало понятно, что эта опция в случае переноса хранилища с одного сервера на другой позволяет не делать ненужную (в данном случае) работу: сэкономить такты процессора (на извлечение файлов/каталогов проекта), сэкономить ресурс винчестера на излишних операциях чтения/записи, сберечь немного электроэнергии, и, в конечном счёте, отдалить тепловую смерть вселенной. это же реальная цель существования человечества, верно?
Комментариев нет:
Отправить комментарий