Git: импорт части репозитория

      Комментарии к записи Git: импорт части репозитория отключены

Главная Форумы Программирование Git: импорт части репозитория

В этой теме 0 ответов, 1 участник, последнее обновление  Васильев Владимир Сергеевич 1 месяц, 3 нед. назад.

  • Автор
    Сообщения
  • #3213

    Периодически возникает задача включить в свой репозиторий часть из другого репозитория. Чаще всего это нужно для подключения различных библиотек. Например, если хочется воспользоваться одним из компонентов ZendFramework-а, но нет желания включать весь проект. Боле-мене рабочий способ требует наличия модуля git-subtree.

    Предположим, наш проект имеет следующую структуру:

    application/
    library/
    App/
    ...
    tests/
    …

    В каталог library/ будем подключать подкаталог Zend/Log из репозитория ZF2. Из всего репозитория нужно взять только Zend/Log. Т.е. в итоге должно получиться так:

    application/
    library/
    App/
    Zend/
    Log/
    ...
    tests/
    …

    Импорт части репозитория с git-subtree

    Во-первых, добавим удаленный репозиторий:

    > git remote add zf2 http://github.com/zendframework/zf2
    > git fetch zf2

    Теперь извлечем из него код в отдельную ветку:
    > git checkout -b projects/zf2 zf2/master

    Теперь выделим нужный нам каталог в собственную ветку:
    > git subtree split --prefix=library/Zend/Log --annotate="[zend_log] " --rejoin -b subtrees/zend_log

    Следующим шагом сольем эту ветку в наш мастер:

    > git checkout master
    > git subtree add --prefix=library/Zend/Log --squash subtrees/zend_log
    
    Added dir 'library/Zend/Log'

    На этом импорт закончен. Теперь в репозиторий есть подкаталог library/Zend/Log. Таким образом, мы решили проблему с включением этого кода в проект, но обрели новую проблему — поддержание импортированного кода в актуальном состоянии.

    Обновление импортированного подкаталога

    Напомню, что в процессе импорта мы создали две ветки: projects/zf2 и subtrees/zend_log. Чтобы обновить код, обновим мастер-ветку репозитория ZF2:

    > git checkout projects/zf2
    > git fetch zf2
    > git rebase zf2/master

    Затем снова выделим подкаталог:

    > git subtree split --prefix=library/Zend/Log --annotate="[zend_log] " --rejoin -b subtrees/zend_log

    После чего сольем его с нашим мастером:

    > git checkout master
    > git subtree merge –prefix=library/Zend/Log –squash subtrees/zend_log[/shell]

    Заключение

    Не такой уж и удобный способ, но лучше я пока не нашел. На мой взгляд у него две проблемы:

    • сложность в обновлении импортированного кода
    • необходимость создавать ветки для каждого нового донора кода и каждого импортируемого подкаталога.

Для ответа в этой теме необходимо авторизоваться.