Подтвердить что ты не робот

GIT Вложенные репозитории: Composer vs. SubModules vs. Subtree vs.

Наконец, я включил управление зависимостями GitHub и Composer в свой рабочий процесс. Это определенно огромный шаг вперед, хотя я очень смущен тем, что GIT управляет "вложенными" зависимостями.

Поскольку я использую потрясающий Wordpress Stack ROOTS/BEDROCK, моя упрощенная структура каталогов выглядит так:

|-- /project
|   |-- /.git                    // git repository for the skeleton/stack of the project
|   |-- composer.json            // list of dependencies, most of them are my own repositories on GitHub
|   |-- /vendor
|   |   |-- /php-dependency-1    // 3rd party dependencies not directly related to Wordpress
|   |-- /web
|   |   |-- /app                 // acts as "wp-admin" folder
|   |   |   |-- /mu-plugins       
|   |   |   |   |-- /SUBREPOSITORY-1    // my own framework feature, public, GitHub
|   |   |   |   |-- /SUBREPOSITORY-2    // my own framework feature, public, GitHub
|   |   |   |-- /plugins
|   |   |   |   |-- /SUBREPOSITORY-3    // my own plugin, public, GitHub
|   |   |   |-- /themes
|   |   |   |   |-- /SUBREPOSITORY-5-PARENT-THEME    // parent theme used on my framework, public, GitHub
|   |   |   |   |-- /SUBREPOSITORY-6-CHILD-THEME     // work for client, private, BitBucket
|   |   |-- /wordpress           // Wordpress CMS
|   |   |   |-- /wp-admin
|   |   |   |-- /wp-includes

"Subrepositories" определены в моем composer.json в корне проекта и загружаются из GitHub на composer install. Пока все хорошо.

Но! Я ожидаю, что я немного подкорректирую свои parent-theme и некоторые mu-plugins, мне нужно иметь возможность push/commit из каждого из моих проектов, которые они будут включены. Как вы знаете, вы не можете проверить тестовую тему без установки wordpress...

Итак... в какую сторону? Здесь много сообщений об этой теме, и большинство из них упоминает SubModules, но если я правильно поняла идею Composer, они как бы конфликтуют друг с другом.

Просто используйте вложенные репозитории .git, кажется, отлично подходит для моего случая, хотя это, похоже, не работает - если я попытаюсь нажать/зафиксировать вложенное репо, либо "все в актуальном состоянии", либо я получаю такие сообщения, как Your branch is ahead by 1 commit. Так что просто "вложенность" - это не выход?

Спасибо заранее и извините за немного запутанный тон вопроса, я немного утонул в теме.:) Любая помощь будет очень признательна.

4b9b3361

Ответ 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..."
  1. Клонирование (основной проект)

    git clone MAIN_URI REPO && cd REPO && git submodule update --init --recursive

    --init скопирует конфигурацию из .gitmodules в .git/config перед выполнением обновления (если необходимо), а --recursive сделает это действие рекурсивно в каждом подмодуле.

    или

    git clone --recursive MAIN_URI

    --recursive сообщает git обновлять и инициализировать все подмодули при клонировании

  2. Обновление (сохранит несохраненные изменения)

    • Локальная копия не имеет отложенных изменений (по умолчанию обновляет все подмодули):

    git submodule update [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]

    • Локальная копия имеет несложенные изменения (по умолчанию обновляет все подмодули):

    git submodule update --remote --rebase [LOCAL_DIR_NAME_I ... LOCAL_DIR_NAME_J]

  3. Издательство/Нажатие

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

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: (и он делает клоны для вас), вы можете просто добавлять и комментировать, но, возможно, вы также можете настроить композитор для этого.

  1. Управление

Управляйте отдельным подстроком: `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 вообще. Если это допущение неверно, возможно, что ни один из трех вариантов выше не решит ваши проблемы.