Какая -практическая разница между хранилищем Bare и Non-Bare?

Я читал о репозиториях bare и non-bare/default в Git. Я не смог хорошо понять (теоретически) о различиях между ними и почему я должен "толкнуть" в голый репозиторий. Здесь сделка:

В настоящее время я единственный, кто работает над проектом на трех разных компьютерах, но в нем будет больше людей, поэтому я использую Git для управления версиями. Я клонирую голой репо на всех компьютерах, и когда я заканчиваю свои модификации на одном из них, я фиксирую и нажимаю изменения на голый репо. Из того, что я читал, у открытого репозитория нет "рабочего дерева", поэтому, если я клонирую голое репо, у меня не будет "рабочего дерева".

Я предполагаю, что рабочее дерево сохраняет информацию о фиксации, ветки и т.д. из проекта. Это не появилось бы в голом репо. Поэтому мне кажется, что лучше "подтолкнуть" коммиты к репо рабочим деревом.

Затем почему я должен использовать голый репозиторий, а почему бы и нет? Какая практическая разница? Это не выгодно для большего количества людей, работающих над проектом, я полагаю.

Каковы ваши методы для такого рода работ? Предложения?

Ответ 1

Еще одно различие между пустым и не пустым хранилищем заключается в том, что в пустом хранилище нет удаленного исходного хранилища по умолчанию:

~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
~/Projects$ cd bare
~/Projects/bare$ git branch -a
* master
~/Projects/bare$ cd ..
~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
~/Projects$ cd non-bare
~/Projects/non-bare$ git branch -a
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

На странице руководства для git clone --bare:

Кроме того, заголовки веток на удаленном устройстве копируются непосредственно в соответствующие локальные заголовки ветвей, без сопоставления их с refs/remotes/origin/. При использовании этой опции не создаются ни ветки удаленного отслеживания, ни связанные переменные конфигурации.

Предположительно, когда он создает пустой репозиторий, Git предполагает, что пустой репозиторий будет служить репозиторием источника для нескольких удаленных пользователей, поэтому он не создает удаленный источник по умолчанию. Это означает, что базовые операции git pull и git push не будут работать, поскольку Git предполагает, что без рабочей области вы не собираетесь вносить какие-либо изменения в пустой репозиторий:

~/Projects/bare$ git push
fatal: No destination configured to push to.
~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
~/Projects/bare$ 

Ответ 2

Различие между открытым и не-голым репозитором Git является искусственным и вводящим в заблуждение, поскольку рабочее пространство не является частью репозитория, а репозиторий не требует рабочего пространства. Строго говоря, репозиторий Git включает те объекты, которые описывают состояние репозитория. Эти объекты могут существовать в любом каталоге, но обычно существуют в каталоге .git в каталоге верхнего уровня рабочей области. Рабочая область - это дерево каталогов, которое представляет конкретную фиксацию в репозитории, но может существовать в любой директории или вообще отсутствует. Переменная среды $GIT_DIR связывает рабочую область с репозиторием, из которого она возникла.

Git команды git clone и git init оба имеют опции --bare, которые создают репозитории без начального рабочего пространства. Прискорбно, что Git объединяет две отдельные, но связанные концепции рабочего пространства и хранилища, а затем использует запутанный термин, который может разделять две идеи.

Ответ 3

Голый репозиторий - это не что иное, как сама папка .git, то есть содержимое открытого репозитория такое же, как содержимое папки .git внутри локального рабочего репозитория.

  • Используйте голый репозиторий на удаленном сервере, чтобы позволить нескольким вкладчикам продвигать свою работу.
  • Non-bare - тот, который имеет рабочее дерево, имеет смысл на локальной машине каждого участника вашего проекта.

Ответ 4

5 лет опоздал, я знаю, но на самом деле никто не ответил на вопрос:

Тогда, почему я должен использовать пустой репозиторий, а почему нет? Какая практическая разница? Полагаю, это не будет выгодно большему количеству людей, работающих над проектом.

Какие у вас методы для такой работы? Предложения?

Цитировать прямо из книги Loeliger/MCullough (978-1-449-31638-9, p196/7):

Может показаться, что пустой репозиторий бесполезен, но его роль имеет решающее значение: служить авторитетным координационным центром для совместной разработки. Другие разработчики clone и fetch из чистого репозитория и push в него обновления... если вы настроили репозиторий, в который разработчики push изменения, он должен быть пустым. По сути, это частный случай более общей передовой практики, согласно которой опубликованный репозиторий должен быть чистым.

Ответ 5

У не-голого репозитория просто есть извлеченное рабочее дерево. Рабочее дерево не хранит никакой информации о состоянии репозитория (ветки, теги и т.д.); скорее, рабочее дерево - это просто представление фактических файлов в репо, которое позволяет вам работать (редактировать и т.д.) файлы.

Ответ 6

Голый репозиторий имеет преимущества в

  • сокращение использования диска
  • меньше проблем, связанных с удаленным нажатием (поскольку никакое рабочее дерево не может выйти из синхронизации или иметь конфликтующие изменения)

Ответ 7

Не голый репозиторий позволяет вам (в рабочем дереве) записывать изменения, создавая новые коммиты.

Базовые репозитории изменяются только путем переноса изменений из других репозиториев.

Ответ 8

Я, конечно, не эксперт Git. Я некоторое время использовал TortoiseGit и задавался вопросом, о чем он говорил, когда спрашивал меня, хочу ли я сделать "голый" репо, когда бы я его не создал. Я читал этот урок: https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-init, и он решает эту проблему, но я все еще не совсем понял эту концепцию. Это помогло много: http://bitflop.com/tutorials/git-bare-vs-non-bare-repositories.html. Теперь первый имеет смысл!

Согласно этим источникам, в двух словах "голый" репо используется на сервере, где вы хотите настроить точку распространения. Он не предназначен для использования на вашей локальной машине. Обычно вы нажимаете на локальный компьютер на голый репо на удаленном сервере, и вы и/или другие выходите из этого голого репо на ваш локальный компьютер. Таким образом, ваш ретранслятор удаленного хранилища/распределения GitHub, Assembla и т.д. Является примером создания "голого" репо. Вы сами сделали бы это, если бы создали свой аналогичный "центр обмена".

Ответ 9

Это не новый ответ, но он помог мне разобраться в различных аспектах ответов выше (и это слишком много для комментария).

С помощью Git Bash просто попробуйте:

  me @pc MINGW64/c/Test
$ ls -al
всего 16
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35./
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:11../

me @pc MINGW64/c/Test
$ git init
Инициализированный пустой репозиторий Git в C:/Test/.git/

me @pc MINGW64/c/Test (мастер)
$ ls -al
всего 20
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35./
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:11../
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35.git/

me @pc MINGW64/c/Test (мастер)
$ cd.git

me @pc MINGW64/c/Test/.git(GIT_DIR!)
$ ls -al
всего 15
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35./
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35../
-rw-r-r-- 1 myid 1049089 130 апр 1 11:35 config
-rw-r-r-- 1 myid 1049089 73 апр. 1 11:35 описание
-rw-r-r-- 1 myid 1049089 23 апр. 1 11:35 HEAD
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35 крючки /
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35 информация /
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35 объекты /
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:35 refs/
Код>

То же самое с git --bare:

  me @pc MINGW64/c/Test
$ ls -al
всего 16
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:36./
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:11../

me @pc MINGW64/c/Test
$ git init --bare
Инициализированный пустой репозиторий Git в C:/Test/

me @pc MINGW64/c/Test (BARE: master)
$ ls -al
всего 23
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:36./
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:11../
-rw-r-r-- 1 myid 1049089 104 апр. 1 11:36 config
-rw-r-r-- 1 myid 1049089 73 1 апреля 11:36 описание
-rw-r-r-- 1 myid 1049089 23 апр. 1 11:36 HEAD
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:36 крючки /
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:36 info/
drwxr-xr-x 1 myid 1049089 0 апр. 1 11:36 объекты/
Код>

Ответ 10

$ git help repository-layout

Репозиторий Git поставляется в двух разных вариантах:

  • каталог.git в корне рабочего дерева;
  • директорию.git, которая представляет собой пустой репозиторий (т.е. без собственного рабочего дерева), который обычно используется для обмена историями с другими, вставляя его и извлекая из него.