В чем заключается практическая разница между хранилищем Bare и Non-Bare?
Я читал о репозиториях "голые" и "не голые / по умолчанию" в Git. Я не смог понять (теоретически) достаточно хорошо о различиях между ними и о том, почему я должен "подтолкнуть" к пустому хранилищу. Вот сделка:
В настоящее время я один работаю над проектом на 3 разных компьютерах, но позже к нему будет привлечено больше людей, поэтому я использую Git для контроля версий. Я клонирую голое репо на всех компьютерах, и когда я заканчиваю свои модификации на одном из них, я фиксирую и помещаю изменения в голое репо. Из того, что я прочитал, пустой репозиторий НЕ имеет "рабочего дерева", поэтому, если я клонирую пустой репозиторий, у меня не будет "рабочего дерева".
Я предполагаю, что рабочее дерево хранит информацию о коммите, ветвях и т. Д. Из проекта. Это не появится в голом репо. Так что, мне кажется, лучше "проталкивать" коммиты в репо с рабочим деревом.
Тогда, почему я должен использовать пустой репозиторий, а почему нет? В чем практическая разница? Полагаю, это не будет выгодно большему количеству людей, работающих над проектом.
Какие у вас методы для такой работы? Предложения?
9 ответов
Еще одно различие между пустым и не пустым хранилищем заключается в том, что в пустом хранилище нет удаленного исходного хранилища по умолчанию:
derek@derek-OptiPlex-960:~/Projects$ git clone --bare test bare
Initialized empty Git repository in /home/derek/Projects/bare/
derek@derek-OptiPlex-960:~/Projects$ cd bare
derek@derek-OptiPlex-960:~/Projects/bare$ git branch -a
* master
derek@derek-OptiPlex-960:~/Projects/bare$ cd ..
derek@derek-OptiPlex-960:~/Projects$ git clone test non-bare
Initialized empty Git repository in /home/derek/Projects/non-bare/.git/
cd nonderek@derek-OptiPlex-960:~/Projects$ cd non-bare
derek@derek-OptiPlex-960:~/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 предполагает, что без рабочей области вы не собираетесь вносить какие-либо изменения в пустой репозиторий:
derek@derek-OptiPlex-960:~/Projects/bare$ git push
fatal: No destination configured to push to.
derek@derek-OptiPlex-960:~/Projects/bare$ git pull
fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.
derek@derek-OptiPlex-960:~/Projects/bare$
5 лет опоздал, я знаю, но на самом деле никто не ответил на вопрос:
Тогда, почему я должен использовать пустой репозиторий, а почему нет? В чем практическая разница? Полагаю, это не будет выгодно большему количеству людей, работающих над проектом.
Какие у вас методы для такой работы? Предложения?
Цитировать непосредственно из книги Loeliger/MCullough (978-1-449-31638-9, p196/7):
Может показаться, что пустой репозиторий бесполезен, но его роль имеет решающее значение: служить авторитетным координационным центром для совместной разработки. Другие разработчики
clone
а такжеfetch
из чистого хранилища иpush
обновления к нему... если вы создали репозиторий, в который разработчикиpush
изменения, оно должно быть голым. По сути, это частный случай более общей передовой практики, согласно которой опубликованный репозиторий должен быть пустым.
Различие между "чистым" и "не пустым" Git-репозиторием является искусственным и вводящим в заблуждение, поскольку рабочее пространство не является частью репозитория, а для репозитория не требуется рабочее пространство. Строго говоря, репозиторий Git включает в себя те объекты, которые описывают состояние репозитория. Эти объекты могут существовать в любом каталоге, но обычно существуют в .git
каталог в каталоге верхнего уровня рабочей области. Рабочая область - это дерево каталогов, которое представляет конкретный коммит в репозитории, но оно может существовать в любом каталоге или не существовать вообще. Переменная среды $GIT_DIR
связывает рабочее пространство с репозиторием, из которого оно происходит.
Git команды git clone
а также git init
у обоих есть варианты --bare
которые создают репозитории без начальной рабочей области. К сожалению, Git объединяет два отдельных, но взаимосвязанных понятия рабочего пространства и хранилища, а затем использует запутанный термин " голый" для разделения двух идей.
Пустой репозиторий - это не что иное, как сама папка .git, т.е. содержимое пустого репозитория такое же, как содержимое папки .git в вашем локальном рабочем репозитории.
- Используйте пустой репозиторий на удаленном сервере, чтобы несколько участников могли продвигать свою работу.
- Non-bare - тот, у которого есть рабочее дерево, имеет смысл на локальной машине каждого участника вашего проекта.
Репозиторий Git по умолчанию или без него содержит две части состояния:
- Снимок всех файлов в хранилище (это то, что "работает дерево" означает в Git жаргоне)
- История всех изменений, внесенных во все файлы, которые когда - либо были в хранилище (там, кажется, не быть кратким кусок Гит жаргоне, который включает в себя все это)
Снимок является то, что вы, вероятно, думаете, как ваш проект: ваш код файлы, файлы сборка, вспомогательные скрипты, и все, что вы версия с Git.
История является состоянием, которое позволяет проверить различные фиксации и получить полную картину того, что файлы в вашем хранилище выглядят, когда, выделяющая было добавлено. Он состоит из множества внутренних структур данных Git, с которыми вы, вероятно, никогда не взаимодействовали напрямую. Важно отметить, что история не просто хранит метаданные (например, "Пользователь U добавил такое количество строк в файл F в момент T как часть фиксации C"), но также хранит данные (например, "Пользователь U добавил именно эти строки в файл F").
Ключевая идея чистого репозитория заключается в том, что вам фактически не нужно иметь снимок. Git хранит снимок, потому что он удобен для людей и других процессов, не связанных с Git, которые хотят взаимодействовать с вашим кодом, но снимок просто дублирует состояние, которое уже есть в истории.
Голое хранилище представляет собой хранилище Git, который не имеет снимка. Он просто хранит историю.
Зачем тебе это нужно? Что ж, если вы собираетесь взаимодействовать только со своими файлами с помощью Git (то есть вы не собираетесь напрямую редактировать файлы или использовать их для создания исполняемого файла), вы можете сэкономить место, не храня моментальный снимок. В частности, если вы где-то поддерживаете централизованную версию своего репо на сервере (т.е. вы в основном размещаете свой собственный GitHub), этот сервер, вероятно, должен иметь голое репо (вы все равно будете использовать репо без голого репо на своем локальный компьютер, поскольку вы, вероятно, захотите отредактировать свой снимок).
Если вам нужно более подробное объяснение голых репозиториев и другого примера использования, я написал сообщение в блоге здесь: https://stegosaurusdormant.com/bare-git-repo/
Неполное хранилище просто имеет проверенное рабочее дерево. Рабочее дерево не хранит никакой информации о состоянии хранилища (ветки, теги и т. Д.); скорее, рабочее дерево - это просто представление реальных файлов в репо, которое позволяет вам работать (редактировать и т. д.) с файлами.
Чистое хранилище имеет преимущества в
- уменьшенное использование диска
- меньше проблем, связанных с удаленной передачей (поскольку нет рабочего дерева, которое могло бы быть синхронизировано или иметь конфликтующие изменения)
Репозиторий Non голый позволяет вам (в ваше рабочее дерево) записывать изменения, создавая новые коммиты.
Голые репозитории изменяются только путем переноса изменений из других репозиториев.
Я, конечно, не 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 и т. Д. Представляет собой пример, где создается "голое" репо. Вы бы сделали его самостоятельно, если бы вы создали собственный аналогичный "центр обмена".
Это не новый ответ, но он помог мне понять различные аспекты ответов выше (и это слишком много для комментария).
Используя 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/
$ git help repository-layout
Git-репозиторий поставляется в двух разных вариантах:
- каталог.git в корне рабочего дерева;
- каталог.git, представляющий собой пустой репозиторий (то есть без собственного рабочего дерева), который обычно используется для обмена историями с другими пользователями путем загрузки в него и извлечения из него.