В чем заключается практическая разница между хранилищем Bare и Non-Bare? - PullRequest
172 голосов
/ 04 апреля 2011

Я читал о репозиториях "голые" и "не голые / по умолчанию" в Git.Я не смог понять (теоретически) достаточно хорошо о различиях между ними и о том, почему я должен «подтолкнуть» к пустому хранилищу.Вот сделка:

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

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

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

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

Ответы [ 10 ]

83 голосов
/ 04 апреля 2011

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

~/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$ 
53 голосов
/ 04 апреля 2011

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

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

52 голосов
/ 10 февраля 2015

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

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

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

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

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

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

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

17 голосов
/ 04 апреля 2011

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

12 голосов
/ 04 апреля 2011

Чистое хранилище имеет преимущества в

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

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

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

6 голосов
/ 11 августа 2015

Я, конечно, не 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 и т. Д. Представляет собой пример, где создается «голое» репо. Вы бы сделали его самостоятельно, если бы настраивали собственный аналогичный «центр обмена».

2 голосов
/ 03 апреля 2018

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

Используя Git Bash, просто попробуйте:

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init
Initialized empty Git repository in C:/Test/.git/

me@pc MINGW64 /c/Test (master)
$ ls -al
total 20
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:35 .git/

me@pc MINGW64 /c/Test (master)
$ cd .git

me@pc MINGW64 /c/Test/.git (GIT_DIR!)
$ ls -al
total 15
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 ../
-rw-r--r-- 1 myid 1049089 130 Apr  1 11:35 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:35 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:35 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 objects/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:35 refs/

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

me@pc MINGW64 /c/Test
$ ls -al
total 16
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089 0 Apr  1 11:11 ../

me@pc MINGW64 /c/Test
$ git init --bare
Initialized empty Git repository in C:/Test/

me@pc MINGW64 /c/Test (BARE:master)
$ ls -al
total 23
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 ./
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:11 ../
-rw-r--r-- 1 myid 1049089 104 Apr  1 11:36 config
-rw-r--r-- 1 myid 1049089  73 Apr  1 11:36 description
-rw-r--r-- 1 myid 1049089  23 Apr  1 11:36 HEAD
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 hooks/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 info/
drwxr-xr-x 1 myid 1049089   0 Apr  1 11:36 objects/
1 голос
/ 02 декабря 2018

$ git help repository-layout

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

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