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