Ответ 1
У меня есть несколько вопросов, и с учетом этого ответ ниже довольно общий. Если вы ответите на мои вопросы, я с удовольствием обновлю его.
-
Содержит ли композитор репозиции при обновлении? ИЛИ отменить репо? (Он даже делает обновления?)
- Если он повторяет, то использование его для обновлений будет рисковать перезаписыванием рабочего дерева в этих подпорах (использовать его для установки ТОЛЬКО или удалить все вместе)
- Если он не выполняет обновления (или рекурсия зависимостей - см. ниже), то он добавляет к вашему проекту ненужную сложность (удалить его и использовать один из параметров ниже)
-
Является ли композитор фактически управлением зависимостями (т.е. рекурсивным, чтобы найти вложенные зависимости)? Или это просто клонирование проектов git в качестве подпапок?
- Если это так, то да, подмодули могут быть непринужденными для вашего случая, так как они являются альтернативной системой управления зависимостями, но если ваши подпроекты также управляют своими зависимостями с подмодулями, то выполните
git clone --recursive
должен работать и для управления ими.
- Если это так, то да, подмодули могут быть непринужденными для вашего случая, так как они являются альтернативной системой управления зависимостями, но если ваши подпроекты также управляют своими зависимостями с подмодулями, то выполните
-
Хотите, чтобы ваш мастер-проект отслеживал новые изменения в ваших подпроектах?
- Если да: посмотрите вариант # 2: субрепозитории
- в противном случае: попробуйте вариант # 1: подмодули
- [есть третий вариант, к которому я привяжусь, но я его не использовал, поэтому не могу объяснить подробно (комментарии/исправления оценены)]
Вариант №1: Submodules
Вы также можете управлять отдельным подмодулем cd LOCAL_DIR_NAME_I
и с помощью обычных команд git
- Настройка:
git submodule add REMOTE_URI_1 LOCAL_DIR_NAME_1
...
...
git submodule add REMOTE_URI_N LOCAL_DIR_NAME_N
git commit -m "Add submodules..."
-
Клонирование (основной проект)
git clone MAIN_URI REPO && cd REPO && git submodule update --init --recursive
--init
скопирует конфигурацию из .gitmodules в .git/config перед выполнением обновления (если необходимо), а--recursive
сделает это действие рекурсивно в каждом подмодуле.или
git clone --recursive MAIN_URI
--recursive
сообщает git обновлять и инициализировать все подмодули при клонировании -
Обновление (сохранит несохраненные изменения)
- Локальная копия не имеет отложенных изменений (по умолчанию обновляет все подмодули):
git submodule update [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]
- Локальная копия имеет несложенные изменения (по умолчанию обновляет все подмодули):
git submodule update --remote --rebase [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]
-
Издательство/Нажатие
Это сначала пробуждает подмодуль, а если успешно выполняет основной проект, нажмите
git push --recurse-submodules=on-demand
Вариант № 2: Subrepositories
Вы сказали, что у вас проблемы с этим методом, но я не понимаю, что это такое. Пожалуйста, уточните, если это возможно.
(в книге git также говорится о subrepos, но я не могу, чтобы жизнь меня находила, где, прямо сейчас, дайте мне знать, если вы ее найдете)
- Настройка:
ПРИМЕЧАНИЕ. Мастер-репо не будет отслеживать изменения в subrepo.git, только в файлах с файлами
Слэш (/) после имени каталога имеет важное значение, чтобы избежать создания подмодуля
git clone REMOTE_URI_1 LOCAL_DIR_NAME_1 && git add LOCAL_DIR_NAME_1/
...
...
git clone REMOTE_URI_N LOCAL_DIR_NAME_N && git add LOCAL_DIR_NAME_N/
git commit -m "Add subrepos..."
Если вы используете Composer: (и он делает клоны для вас), вы можете просто добавлять и комментировать, но, возможно, вы также можете настроить композитор для этого.
- Управление
Управляйте отдельным подстроком: `cd LOCAL_DIR_NAME_N 'и используйте обычные команды git
Помните, что изменения в ваших файлах subrepo будут отслеживаться вашим основным репо
Самая большая проблема здесь заключается в клонировании (если вы хотите, чтобы colaborators могли работать над подпроектами), так как ваши файлы subrepo.git не отслеживаются. В том числе файл, remote.info в каждом подрепо, который хранит пульт, должен решить эту проблему. Затем добавьте script к вашему основному репо, которое выполняется для каждого подкаталога cd SUBDIR && git init && cat remote.info | xargs git remote add origin
. В зависимости от того, что делает Composer (см. Вопросы выше), вы можете добавить команду composer update
к этому script
Вариант № 3: Слияние с субтитрами
Я не совсем уверен в тонкостях этого метода, поэтому я просто свяжусь с ним
Попробуйте эту ссылку для небольшого учебника
Вариант #N: любой способ, который вы хотите
Конечно, вы можете настроить множество других рабочих потоков, которые в некоторых случаях могут быть проще. Например, вы можете придерживаться Composerдля управления оттиском и клонировать ваши подпроекты вне вашего основного проекта, создавая невосстановленные символические ссылки в основном проекте, чтобы обеспечить легкий доступ к этим файлам при работе над основным проектом. Это может быть автоматизировано с помощью script (так же как и пакетное нажатие всех этих репозиториев). Возможно, вы даже можете разобрать композитор .json, чтобы автоматически сделать это для новых (git) зависимостей.
Примечание. Мне кажется, что вам не нужно использовать Composer вообще. Если это допущение неверно, возможно, что ни один из трех вариантов выше не решит ваши проблемы.