В чем разница между "git init" и "git init --bare"? - PullRequest
149 голосов
/ 22 октября 2011

В чем разница между git init и git init --bare? Я обнаружил, что для многих сообщений в блоге требуется --bare для их сервера Git?

Из справочной страницы сказано:

--bare

Создать пустой репозиторий. Если среда GIT_DIR не установлена, она устанавливается в текущий рабочий каталог

Но что это на самом деле означает? Требуется ли иметь --bare для настройки Git-сервера?

Ответы [ 5 ]

128 голосов
/ 22 октября 2011

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 при отправке в не голые репозитории.

Надеюсь, это поможет

100 голосов
/ 22 октября 2011

Краткий ответ

Пустой репозиторий - это репозиторий 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'.

Вы можете пропустить это предупреждение. Но рекомендуемая настройка: использовать не-пустой репозиторий для локальной работы и пустой-репозиторий в качестве концентратора или центрального сервера для передачи и извлечения.

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

56 голосов
/ 28 марта 2014

Когда я прочитал этот вопрос некоторое время назад, меня все смутило.Я только начал использовать git, и есть эти рабочие копии (которые в то время ничего не значили).Я попытаюсь объяснить это с точки зрения парня, который только начал git, не имея представления о терминологии.

Хороший пример различий можно описать следующим образом :

--bare дает вам просто место для хранения (вы не можете развиваться там).Без --bare это дает вам возможность развиваться там (и иметь место для хранения).

git init создает git-репозиторий из вашего текущего каталога.Он добавляет в него папку .git и позволяет запустить историю изменений.

git init --bare также создает хранилище, но у него нет рабочего каталога.Это означает, что вы не можете редактировать файлы, фиксировать свои изменения, добавлять новые файлы в этот репозиторий.

Когда --bare может быть полезным? Вы и еще несколько человек работаете над проектом и используете git.Вы размещали проект на каком-либо сервере (amazon ec2).У каждого из вас есть свой компьютер, и вы нажимаете свой код на ec2.Никто из вас на самом деле ничего не разрабатывает на ec2 (вы используете свои машины) - вы просто нажимаете свой код.Таким образом, ваш ec2 является просто хранилищем всего вашего кода и должен быть создан как --bare, а все ваши машины без --bare (скорее всего, только один, а другие просто клонируют все).Рабочий процесс выглядит следующим образом:

enter image description here

14 голосов
/ 22 октября 2011

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

11 голосов
/ 22 октября 2011

Неполное хранилище используется по умолчанию.Это то, что создается при запуске git init или то, что вы получаете при клонировании (без опции bare) с сервера.

Когда вы работаете с таким репозиторием, вы можете видеть иотредактируйте все файлы, которые находятся в хранилище.Когда вы взаимодействуете с репозиторием - например, путем внесения изменений - Git сохраняет ваши изменения в скрытом каталоге с именем .git.

Когда у вас есть сервер git, вам не нужно, чтобы там были рабочие копиифайлы.Все, что вам нужно, это данные Git, которые хранятся в .git.Чистый репозиторий - это каталог .git, без рабочей области для изменения и фиксации файлов.

Когда вы клонируете с сервера, Git имеет всю необходимую информацию в каталоге .git, чтобы создать вашу рабочую область.копия.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...