Як ви використовуєте сховище "git --bare init"?


320

Мені потрібно створити центральне сховище Git, але я трохи розгублений ...

Я створив голое сховище (на моєму сервері git, машина 2) з:

$ mkdir test_repo
$ git --bare init

Тепер мені потрібно пересунути файли з мого локального сховища (машина 1) до голого сховища (машина 2). У мене є доступ до машини 2 SSH. Вся справа в тому, що я думаю, що я не розумію поняття голого сховища ...

Який правильний спосіб зберігання мого коду в голому сховищі? Як я можу перенести зміни зі свого локального сховища до голого сховища?

Чи є правильним способом мати центральний сховище, щоб мати голий сховище?

Я трохи плутаю цю тему. Будь ласка, дайте мені підказку в цьому.

Відповіді:


391

По-перше, просто для перевірки вам потрібно змінити каталог, який ви створили перед запуском git init --bare. Крім того, розширенням для голих сховищ звичайно давати розширення .git. Так ви можете зробити

git init --bare test_repo.git

Для версій Git <1,8 ви б це зробили

mkdir test_repo.git
cd test_repo.git
git --bare init

Щоб відповісти на ваші пізніші запитання, голі сховища (за визначенням) не мають до них прикріпленого робочого дерева, тому ви не можете легко додавати до них файли, як у звичайне не оголене сховище (наприклад, з git add <file>та наступним) git commit. )

Ви майже завжди оновлюєте голий сховище, натискаючи на нього (використовуючи git push) з іншого сховища.

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

git config receive.denyCurrentBranch ignore

Редагування спільноти

git init --bare --shared=group

Як коментує prasanthv, це те, чого ви хочете, якщо ви робите це на роботі, а не для приватного будинку.


7
Ви також можете додати цю --sharedопцію, initякщо ви плануєте, щоб інші люди підштовхували до цього репо. Він автоматично додає дозволу на групове записування до сховища - посилання
prasanthv

17
Я думаю, що ці три рядки мають такий же ефект, ніж цей лише один: git --bare init test_repo.git Принаймні з моєю поточною версією git (1.8.2.2)
Fran Marzoa

1
корисно, якщо ви хочете знати різницю між голими та неоголеними репортами
stackoverflow.com/questions/7861184/…

як git знаходить речі, якщо не працює дерево? Я думав, що в магазині об’єктів git є робоче дерево, і саме на це вказують та вказують постановочні SHA
akantoword

@akantoword: git зберігає всю інформацію про коміти та гілки десь. Комісія, ймовірно, здебільшого відрізняється від попередньої версії файлів та нової версії. Робоче дерево - це лише знімок його реального змісту в конкретний час. У будь-якому випадку, з робочим деревом ви можете переходити туди-назад між комітками та гілками. Ви навіть можете оформити замовлення на іншому робочому дереві, якщо хочете.
користувач276648

246

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

Примітка: у цьому прикладі використовуються локальні шляхи для розташування голого репо, але інші протоколи git (наприклад, SSH, вказані ОП) повинні працювати чудово.

Я намагався додати кілька записок для тих, хто менш знайомий з git.

1. Ініціалізуйте голий репо ...

> git init --bare /path/to/bare/repo.git
Initialised empty Git repository in /path/to/bare/repo.git/

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

Далі нам потрібно створити робочу папку. Існує кілька способів зробити це, залежно від того, чи є у вас наявні файли.

2а. Створіть нову робочу папку (немає існуючих файлів), клонувавши порожнє репо

git clone /path/to/bare/repo.git /path/to/work
Cloning into '/path/to/work'...
warning: You appear to have cloned an empty repository.
done.

Ця команда працюватиме лише тоді, коли /path/to/workвона не існує або є порожньою папкою. Зверніть увагу на попередження - на цьому етапі ви все ще не маєте нічого корисного. Якщо ти cd /path/to/workзапустишся git status, отримаєш щось на кшталт:

On branch master

Initial commit

nothing to commit (create/copy files and use "git add" to track)

але це брехня. Ви насправді не на філії master(бо git branchнічого не повертає), і поки що жодних комітетів немає.

Далі скопіюйте / перемістіть / створіть деякі файли у робочій папці, додайте їх до git та створіть перший фіксатор.

> cd /path/to/work
> echo 123 > afile.txt
> git add .
> git config --local user.name adelphus
> git config --local user.email adelphus@example.com
> git commit -m "added afile"
[master (root-commit) 614ab02] added afile
 1 file changed, 1 insertion(+)
 create mode 100644 afile.txt

Ці git configкоманди потрібні , тільки якщо ви ще не сказали , мерзотнику , хто ти. Зауважте, що якщо ви зараз запустите git branch, то тепер ви побачите masterфілію в списку. Тепер запустіть git status:

On branch master
Your branch is based on 'origin/master', but the upstream is gone.
  (use "git branch --unset-upstream" to fixup)

nothing to commit, working directory clean

Це також вводить в оману - вище за течією не "пішло", воно просто ще не створене і git branch --unset-upstreamне допоможе. Але це нормально, тепер, коли у нас є перший вчинок, ми можемо натиснути, і майстер буде створений на голому репо.

> git push origin master
Counting objects: 3, done.
Writing objects: 100% (3/3), 207 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master

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

> git pull
Already up-to-date.
> git push origin master
Everything up-to-date

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

> cd /path/to/work_with_stuff
> git init 
Initialised empty Git repository in /path/to/work_with_stuff
> git add .
# add git config stuff if needed
> git commit -m "added stuff"

[master (root-commit) 614ab02] added stuff
 20 files changed, 1431 insertions(+)
 create mode 100644 stuff.txt
...

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

> git remote add origin /path/to/bare/repo.git
> git push -u origin master
Counting objects: 31, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (31/31), done.
Writing objects: 100% (31/31), 43.23 KiB | 0 bytes/s, done.
Total 31 (delta 11), reused 0 (delta 0)
To /path/to/bare/repo.git
 * [new branch]      master -> master
Branch master set up to track remote branch master from origin.

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

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


4
Цікаво. Звичайно, більш детально, ніж моя відповідь. +1
VonC

13
Ця відповідь вирішує мою проблему і повинна бути прийнятою відповіддю, сподіваюся, що все більше людей можуть проголосувати за неї.
inix

11
Ви повинні стягнути гроші за такі відповіді
Артур Тарасов

2
Як новий користувач git, ця відповідь була неймовірно корисною для мене, дякую, що написав це!
sidewinderguy

1
Це геніальна відповідь. Дуже допоможе нашому підрозділу.
wobsoriano

33

Відповідаючи на запитання по черзі:

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

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

Мати центральний сховище - єдиний спосіб - це bareсховище.


22

Ви також можете попросити git створити для вас каталог:

git init --bare test_repo.git

20

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

Якщо у вас SVN-фон, ви можете відновити репортаж SVN до Git gore repo. У ньому немає файлів у репо-файлі в оригінальному вигляді. Тоді як ваше місцеве репо має додаткові файли, що утворюють ваш "код".

Вам потрібно додати пульт дистанційного керування до голосного репо з місцевого репо і натиснути на нього свій "код".

Це буде щось на зразок:

git remote add central <url> # url will be ssh based for you
git push --all central

Використовуючи git remote add central <url>, у разі SSH, чи включав би це також шлях? наприкладgit remote add central ssh://user@server/home/user/repo.git
Так, Баррі

17

Цього має бути достатньо:

git remote add origin <url-of-bare-repo>
git push --all origin

Дивіться докладнішу інформацію " GIT: Як я можу оновлювати своє репо? ".
Примітки:

  • ви можете використовувати інше ім'я, ніж " origin" для віддаленої віддаленої посилання на репо.
  • це не натисне ваші теги, для цього вам потрібен окремий git push --tags origin.

5

Приємно переконатися, що код, який ви натиснули, справді вчинив.

Ви можете отримати журнал змін у голому сховищі, чітко встановивши шлях, використовуючи параметр --relative.

$ cd test_repo
$ git log --relative=/

Це покаже вам здійснені зміни так, як ніби це звичайний git repo.


5

На основі відповідей Марка Лонгайра та Робопрога:

якщо версія git> = 1,8

git init --bare --shared=group .git
git config receive.denyCurrentBranch ignore

Або:

якщо версія git <1,8

mkdir .git
cd .git
git init --bare --shared=group 
git config receive.denyCurrentBranch ignore

Ця команда config: як це в кінцевому підсумку застосовується до щойно створеного каталогу .git?
GreenAsJade

Я не впевнений, що розумію ваше запитання? Ви можете бути точнішими? Оскільки ваш репозиторій git ініціалізований, ви можете його налаштувати скільки завгодно за допомогою команди 'git config' ..
Jack

@GreenAsJade Це тому, що ви все ще знаходитесь у папці сховища git, тому воно застосовується до цього (за замовчуванням конфігурація git - як опція --local).
BlueCoder

2

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

Наприклад, коли ви додаєте файл у своє місцеве сховище (машина 1) та пересуваєте його до голого сховища, ви не можете побачити файл у голому сховищі, оскільки він завжди "порожній". Однак ви дійсно щось натискаєте на сховище, і ви можете це зрозуміти, явно, клонувавши інше сховище на вашому сервері (машина 2).

І локальне сховище в машині 1, і сховище "копіювати" в машині 2 не є голими. взаємозв'язок між голими та неоголеними сховищами

Блог допоможе вам зрозуміти це. https://www.atlassian.com/git/tutorials/setting-up-a-repository


0

Ви можете виконати наступні команди для ініціалізації вашого локального сховища

mkdir newProject
cd newProject
touch .gitignore
git init
git add .
git commit -m "Initial Commit"
git remote add origin user@host:~/path_on_server/newProject.git
git push origin master

Вам слід працювати над проектом у вашому локальному сховищі та використовувати сервер як центральний сховище.

Ви також можете дотримуватися цієї статті, де пояснюються всі аспекти створення та підтримки сховища Git. Гіт для початківців

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.