В чем разница между "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, чтобы создать рабочую копию.