Використання git як центрального сховища


12

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

Однак лише одна з моїх розробних машин має статичний IP. Мій мозок застряг у режимі CVS, тому я спробував налаштувати git, щоб ця машина була «центральним» сервером, з якого витягуються всі інші.

Цей вид робіт. У мене є купа машин змінного струму, які роблять git-тягнути від 'master' M. Вони роблять git push для надсилання даних назад.

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

git reset --hard HEAD

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

Щось у моїй ментальній моделі - це геть. Допомога?


Коли ви говорите "master", ви говорите про головне сховище чи про головну гілку?
innaM

master сховище
Алекс Фейнман

1
"master" у контексті git зазвичай є назвою гілки за замовчуванням.
innaM

це, мабуть, належить на SO
Ken Liu

Відповіді:


30

Ви хочете, щоб ваш центральний сховище був голим. Скажіть, машина, на якій вона живе, називається static:

$ ssh static git init --bare /git/myproject.git

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

Робіть розробку на клонах центрального сховища:

$ cd ~/src
$ git clone static:/git/myproject.git

Навіть якщо ви працюєте static, працюйте в клоні:

$ git clone /git/myproject.git

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

Наприклад:

$ git checkout -b fix-bug-in-foo
$ hack
$ git add file.c file.h
$ git commit -m "Fix ..."

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

Можливо, ви підете додому в ту ніч і додали нову функцію. Наступного ранку, ти

$ git checkout master
$ git pull

оновити свого локального майстра, щоб відобразити те, що знаходиться в центральному сховищі.

Але тепер скажіть, що ви виправили помилку foo та готові включити її у свою головну гілку. Спочатку ви хочете інтегрувати його із змінами минулої ночі:

$ git checkout fix-bug-in-foo
$ git rebase master

rebaseКоманда робить свій репозиторій вид , як якщо б ви виправили помилку Foo на вершині нової функції минулої ночі. (Це схоже svn update, але більш гнучко і потужно.)

Тепер, щоб перейти до вашого головного майстра:

$ git checkout master
$ git merge fix-bug-in-foo
$ git push origin master

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


1
Дивовижна відповідь, усуває всі проблеми, які є у вас.
Dan Loewenherz

Моя установка git не сприймає --bare як варіант git init (стара версія ??), але я працював над цим, клонувавши --brease існуюче репо, а потім трохи вручну редагуючи конфігураційні файли.
Алекс Фейнман

Якщо ви використовуєте git 1.6.4.x, це не git init --bareмає інших аргументів. Він буде використовувати або поточний робочий каталог, або налаштування середовища GIT_DIR, якщо він встановлений. Я вважаю, що вам потрібен git 1.6.5.x, щоб взяти аргумент каталогу.
Даррен Холл

4
Це найкраще пояснення робочого процесу, що я бачив, для роботи, яку я виконую.
Грег Грехем

8

Якщо у вас є центральний сервер з центральним сховищем git, це сховище повинно бути bareсховищем. Голі сховища не мають робочих копій файлів у них. Отже, якщо ви працюєте на цій центральній машині, ви працюєте не з центральним сховищем безпосередньо, а з локальним клоном.


6

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

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

$ ssh example.com
$ mkdir dotconf.git && cd dotconf.git
$ git init --bare
$ exit

Це створило порожнє оголене репо на сайті репо.

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

$ cd ~/src/dotconf

chdir в локальний каталог.

$ git remote add origin ssh://example.com/~/dotconf.git

Додайте віддалене РЕПО як джерело, тож натискання / витягання діятиме на це репо.

$ git push origin master

Підштовхніть мого майстра до походження (як це було зазначено раніше через пульт дистанційного керування) Тепер це віддалене репо вважається моїм "центральним репо". Весь мій git push / pull буде взаємодіяти з походженням.

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

$ git clone ssh://example.com/~/dotconf.git

Якщо я хочу займатися розвитком на віддаленому сервері, спершу клонуюсь, а потім натискаю / відтягую назад у голий репо.

$ cd ~/src
$ git clone ~/dotconf.git
$ cd ~/src/dotconf
  * do coding *
$ git push
  * check in from another location *
$ git pull

Вам, ймовірно, доведеться встановити git config --add branch.master.remote originтак, щоб git pullне скаржитися, що ви недостатньо конкретні. Інша альтернатива - встановити свою головну гілку на --trackвіддалене походження. Корисно, якщо у вас є кілька відділень.


1

Я саме досліджував цю саму проблему сьогодні. У цій публікації в блозі багато дискусій з цього питання, але думка більшості - це робити те, що сказав Манні. Подивіться на коментар до публікації Девіда Френча щодо інших можливостей, зокрема, що робити, якщо ви в кінцевому підсумку помилково натискаєте на сховище, яке не виконало роботу в індексі чи робочому дереві. "git reset –софт HEAD ^" призведе до запобігання натиснутої зміни, не порушуючи вашу роботу.


2
Одна з проблем, пов’язаних із цим дописом у блозі, - це пропуск корисності індексу. Ось гарна стаття, щоб пояснити, як працювати з git замість git - osteele.com/archives/2008/05/my-git-workflow - включені діаграми робочого процесу.
Даррен Холл
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.