Git - включаем подпроекты (submodules) в свой репозиторий

git

Одной очень крутой фичей git'а является , которая позволяет в текущем репозитории проекта держать репозитории сторонних проектов с возможностью раздельного обновления не "ломая" наш основной проект.

В этом материале я покажу как просто такого рода поведения достигается!

Итак, у нас есть репозиторий projectname и в нём нам понадобился, для примера, Twitter Bootstrap. Добавляю submodule следующей командой:

1234567
git submodule add https://github.com/twbs/bootstrap.git bootstrapCloning into 'bootstrap'...remote: Counting objects: 58544, done.remote: Compressing objects: 100% (22533/22533), done.remote: Total 58544 (delta 36061), reused 58134 (delta 35751)Receiving objects: 100% (58544/58544), 54.58 MiB | 2.48 MiB/s, done.Resolving deltas: 100% (36061/36061), done.

Всё просто: git создал в корне текущего проекта файл .gitmodules и теперь наш проект знает о зависимости от "стороннего" репозитория. Листинг .gitmodules:

1234
cat .gitmodules[submodule "bootstrap"]        path = bootstrap        url = https://github.com/twbs/bootstrap.git

Теперь, на мой взгляд, стоит выбрать конкретную версию проекта, которая нам интересна:

1234567891011
cd bootstrap/git tag...v3.0.1v3.0.2v3.0.3v3.1.0v3.1.1git checkout v3.1.1Note: checking out 'v3.1.1'.HEAD is now at a365d86... grunt

Отлично! Теперь наш репозиторий знает, что у нас есть submodule, который ссылается на конректный публичный комит в другом репозитории. Состояние нашего репозитория неоднозначно:

12345678910111213
git stOn branch masterChanges to be committed:  (use "git reset HEAD <file>..." to unstage)         new file:   .gitmodules        new file:   bootstrap Changes not staged for commit:  (use "git add <file>..." to update what will be committed)  (use "git checkout -- <file>..." to discard changes in working directory)         modified:   bootstrap (new commits)

Несмотря на то, что в папке bootstrap появилось много файлов - ни одни из них не попал под управление контроля версий нашего основного репозитория. Наш репо видит этот  submodule единой папкой с изменённым состоянием. 

Что дальше?

Как всегда: add, commit, push etc. После - клонирование проекта другим разработчиком. Идея в том, что наш проект содержит в себе свой исходный код и файл .gitmodules, который в случае правильных действий получит именно тот комит, который мы задумали для нашего зависимого проекта. Теперь, чтобы другой разработчик всё получил как надо, достаточно:

123
git clone projectname.gitgit submodule initgit submodule update

 

Добавить комментарий

Содержание этого поля является приватным и не предназначено для показа.

Plain text

  • Разрешённые HTML-теги: <a> <em> <strong> <cite> <blockquote> <code> <ul> <ol> <li> <dl> <dt> <dd>
  • Адреса страниц и электронной почты автоматически преобразуются в ссылки.
  • Строки и параграфы переносятся автоматически.