Отдельный файл в виде подмодуля Git - PullRequest
14 голосов
/ 13 ноября 2010

Я пытаюсь выяснить лучшие практики для общего кода среди репозиториев Git.

До сих пор я, очевидно, сталкивался с подмодулями, которые кажутся - почти - отвечают всем требованиям.Мой проект представляет собой PHP MVC-фреймворк с простой структурой:

  • / app
  • core.php
  • / core

Гдеapp - это папка, содержащая специфичные для приложения контроллеры, модели, виды и т. Д., В то время как core содержит общие контроллеры, например, контроллер входа в систему.Сам файл core.php является глобальным обработчиком для всех запросов.

Таким образом, общий код для всех моих развертываний этой инфраструктуры MVC - core.php и core.

.Я вижу, как можно превратить core в подмодуль Git, но не core.php.

Возможно ли это вообще?Нужно ли реструктурировать мой фреймворк так, чтобы core.php находился внутри папки core, чтобы я мог сделать всю папку субмодулем, или есть лучший способ?

Ответы [ 3 ]

8 голосов
/ 14 ноября 2010

Если вы можете использовать символические ссылки (например, вы не используете Windows), то вы можете настроить core и core.php следующим образом:

# "base" repository layout:
core/
core.app

# each app repository layout:
base/
  core/
  core.php
core -> base/core/
core.php -> base/core.php
app/

В каждом репозитории приложений base/каталог - это или подмодуль, который использует «базовый» репозиторий, или слияние поддеревьев «базового» репозитория.

Оба метода позволят вам начать вносить изменения в базовый код в контексте определенного приложения и позже.перенести эти изменения обратно в основной базовый репозиторий.При использовании подмодулей вы должны быть осторожны, чтобы всегда публиковать новые базовые коммиты, прежде чем публиковать любые коммиты приложений, которые ссылаются на эти новые базовые коммиты (это не проблема при использовании слияний поддеревьев, поскольку каждое приложение «плоское» и фактически имеет свою собственную копиюbase).

Сторонняя команда git subtree выглядит очень хорошим способом управления объединением поддеревьев, если вы решите использовать подмодули.

Поддерево

git init newapp
cd newapp
ln -s base/core
ln -s base/core.php
git add core core.php
git commit -m'point to base (to be added next)'

# hook up base
git subtree add --prefix=base git@git.example.com:me/app_base.git master

mkdir app
# edit app/bar.php

# update base
git subtree pull --prefix=base git@git.example.com:me/app_base.git master

.
|-- .git/
|   |-- ...
|   `-- ...
|-- app/
|   `-- bar.php
|-- base/
|   |-- core/
|   |   `-- foo.php
|   `-- core.php
|-- core -> base/core/
`-- core.php -> base/core.php

Подмодуль

git init newapp
cd newapp
ln -s base/core
ln -s base/core.php
git add core core.php
git commit -m'point to base (to be added next)'

# hook up "base"
git submodule add git@git.example.com:me/app_base.git base
git commit -m'incorporate base'

mkdir app
# edit app/bar.php

# update base
(cd base && git fetch origin && git merge origin/master)
git add base
git commit -m'updated base'
.
|-- .git/
|   |-- ...
|   `-- ...
|-- .gitmodules
|-- app/
|   `-- bar.php
|-- base/
|   |-- .git/
|   |   |-- ...
|   |   `-- ...
|   |-- core/
|   |   `-- foo.php
|   `-- core.php
|-- core -> base/core/
`-- core.php -> base/core.php
4 голосов
/ 13 ноября 2010

Возможно, вам лучше поддерживать core.php и core в отдельном репозитории, а затем использовать его как удаленный.Тогда вы можете управлять им, включив его в любой используемый проект.Для этого просто запустите новый проект в качестве отдельного репозитория git, а затем извлеките репозиторий «core» как поддерево.

В этой главе показано, как это сделать:

Обновленная ссылка: http://git -scm.com / book / en / v2 / Git-Tools-Advanced-Merging # _subtree_merge Оригинальная ссылка: https://git -scm.com / book / en/ v1 / Git-Tools-Subtree-Merging

Это немного лучше, чем установка, рекомендованная в предыдущем разделе книги (6.6).

Посмотрите на это;это может быть полезно.

4 голосов
/ 13 ноября 2010

Подмодуль - это git-репозиторий со своим собственным каталогом .git, поэтому он должен содержаться в каталоге. Я не верю, что есть способ легко обойти это. Вам нужно как-то упаковать свои вещи в каталог - и если core.php идет с вещами в ядре, то для них вполне логично быть вместе в репозитории подмодулей!

ответ rmk , предлагающий сделать все это в одном репо, с использованием core и core.php в качестве отправной точки - еще один разумный вариант. Вы должны принять решение на основе ожидаемого рабочего процесса. Подмодуль подойдет, если вы планируете модифицировать основной контент * отдельно от проектов, которые его используют; затем вы можете обновить подмодули в различных проектах, которые его используют. Базовый репозиторий будет полезен, если вы хотите изменить содержимое ядра * в соответствии с конкретным проектом; затем вы можете извлекать данные из базового репо, чтобы получать обновления, объединяя их с изменениями, внесенными в репо проекта.

...