Как мне организовать Git репо - PullRequest
6 голосов
/ 13 июля 2011

У меня возникла следующая проблема, и у меня нет ответа на нее:

У нас есть репо, клонированное из репозитория SVN.Проект, хранящийся в этом репо, представляет собой нечто вроде программного обеспечения платформы, которое используется различными проектами.Структура репо выглядит следующим образом:

platform
  |- core
  |- additional

Структура этого репо не может быть изменена по некоторым причинам.И core, и additional содержат данные, которые являются частью этого platform.

Если проект хочет использовать платформу и добавить некоторые функции, он создает новую папку в additional, содержащуюИсходники и добавляет заголовок для этой функциональности в additional/includes

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

Сначала я имел в виду подмодулей : оставьте platform подмодулем в суперпроекте (называемом super), а затемперейдите к super/platform/additional/mystuff, создайте там источники и добавьте их к super.Но это, очевидно, не работает, потому что файлы находятся внутри подмодуля platform.

Есть ли лучший способ организовать мое репо, чтобы:

  • пользователей платформымогут обновлять свою рабочую копию из центрального репо
  • И пользователи платформы могут применять исправления ошибок к репо platform
  • И проекты, использующие platform, не портят репо platform?

РЕДАКТИРОВАТЬ 1 : Высокосвязанные подмодули git охватывает довольно немного сценария, в котором я нахожусь: тесно связанные вещи, я единственный, кто знает немного больше, чем абсолютные основы git: «Большинство разработчиков имеют только очень поверхностное знание git».Идеальное совпадение!


РЕДАКТИРОВАТЬ 2 : Хотя ответ от Майкл выглядит многообещающе, я думаю, что его слишком сложно использовать.Я ищу действительно простую вещь, которая не требует особого взаимодействия.

1 Ответ

6 голосов
/ 13 июля 2011

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

Мое решение для этого будет следующим:

  • У вас есть один центральный репозиторий для платформы .
  • У вас есть один центральный репозиторий для проекта .
  • Каждый разработчик имеет свой собственный локальный репозиторий.

Центральный репозиторий платформы

Это место, куда идет только код платформы.Используйте, например, свое существующее хранилище в качестве отправной точки.

Центральный репозиторий проектов

Это клон репозитория платформы, в котором хранится весь код проекта.Инициируйте его с помощью

$ git clone --bare /path/to/platform

Локальное хранилище разработчика

Инициация

Вы, как разработчик, начинаете с клонирования репозитория проекта.

$ git clone /path/to/project

Внесение изменений в проект

Теперь внесите свои изменения, зафиксируйте их и отправьте в проекты с открытым репо.

$ editor some-file
$ git add -p some-file
$ git commit
$ git push

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

Внесение изменений в платформу

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

$ git remote add platform /path/to/platform
$ git fetch platform

Как вы теперь можете видеть с git branch -a, ваше локальное репо знает о платформе.Теперь вы хотите внести некоторые изменения в платформу.Сначала вы создаете локальную ветку central , которая является клоном главной ветки репозитория платформы:

$ git checkout -b central platform/master

Вы всегда можете проверить, на какой ветке вы находитесь, используя git branchили git status.Теперь вы вносите свои изменения и фиксируете их (в центральном, где вы находитесь).Поскольку central подключен к platform / master (checkout cat .git/config), вы можете отправить свои изменения в репозиторий платформы, просто используя git push.Также git pull работает без каких-либо других аргументов.

Используйте git checkout master и git checkout central для переключения между ветками.

Получите новую версию платформы в свой проект

Примечание: Вы должны выполнить работу из предыдущего раздела .

Сначала перейдите в ветку вашей платформы и добавьте новую версию платформы:

$ git checkout central
$ git pull

Теперь вернитесь в ветку вашего проекта и объедините изменения, сделанные на платформе, с веткой вашего проекта.

$ git checkout master
$ git merge central

Если возникает конфликт, происходит что-то подобное:

$ git merge central
Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

Откройте файлы с конфликтами, разрешите их, добавьте их в промежуточную область и подтвердите слияние:

$ editor index.html
$ git add index.html
$ git commit

Теперь внесите изменения в репозиторий проекта:

$ git push

Подробнее о конфликтах слияния: Pro Git: базовые конфликты слияния

Если вы не хотите менять репозиторий платформ, но объедините изменения оттуда в свой проект, используйте

$ git remote add platform /path/to/platform
$ git fetch platform
$ git merge platform/master

git remote add нужна только пихтав первый раз ты сливаешься.Два других всегда требуются.


Часть о слиянии основана на Pro Git Book , который лицензирован по лицензии cc-by-sa.Все остальное содержание этого поста может считаться общественным достоянием.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...