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