Яка різниця між "git init" і "git init --bare"?


162

Чим відрізняється git initі git init --bare? Я виявив, що --bareдля їх сервера Git потрібно багато публікацій в блозі ?

Від сторінки людини , він сказав:

--bare

Створіть голое сховище. Якщо середовище GIT_DIR не встановлено, воно встановлюється в поточний робочий каталог

Але що це насправді означає? Це потрібно мати --bareдля установки сервера Git?

Відповіді:


143

Не голий Git Repo

Цей варіант створює сховище з робочим каталогом, щоб ви могли фактично працювати ( git clone). Створивши його, ви побачите, що в каталозі є папка .git, куди йде історія та вся сантехніка git. Ви працюєте на тому рівні, де папка .git.

Голий Гіт Репо

Інший варіант створює сховище без робочого каталогу ( git clone --bare). У вас немає каталогу, де ви можете працювати. Все в каталозі - це те, що містилось у папці .git у наведеному вище випадку.

Чому б ви використовували один проти іншого

Необхідність git repos без робочого каталогу полягає в тому, що ви можете натиснути на нього гілки, і він не керує тим, над чим працює хтось. Ви все одно можете перейти до сховища, яке не є голим, але вас відхилять, оскільки ви потенційно зможете перемістити гілку, над якою працює хтось у цьому робочому каталозі.

Тож у проекті, у якому немає робочої папки, ви можете бачити лише об'єкти, коли їх зберігає git. Вони стискаються та серіалізуються та зберігаються під SHA1 (хеш) їх вмісту. Для того, щоб потрапити на об’єкт у голому сховищі, вам потрібно git showвказати sha1 об’єкта, який ви хочете бачити. Ви не побачите такої структури, як ваш проект.

Голі сховища зазвичай є центральними сховищами, куди кожен переходить свою роботу. Немає необхідності маніпулювати реальною роботою. Це спосіб синхронізувати зусилля між кількома людьми. Ви не зможете безпосередньо бачити файли свого проекту.

Можливо, у вас немає потреби в жодних голих сховищах, якщо ви єдиний, хто працює над проектом, або ви не хочете / потребуєте "логічно центрального" сховища. Один волів би git pull з інших сховищ в цьому випадку. Це дозволяє уникнути заперечень, які викликає git під час натискання на неоголені сховища.

Сподіваюся, це допомагає


Тримайте , викинути від цієї лінії - Один вважав за краще б GIT тягнути від А інший ... :-)
Arup Ракша

10
Я вважаю цю відповідь дуже незрозумілою та заплутаною. Деякі причини тут: meta.stackoverflow.com/questions/339837/…
Marko Avlijaš

Bare repositories are usually central repositories where everyone moves their work to.Ви хочете сказати, що голий сховище є джерелом, з якого інші співробітники проекту можуть клонувати проект? Тобто співробітники трактують це як remote?
Мінь Тран

112

Коротка відповідь

Голий сховище - це сховище 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 and push", а не ви редагуєте файли, а потім здійснюєте їх зв'язання в серверній машині, тому це голий сховище.

Деталі

Ви можете перейти до сховища, яке не є голим сховищем, і git виявить, що там є сховище .git, але оскільки для більшості сховищ "hub" не потрібна робоча копія, нормально використовувати голі сховища для це і рекомендується, оскільки немає сенсу мати робочу копію в подібних сховищах.

Однак якщо ви перейдете до неоголеного сховища, ви робите робочу копію непослідовною, і 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, тому не потрібно мати --bare варіант, чи не так?
Кіт Хо

Ви використовуєте голі для віддаленого сховища, а не для локального.
duncan

Трохи, але тут ще одне питання. Якщо у нас є голий віддалений сховище, будь-який розробник може натиснути на нього, сховище є "центральним". Але якщо ми працюємо без голого сховища, розробники повинні лише тягнутись один від одного, але ніколи не натискати. Останній сценарій є дуже хорошим, якщо є лише 2 робочі примірники репо (також місцеві репости). Це правильно?
Астуріо

60

Коли я читав це питання деякий час тому, все мене бентежило. Я щойно почав використовувати git і є ці робочі копії (що тоді нічого не означало). Я спробую пояснити це з точки зору хлопця, який тільки почав git, не маючи поняття про термінологію.

Гарний приклад відмінностей можна описати наступним чином :

--bareдає просто місце зберігання (там ви не можете розвиватися). Без --bareцього дає можливість розвиватися там (і мати місце для зберігання).

git initстворює сховище git з вашого поточного каталогу. Він додає папку .git всередині неї і дає можливість почати історію редагування.

git init --bareтакож створює сховище, але він не має робочого каталогу. Це означає, що ви не можете редагувати файли, вносити зміни, додавати нові файли до цього сховища.

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

введіть тут опис зображення


1
Отже, чи можна сказати, що, використовуючи репозиторій --bare, ми можемо створити таку архітектуру клієнт-сервер, як це робить субверсія?
Еміліано Сангой

14

Типовий сховище Git передбачає, що ви будете використовувати його як свою робочу директорію. Зазвичай, коли ви перебуваєте на сервері, вам не потрібно мати робочий каталог. Просто сховище. У цьому випадку слід скористатися --bareопцією.


у варіанті repo з --bare, тому ми не можемо побачити весь файл проекту? Здається, я втрачаю весь мій файл проекту з опцією --bare ..
Kit Ho

11

Типовим сховищем є за замовчуванням. Це те, що створюється при запуску git init, або те, що ви отримуєте, коли клонуєте (без bareопції) з сервера.

Працюючи з таким сховищем, ви можете бачити та редагувати всі файли, що знаходяться у сховищі. Під час взаємодії з сховищем - наприклад, шляхом внесення змін - Git зберігає ваші зміни у прихованому каталозі під назвою .git.

Якщо у вас є git-сервер, немає необхідності в тому, щоб там працювали копії файлів. Все, що вам потрібно, - це дані Git, які зберігаються .git. Оголене сховище - це саме .gitкаталог, без робочої області для зміни та введення файлів.

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


1

Ще одна відмінність між сховищами --bare та Working Tree полягає в тому, що в першому випадку не зберігаються втрачені коми, а зберігаються лише коміти, що належать до гілки гілки . З іншого боку, Робоче дерево зберігає всі зобов'язання назавжди. Дивись нижче...

Я створив перший сховище (ім'я: git-bare ) з git init --bare. Це сервер. Це ліворуч, де немає віддалених гілок, оскільки це саме віддалене сховище.

Я створив друге сховище (ім'я: git-working-tree ) з git cloneпершого. Це справа. Він має місцеві відділення, пов'язані з віддаленими гілками.

(Тексти "перший", "другий", "третій", "четвертий", "альфа", "бета" та "дельта" - це коментарі до виконання. Назви "головний" та "грецький" - це назви гілок.)

Локальні та віддалені сховища

Тепер я видалю гілку з назвою "грецька" як у git-bare (команда :), такgit push --delete origin greek і локально в git-working-tree (команда:) git branch -D greek. Ось як виглядає дерево:

Репозиторій git-gore видаляє те, на що більше не посилається

ГИТ-голе сховище видаляє як гілка , і всі посилання comits. На малюнку ми бачимо, що його дерево було зменшено з цієї причини.

З іншого боку, сховище git working tree , що еквівалентно звичайному локальному сховищу, не видаляє коміти, на які тепер може бути посилається лише ваш хеш із git checkout 7fa897b7командою. Ось чому його дерево не має зміненої структури.

КРАТКО: Коміти ніколи не випадають у сховища робочих дерев , а видаляються в голі сховища.

На практиці ви можете відновити видалену гілку на сервері, лише якщо вона існує в локальному сховищі.

Але дуже дивно, що розмір оголеного сховища не зменшується в розмірі диска після видалення віддаленої гілки. Тобто файли все ще якимось чином є. Щоб скинути сховище, видаливши те, на що більше не посилається або на що ніколи не може бути посилання (останній випадок), використовуйте git gc --pruneкоманду


Для перевірки команд git спробуйте: github.com/sergiocabral/App.GitPlayground
Серхіо Кабрал
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.