Отдельный файл как подмодуль Git
Я пытаюсь установить лучшие методы для общего кода среди репозиториев Git.
До сих пор я, очевидно, сталкивался с подмодулями, которые кажутся похожими на них - почти - соответствуют законопроекту. Мой проект представляет собой структуру PHP MVC с простой структурой:
- /приложение
- core.php
- /ядро
Где app
- это папка, содержащая контроллеры приложений, модели, представления и т.д., в то время как core
содержит файлы общего назначения, например. контроллер входа. Сам файл core.php
является глобальным обработчиком для всех запросов.
Таким образом, общий код среди всех моих развертываний этой структуры MVC - core.php
и core
.
Я вижу, как можно превратить core
в подмодуль Git, но не core.php
.
Возможно ли это? Нужно ли мне перепроектировать мою фреймворк, чтобы core.php
находился внутри папки core
, чтобы я мог сделать всю папку подмодулем, или есть лучший способ?
Ответы
Ответ 1
Возможно, вам лучше всего поддерживать 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).
Посмотрите на это; это может быть полезно.
Ответ 2
Если вы можете использовать символические ссылки (например, вы не используете 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/
представляет собой либо подмодуль, который использует "базовый" репозиторий, либо слияние поддерева "базового" репозитория.
Оба метода позволят вам вносить изменения в базовый код в контексте конкретного приложения, а затем возвращать эти изменения обратно в основной базовый репозиторий. При использовании подмодулей вы должны быть осторожны, чтобы всегда публиковать новые базовые коммиты перед публикацией любого приложения, которое связывает эти новые базы с фиксацией (это не проблема при использовании слияния поддерева, потому что каждое приложение "плоское" и эффективно имеет свою собственную копию основание).
Сторонняя команда 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 [email protected]:me/app_base.git master
mkdir app
# edit app/bar.php
# update base
git subtree pull --prefix=base [email protected]:me/app_base.git master
.
|-- .git/
| |-- ...
| `-- ...
|-- app/
| `-- bar.php
|-- base/
| |-- core/
| | `-- foo.php
| `-- core.php
|-- core -> base/core/
`-- core.php -> base/core.php
Submodule
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 [email protected]: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
Ответ 3
Подмодуль - это репозиторий git со своим собственным каталогом .git, поэтому он должен содержаться в каталоге. Я не верю, что можно легко обойти это. Вам придется упаковать ваши вещи в каталог как-то - и если core.php будет работать с материалом в ядре, им будет вполне разумно быть вместе в репозитории подмодуля!
rmk answer, предлагая вам сделать это всего за один репо, использование ядра и core.php в качестве отправной точки еще одно разумное. Вы должны принять решение на основе ожидаемого рабочего процесса. Подмодуль будет хорошим, если вы планируете модифицировать контент * ядра отдельно от проектов, которые его используют; вы можете затем обновить подмодули в различных проектах, которые его используют. Базовый репозиторий будет хорош, если вы хотите изменить основное * содержимое в соответствии с конкретным проектом; вы можете перейти от базового репо, чтобы получать обновления, объединяя их с изменениями, внесенными вами в репо проекта.