bare-репозиторій - це не якийсь особливий тип сховища. це, власне, і є репозиторій.
командою git init --bare в поточному каталозі створюється саме репозиторій:
а ось командою git init (без опції --bare) репозиторій створюється в каталозі .git:
що дозволяє використовувати поточний каталог як робочий каталог (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.