Страницы

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

четверг, 1 ноября 2018 г.

Какие основные задачи bare репозитория?

Насколько я понял, 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

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

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