В чем разница между "git init" и "git init --bare"?
В чем разница между git init
и git init --bare
? Я обнаружил, что для большого количества сообщений в блоге требуется --bare
для своего сервера Git?
Из справочная страница, он сказал:
--bare
Создайте пустой репозиторий. Если среда GIT_DIR не установлена, она устанавливается в текущий рабочий каталог
Но что это значит? Требуется ли --bare
для настройки сервера Git?
Ответы
Ответ 1
Non-Bare Git Repo
Этот вариант создает репозиторий с рабочим каталогом, чтобы вы могли фактически работать (git clone
). После его создания вы увидите, что каталог содержит папку.git, в которой идет история и вся git-сантехника. Вы работаете на уровне, где находится папка.git.
Bare Git Repo
Другой вариант создает репозиторий без рабочего каталога (git clone --bare
). Вы не получаете директорию, в которой вы можете работать. Все в каталоге теперь является тем, что содержалось в папке.git в приведенном выше случае.
Почему вы будете использовать один против другого?
Необходимость в git-репозиториях без рабочего каталога заключается в том, что вы можете нажимать на него ветки, и он не управляет тем, над чем работает кто-то. Вы все равно можете нажать на репозиторий, который не годится, но вы получите отклонение, поскольку вы можете переместить ветку, в которой работает кто-то в этом рабочем каталоге.
Таким образом, в проекте без рабочей папки вы можете видеть только объекты, поскольку git хранит их. Они сжимаются и сериализуются и хранятся под SHA1 (хеш) их содержимого. Чтобы получить объект в открытом репозитории, вам нужно git show
а затем указать sha1 объекта, который вы хотите просмотреть. Вы не увидите структуру, похожую на то, как выглядит ваш проект.
Голые хранилища обычно являются центральными хранилищами, в которые каждый перемещает свою работу. Нет необходимости манипулировать фактической работой. Это способ синхронизации усилий между несколькими людьми. Вы не сможете напрямую просматривать файлы проекта.
У вас может не быть необходимости в каких-либо голых репозиториях, если вы работаете только с одним проектом или вам не нужен/нужен "логически центральный" репозиторий. В таком случае можно было бы предпочесть git pull
из других репозиториев. Это позволяет избежать возражений, которые git имеет при нажатии на не-голые репозитории.
Надеюсь это поможет
Ответ 2
Короткий ответ
Голый репозиторий - это репозиторий 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 [email protected]:/srv/git/project master
Затем вы можете сохранить ввод, добавив его как удаленный.
Репозиторий на стороне сервера будет получать фиксации через pull и 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'.
Вы можете пропустить это предупреждение. Но рекомендуемая настройка: использовать не-голый репозиторий для работы локально и голый репозиторий в качестве концентратора или центрального сервера для push и pull.
Если вы хотите разделить работу напрямую с другой рабочей машиной разработчика, вы можете вытаскивать друг из друга репозитории вместо того, чтобы нажимать.
Ответ 3
Когда я прочитал этот вопрос некоторое время назад, все меня сбило с толку. Я только начал использовать git, и есть эти рабочие копии (в это время ничего не значит). Я попытаюсь объяснить это с точки зрения парня, который только начал git, не имея понятия о терминологии.
Хороший пример различий можно описать следующим образом:
--bare
дает вам место для хранения (вы не можете там развиваться). Без --bare
он дает вам возможность развиваться там (и иметь место для хранения).
git init
создает репозиторий git из вашего текущего каталога. Он добавляет в него папку .git и позволяет начать историю изменений.
git init --bare
также создает репозиторий, но он не имеет рабочего каталога. Это означает, что вы не можете редактировать файлы, фиксировать свои изменения, добавлять новые файлы в этот репозиторий.
Когда --bare
может быть вам полезен? Вы и несколько других парней работаете над проектом и используете git. Вы размещали проект на каком-то сервере (amazon ec2
). У каждого из вас есть свой собственный компьютер, и вы нажимаете свой код на ec2
. Ни у кого из вас нет ничего на ec2
(вы используете свои машины) - вы просто нажимаете свой код. Таким образом, ваш ec2
является всего лишь хранилищем для всего вашего кода и должен быть создан как --bare
, а все ваши машины без --bare
(скорее всего, только один, а другой будет просто клонировать все). Рабочий процесс выглядит следующим образом:
![enter image description here]()
Ответ 4
Репозиторий по умолчанию Git предполагает, что вы будете использовать его в качестве рабочего каталога. Как правило, когда вы находитесь на сервере, вам не нужно иметь рабочий каталог. Просто хранилище. В этом случае вы должны использовать опцию --bare
.
Ответ 5
По умолчанию используется не-голый репозиторий. Это то, что создается при запуске git init
или того, что вы получаете, когда вы клонируете (без опции bare
) с сервера.
Когда вы работаете с таким репозиторием, вы можете видеть и редактировать все файлы, находящиеся в репозитории. Когда вы взаимодействуете с репозиторием - например, совершая изменение - Git сохраняет ваши изменения в скрытом каталоге с именем .git
.
Когда у вас есть сервер Git, нет необходимости создавать рабочие копии файлов. Все, что вам нужно, это Git данные, хранящиеся в .git
. Голый репозиторий - это именно каталог .git
, без рабочей области для изменения и фиксации файлов.
Когда вы клонируете с сервера, Git имеет всю необходимую информацию в каталоге .git
, чтобы создать рабочую копию.