Рабочий процесс Git: без сервера


Git должен быть децентрализованной системой, но все учебники и лучшие рабочие процессы практики, которые я нашел в google, предлагают использовать сервер (обычно github, или же создать свой собственный)

Я использую git для небольших личных проектов (2-3 человека), где я могу найти оптимальный рабочий процесс для синхронизации изменений непосредственно между машинами членов команды. В качестве альтернативы, каковы некоторые убедительные аргументы, почему я должен избегать этого и вместо этого создать "центральный" сервер?

Спасибо,
Бен

7 45

7 ответов:

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

Если под " сервером "вы подразумеваете" установить серверное программное обеспечение", git также будет работать (центральный репозиторий или нет) без какого-либо специального программного обеспечения, через ssh или в файловой системе.

Смотрите этот документ для возможных рабочих процессов

Рабочий процесс с общим репозиторием

Рабочий процесс, который многие используют, это все разработчики "толкают" (отправляют) свои изменения в общий репозиторий и получают все изменения из этого репозитория. Что-то вроде этого:

  • разработчик а толкает к центральному
  • разработчик B нажимает на центральную
  • разработчик C тянет (получая изменения от A и B)
  • разработчик a тянет (получая изменения от B)
  • ...

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

Рабочий процесс с электронной почтой

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

  • разработчик а отправляет изменения команде по электронной почте
  • другие разработчики применяют изменения из писем

Это можно сделать даже полуавтоматическим способом

Рабочий процесс без центрального сервера

Вы можете настроить git на использование нескольких" удаленных " репозиториев. Оговорка заключается в том, что вы должны никогда не нажимайте на репозиторий, который был извлечен (то есть на копию разработчика, над которой кто-то работает). Таким образом, в этом случае поток будет выглядеть следующим образом:

  • разработчик а вносит изменения
  • разработчик B вносит изменения
  • разработчик C извлекает изменения из A
  • разработчик C извлекает изменения из B
  • разработчик B извлекает изменения из A
  • ...
  • никто никогда не должен давить

ИМХО этот тип рабочего процесса быстро приведет к путаница и нервное расстройство.

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

Центральное РЕПО:

mkdir foo.git
cd foo.git
git init --bare

Ваше РЕПО:

mkdir foo
cd foo
git init
// add files
git add .
git commit -m "Initial commit"
git remote add origin //path/to/central/repo/foo.git
git push origin master

Другое РЕПО:

git clone //path/to/central/repo/foo.git

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

Вам не обязательно помещать копию на физический сервер где-то, но это может помочь иметь "благословенный" репозиторий где-то-сделать одного из вашей команды (возможно, на ротации) ответственным за сбор и управление изменениями людей, когда они готовы рассматриваться как окончательные. Они могут либо хранить филиал в своем обычном репозитории, либо поддерживать отдельный репозиторий в своей локальной системе для хранения основных источников.

В качестве конкретного примера рассмотрим Linux и Linus Torvalds -- нет никакого центрального хранилища, к которому все стремятся, но Линус поддерживает хранилище, которое содержит весь код, который он считает "готовым" (и так делают несколько других людей, для различных определений "готов"). Таким образом, у вас есть каноническое определение того, что такое код, и место для определения того, что такое ваши релизы.

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

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

Например, в настоящее время я работаю в команде разработчиков из 3 человек. Мы все работаем на ноутбуках. У нас может быть рабочий поток, где мы просто тянем друг у друга машины. Но если я работаю над функцией и фиксирую свои шансы после того, как все покинули офис, и я хочу, чтобы они взглянули на эту систему, они ничего не могут сделать, если мой ноутбук включен и доступен в сети. Если ребята появляются раньше меня (что они всегда делают), им приходится ждать, пока мой ноутбук не вернется в сеть.

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

Что для меня является главная причина иметь центральный сервер, и на самом деле это не ошибка с Git, а скорее следствие работы с ноутбуками.

Взгляните на Git для начинающих: окончательное практическое руководство

Раздел "Как настроить общий командный репозиторий?"

Git довольно хорошо работает с такого рода настройками, хотя вы захотите избежать переноса изменений в чью-то проверенную ветку ( https://git.wiki.kernel.org/index.php/GitFaq#Why_won.27t_I_see_changes_in_the_remote_repo_after_.22git_push.22.3F). У вас может быть ветвь интеграции, в которую вы отправляете код и объединяете изменения других людей.

Я думаю, что основная причина, по которой центральное РЕПО используется много, заключается в том, что его можно взять за каноническую основу для всех ваших код, в то время как это может быть немного сложнее рассуждать о том, что вы должны объединяться, когда у вас есть 3 или более ветвей разработки происходит.