Использование git в качестве центрального хранилища

12

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

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

Такого рода работы. У меня есть куча машин переменного тока, которые делают git-pull от «master» M. Они делают git push для отправки данных обратно.

Проблема возникает, если я делаю разработку на мастере. Во-первых, я не могу понять, как заставить центральный репозиторий предоставлять последнюю версию, не делая

git reset --hard HEAD

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

Что-то в моей ментальной модели далеко. Помогите?

Алекс Фейнман
источник
Когда вы говорите «мастер», вы говорите о главном репозитории или о главной ветке?
INNAM
главный репозиторий
Алекс Фейнман
1
"master" в контексте git - это обычно имя ветки по умолчанию.
INNAM
это, вероятно, принадлежит SO
Кен Лю

Ответы:

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 ..."

Это может показаться не таким уж большим делом, но дает вам свободу оставить проект, представленный на этой ветке, в частично приготовленном состоянии, или, если ваша крутая идея окажется провалом, вы можете легко выбросить эту ветку без нарушая все остальное в вашем проекте, которое уже работает в других ветках. Бесконечные бесплатные муллиганы!

Может быть, вы идете домой в ту ночь и добавили новую функцию. На следующее утро ты

$ 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
Удивительный ответ, прибивает все вопросы под рукой.
Дэн Левенхерц
Моя установка git не принимает --bare в качестве опции для git init (старая версия ??), но я решил эту проблему путем клонирования --bare моего существующего репозитория, а затем немного вручную отредактировал файлы конфигурации.
Алекс Фейнман
Если вы используете git 1.6.4.x, у него git init --bareнет других аргументов. Он будет использовать либо текущий рабочий каталог, либо параметр среды GIT_DIR, если он установлен. Я считаю, что вам нужен git 1.6.5.x, чтобы он мог принять аргумент каталога.
Даррен Холл
4
Это лучшее объяснение Git Workflow, которое я когда-либо видел для работы, которую я делаю.
Грег Грэм
8

Если у вас есть центральный сервер с центральным git-репозиторием, этот репозиторий должен быть bareрепозиторием. Голые репозитории не имеют рабочих копий файлов в них. Следовательно, если вы работаете на этом центральном компьютере, вы работаете не с центральным репозиторием напрямую, а с локальным клоном.

InnaM
источник
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

Добавьте удаленное репо в качестве источника, чтобы push / pull действовали на это репо.

$ git push origin master

Переместите моего мастера к источнику (как ранее помечено через git remote). Теперь это удаленное репо считается моим «центральным репо». Все мои 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 –soft HEAD ^» отменит внесенные изменения, не мешая вашей работе.

Грег Грэм
источник
2
Одна проблема с этим сообщением блога пропускает полезность индекса. Вот хорошая статья, чтобы объяснить, как работать с git вместо git - osteele.com/archives/2008/05/my-git-workflow - включены диаграммы рабочих процессов.
Даррен Холл