В чем разница между "git init" и "git init --bare"?
Чем отличается git init
а также git init --bare
? Я обнаружил, что много постов в блоге требует --bare
для их сервера Git?
Со страницы руководства он сказал:
--bare
Создать голое хранилище. Если среда GIT_DIR не установлена, она устанавливается в текущий рабочий каталог
Но что это на самом деле означает? Требуется ли иметь --bare
для настройки сервера Git?
5 ответов
Non-Bare Git Repo
Этот вариант создает репозиторий с рабочим каталогом, чтобы вы могли реально работать (git clone
). После его создания вы увидите, что каталог содержит папку.git, в которую входит история и вся сантехника git. Вы работаете на уровне, где находится папка.git.
Голый Гит Репо
Другой вариант создает хранилище без рабочего каталога (git clone --bare
). Вы не получите каталог, где вы можете работать. Теперь все в каталоге - это то, что содержалось в папке.git в приведенном выше случае.
Почему вы используете один против другого
Потребность в git-репозиториях без рабочего каталога заключается в том, что вы можете помещать в него ветки, а он не управляет тем, над чем кто-то работает. Вы все еще можете отправить в репозиторий, который не является пустым, но вы будете отклонены, поскольку вы можете потенциально переместить ветку, над которой кто-то работает, в этом рабочем каталоге.
Таким образом, в проекте без рабочей папки вы можете видеть объекты только по мере их сохранения в git. Они сжимаются и сериализуются и хранятся в SHA1 (хэш) их содержимого. Чтобы получить объект в пустом хранилище, вам нужно git show
и затем укажите sha1 объекта, который вы хотите увидеть. Вы не увидите такую структуру, как ваш проект.
Голые репозитории обычно являются центральными репозиториями, куда каждый перемещает свою работу. Нет необходимости манипулировать реальной работой. Это способ синхронизировать усилия между несколькими людьми. Вы не сможете напрямую просматривать файлы вашего проекта.
Вам может не понадобиться никаких пустых репозиториев, если вы единственный, кто работает над проектом, или вам не нужен / не нужен "логически центральный" репозиторий. Один предпочел бы git pull
из других хранилищ в этом случае. Это позволяет избежать возражений, возникающих в git при отправке в непокрытые репозитории.
Надеюсь это поможет
Короткий ответ
Пустой репозиторий - это репозиторий git без рабочей копии, поэтому содержимое.git является верхним уровнем для этого каталога.
Используйте не пустой репозиторий для локальной работы и пустой репозиторий в качестве центрального сервера / концентратора, чтобы поделиться своими изменениями с другими людьми. Например, когда вы создаете репозиторий на github.com, он создается как пустой репозиторий.
Итак, на вашем компьютере:
git init
touch README
git add README
git commit -m "initial commit"
на сервере:
cd /srv/git/project
git init --bare
Затем на клиенте вы нажимаете:
git push username@server:/srv/git/project master
Затем вы можете сохранить набор текста, добавив его в качестве удаленного.
Хранилище на стороне сервера будет получать коммиты с помощью push и push, а не редактированием файлов и последующим их фиксацией на серверном компьютере, поэтому это пустой репозиторий.
подробности
Вы можете перейти в репозиторий, который не является пустым, и git обнаружит, что там есть репозиторий.git, но так как большинству репозиториев-концентраторов не нужна рабочая копия, нормально использовать пустой репозиторий для это и рекомендуется, поскольку нет смысла иметь рабочую копию в репозиториях такого рода.
Однако, если вы перешли в не пустой репозиторий, вы делаете рабочую копию несовместимой, и git предупредит вас:
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 you
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'.
Вы можете пропустить это предупреждение. Но рекомендуемая настройка: использовать не-пустой репозиторий для локальной работы и пустой-репозиторий в качестве концентратора или центрального сервера, с которого можно загружать и извлекать данные.
Если вы хотите поделиться работой напрямую с рабочей копией другого разработчика, вы можете извлекать репозитории друг из друга, а не выдвигать их.
Когда я прочитал этот вопрос некоторое время назад, меня все смутило. Я только начал использовать git и есть эти рабочие копии (которые в то время ничего не значили). Я попытаюсь объяснить это с точки зрения парня, который только начал заниматься git, не имея понятия о терминологии.
Хороший пример различий можно описать следующим образом:
--bare
дает вам просто место для хранения (вы не можете развиваться там). Без --bare
это дает вам возможность развиваться там (и иметь место для хранения).
git init
создает репозиторий git из вашего текущего каталога. Он добавляет в него папку.git и позволяет начать историю изменений.
git init --bare
также создает хранилище, но у него нет рабочего каталога. Это означает, что вы не можете редактировать файлы, фиксировать свои изменения, добавлять новые файлы в этот репозиторий.
когда --bare
может быть полезным? Вы и несколько других парней работаете над проектом и используете git. Вы размещали проект на каком-то сервере (amazon ec2
). У каждого из вас есть свой компьютер, и вы нажимаете свой код на ec2
, Никто из вас на самом деле ничего не разрабатывает на ec2
(вы используете свои машины) - вы просто нажимаете свой код. Так что ваши ec2
это просто хранилище для всего вашего кода и должно быть создано как --bare
и все твои машины без --bare
(скорее всего только один, а другие просто клонируют все). Рабочий процесс выглядит так:
Git-репозиторий по умолчанию предполагает, что вы будете использовать его в качестве рабочего каталога. Как правило, когда вы находитесь на сервере, вам не нужно иметь рабочий каталог. Просто хранилище. В этом случае вы должны использовать --bare
вариант.
Неполное хранилище используется по умолчанию. Это то, что создается при запуске git init
или что вы получаете, когда клонируете (без bare
вариант) с сервера.
Когда вы работаете с таким репозиторием, вы можете просматривать и редактировать все файлы, которые находятся в репозитории. Когда вы взаимодействуете с репозиторием - например, путем внесения изменений - Git сохраняет ваши изменения в скрытом каталоге с именем .git
,
Когда у вас есть git-сервер, вам не нужны рабочие копии файлов. Все, что вам нужно, это данные Git, которые хранятся в .git
, Пустой репозиторий является именно .git
каталог, без рабочей области для изменения и фиксации файлов.
Когда вы клонируете с сервера, Git имеет всю необходимую информацию в .git
каталог для создания вашей рабочей копии.
Еще одно различие между репозиториями --bare и Working Tree заключается в том, что в первом случае потерянные коммиты не сохраняются, а сохраняются только те коммиты, которые принадлежат дорожке ветки. С другой стороны, Working Tree сохраняет все коммиты навсегда. Смотри ниже...
Я создал первый репозиторий (имя: git-bare) сgit init --bare
. Это сервер. Он находится слева, где нет удаленных веток, потому что это сам удаленный репозиторий.
Я создал второй репозиторий (имя: git-working-tree) сgit clone
с самого начала. Это справа. Он имеет локальные филиалы, связанные с удаленными ветвями.
(Тексты "первый", "второй", "третий", "четвертый", "альфа", "бета" и "дельта" являются комментариями фиксации. Имена "мастер" и "греческий" являются названиями веток.)
Теперь я удалю ветку с именем 'greek' как в git-bare (команда:git push --delete origin greek
) и локально в git-working-tree (команда:git branch -D greek
). Вот как выглядит дерево:
ГИТ-голое хранилище удаляет как ветвь, и все ссылки comits. На картинке мы видим, что его дерево уменьшилось по этой причине.
С другой стороны, репозиторий git-working-tree, который эквивалентен обычно используемому локальному репозиторию, не удаляет коммиты, на которые теперь может ссылаться только ваш хэш с помощьюgit checkout 7fa897b7
команда. Поэтому его дерево не имеет измененной структуры.
КРАТКО: коммиты никогда не удаляются в репозиториях рабочего дерева, но удаляются в пустых репозиториях.
На практике вы можете восстановить удаленную ветку на сервере, только если она существует в локальном репозитории.
Но очень странно, что размер голого репозитория не уменьшается в размере диска после удаления удаленной ветки. То есть файлы еще как-то там. Чтобы выгрузить репозиторий, удалив то, на что больше не ссылаются или на что никогда нельзя ссылаться (последний случай), используйтеgit gc --prune
команда