Git, суб-репо и внешние библиотеки для веб-разработки - лучшая стратегия раз и навсегда? - PullRequest
16 голосов
/ 09 октября 2011

Это настолько распространенный сценарий, что должно быть разумное решение, но, несмотря на страницы чтения и обильную гимнастику Git, у меня болит мозг, и я не могу заставить это работать ...

Я 'Я работаю с Wordpress, хотя это будет соответствовать большинству сценариев разработки сайтов.Я хочу управлять установкой сайта с помощью git-репозитория, а также управлять различными плагинами WP, плагинами jQuery и другими фрагментами кода в отдельных репозиториях, которые можно легко извлечь / извлечь из их внешних источников.Кажется достаточно простым, пока вы не посмотрите на детали ...

Критерии

Критерий "подпапок" Папка для каждого плагина не должна быть привязана к корневой папкеего источник репо.Многие репозитории имеют несколько вложенных папок, таких как «my-repo-name / ...», «dev /», «test /», «src /», где требуется содержимое более поздней версии.Это важно для обеспечения чистоты ссылочных URL-адресов и минимизации общедоступного мусора.

Критерий «без прокси» Идеальное решение не требует дополнительных промежуточных веток или репо.Внесение изменений во внешний источник плагина должно быть простым и не требовать множественных промежуточных слияний / толчков.

Критерий «реальных файлов» В идеале, внешнее репо для всего сайта должно фактически содержать файлы подпунктов плагинов (то есть не иметь «подмодулей»).Я могу быть убежден в этом, хотя ...

Критерий "Публикация" Он должен хорошо работать с rsync и / или git push'ing на живой сервер

Я рассмотрел эти пять решений

Подмодули Git Достаточно прост для внесения изменений и извлечения / извлечения, но подмодули не работают по критериям "Подпапки" и "Реальный файл"

Git read-tree / subtree merge Решает проблему "реальных файлов", а read-tree фактически позволяет вам ссылаться на подпапку ветви, но когда я это сделал и попытался объединить изменения в основной ветке вверх по течению, Git не удалосьпомнить, что он пришел из подпапки и объединил всю структуру мастера в ветку отслеживания ext libs ... так что НЕУДАЧИ по этому критерию.

Расширение поддерева Apenwarrs (здесь) Отлично подходит для критерия «Реальные файлы» и довольно прост в использовании push / pull, пока вы не захотите применить правило «Подпапки».В лучшем случае кажется, что для этого требуются промежуточные ветви, в которых вы выделяете нужную папку из удаленной ветви отслеживания, а затем добавляете ее в качестве поддерева в основную ветку.У меня не было особой удачи при слиянии / переносе изменений на главном репозитории.Я все еще думаю, что здесь может быть возможность ...

Символические ссылки с внешним репо Отличное решение, пока GIT не перестал следовать символическим ссылкам.Теперь он не работает по критериям «Реальные файлы» и «Публикация»

Вложенные репо Где-то я видел SO-ответ, где, если вы явно git add папка, которая содержит другое репо и включает конечныйкосая черта, мерзавец не будет субмодулировать его, а вместо этого отслеживать отдельные файлы.Это казалось многообещающим, но не соответствует критерию «Подпапки».

Что дальше?

Я видел ссылки на "редкие проверки" - или, возможно, что-то, связанное с обрезкой ветвей.Я надеюсь избежать решения, которое включает сценарии оболочки или настолько сложное, что требует от меня повторного изучения его каждый раз (нечасто), когда я изменяю плагин.Это должно быть проще, чем поддерживать отдельное репо для каждого плагина и копировать туда и обратно из основной установки CMS.

Конечно, у кого-то есть простой функциональный способ заставить этот общий сценарий разработки работать ??Заранее спасибо за помощь ...

Ответы [ 2 ]

1 голос
/ 01 ноября 2011

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

У нас есть несколько проектов, многие из которых ссылаются друг на друга, каждый в своем собственном Git-репозитории.Они также содержатся в нескольких уровнях папок, например:

Repos
    - Utilities
        - Util repo1
        - Util repo2
    - Common
        - Lib repo1
        - Lib repo2
    - Projects
        - Client1
            - Git repo1
            - Git repo2
        - Client2 repo
        - Client3
        ...

У нас была проблема с ручной загрузкой / извлечением / фиксацией каждого репозитория, что стало кошмаром.Мы написали небольшую служебную программу, которая способна выполнять операции push, pull, commit, tag, remote diff и diff Git для нескольких папок одновременно, а также создавать несколько файлов решений VS одновременно.Он также проверит подпапки на наличие репозиториев.

Мы уже давно используем его, и он отлично работает для нас.Вы можете проверить это здесь: Gitter.7z

Откройте файл ReadMe.html, чтобы узнать, как его использовать.Надеюсь, это поможет, дайте мне знать.

1 голос
/ 12 октября 2011

Очевидно, вы думали об этом, и я только новичок в git, но моим первым инстинктом было бы добавить .gitignore в каталог плагинов и иметь каждый плагин со своим собственным репозиторием git. Вы можете сделать то же самое для тем. Поэтому я думаю, что это больше вопрос, чем ответ - почему этот простой подход не сработает?

...