Насколько я понял, bare репозиторий создается как буфер между основной копией на сервере и ветками разработки.
Но не до конца понимаю, читая статью «удачная модель ветвления», зачем нужен этот тип репозитория, если все должно работать и так.
Ответ
bare-репозиторий — это не какой-то особый тип репозитория. это, собственно, и есть репозиторий
командой git init --bare в текущем каталоге создаётся именно репозиторий:
$ git init --bare
$ ls -F
branches/ config* description HEAD hooks/ info/ objects/ refs/
а вот командой git init (без опции --bare) репозиторий создаётся в каталоге .git
$ git init
$ ls -F .git
branches/ config* description HEAD hooks/ info/ objects/ refs/
что позволяет использовать текущий каталог как рабочий каталог (working dir) с извлечёнными из репозитория файлами/каталогами, версии которых и отслеживаются этим самым репозиторием (вообще рабочий каталог может находиться в совершенно ином месте и указываться программе git с помощью опций -C или --work-tree или их комбинации (эти опции не эквивалентны), или переменной окружения GIT_WORK_TREE, или конфигурационной переменной core.worktree).
«превратить» bare в не-bare (и обратно) очень легко: достаточно изменить значение (true или false) переменной bare в секции [core] файла config. вручную или командой git config core.bare значение. т.е., фактически, это некий признак, на практике означающий, что «рядом есть рабочий каталог с отслеживаемыми файлами».
зачем нужен этот признак?
чтобы при попытке «запушить» в текущую ветку (ту, на которую указывает содержимое файла HEAD) «репозитория с рабочим каталогом» (не-bare-репозиторий) пользователь получал ошибку и подробное объяснение:
remote: error: refusing to update checked out branch: refs/heads/master
remote: error: By default, updating the current branch in a non-bare repository
remote: error: is denied, because it will make the index and work tree inconsistent
remote: error: with what you pushed, and will require 'git reset --hard' to match
remote: error: the work tree to HEAD.
remote: error:
remote: error: You can set 'receive.denyCurrentBranch' configuration variable to
remote: error: 'ignore' or 'warn' in the remote repository to allow pushing into
remote: error: its current branch; however, this is not recommended unless yo
remote: error: arranged to update its work tree to match what you pushed in some
remote: error: other way.
remote: error:
remote: error: To squelch this message and still keep the default behaviour, set
remote: error: 'receive.denyCurrentBranch' configuration variable to 'refuse'
мой вольный перевод:
отказано в обновлении ветки refs/heads/master, из которой извлечены файлы в рабочий каталог.
по умолчанию обновление текущей ветки в не-bare-репозитории запрещено, потому что это приведёт к несоответствию между тем, что вы «пушите», и индексом и содержимым рабочего каталога, и потребует выполнения git reset --hard для приведения рабочего каталога в соответствие с текущей веткой, т.е. той, которая указана в файле HEAD.
вы можете установить значение конфигурационной переменной receive.denyCurrentBranch удалённого репозитория в значение ignore или warn для разрешения «пушить» в его текущую ветку; тем не менее этого не рекомендуется делать, если только вы не настроили (автоматическое) обновление рабочего каталога каким-либо иным путём.
вы можете отключить выдачу этого сообщения, не меняя умолчального поведения, установив переменной receive.denyCurrentBranch значение refuse
Комментариев нет:
Отправить комментарий