Subrepos/Субрепозитории в Mercurial
Бывает, что вы используете в ваших проектах несколько тулкитов, фреймворков и тд. И держать копии репозиториев фреймворков в репозитории некрасиво да и мониторить изменения сложно. Для решения этой проблемы в Mercurial есть механизм Subrepos.
Дано
У нас есть проект. Большой и жирный. Там используется фреймворк для PHP, для Javascript и для CSS. Это всё имеется у вас и в других проектах и переодически кто-то да что-то вносит в них. То есть, у нас есть такая структура проектов:
- one_project
- Zend_Framawork
- My_CSS
- JQuery
- second_project
- JQuery
- Zend_Framawork
- Zend_Framawork
- JQuery
- My_CSS
И вот в проекте one_project изменили что-то в My_CSS. Что делать? Есть вариант вручную изменять и во втором проекте. Но это не выход, да и проблема ещё та.
Что делать?
А давайте создадим репозитории для наших библиотек и подключим их к основным проектам. Будем иметь список репозиториев:
- one_project
- second_project
- Zend_Framawork
- JQuery
- My_CSS
Теперь каждая библиотека отдельная и можно вносить изменения и получать их по отдельности. Можно это делать руками и даная структура позволяет этим заниматся, но мы же упрощаем себе жизнь, а не запутываем себя и разработчиков!
Создаём субрепозитории
Пускай у нас уже есть развёрнутый репозиторий.
wert2all@linux:~/phpProjects/featerequest> hg status
M classes/Ext/Controller/Auth.php
M classes/Ext/Controller/Index.php
M conf/config.php
M static/css/reset.css
! templates/default/index/index.html
! templates/default/main.html
? classes/Smarty/.DS_Store
? templates/default/index/index.tpl
? templates/default/main.tpl
wert2all@linux:~/phpProjects/featerequest>
Создадим ещё один репозиторий:
wert2all@linux:~/phpProjects/featerequest> hg init library
wert2all@linux:~/phpProjects/featerequest> ls
classes featerequest.kdev4 _index.html info.php library templates
conf files index.php init.php static tmp
wert2all@linux:~/phpProjects/featerequest>
Появился каталог library в который мы вкинем наш репозиторий с нужным фреймворком. Все репозитории у меня хранятся на другом сервере ивот их структура:
repo@linux:~> ls -l
загалом 20768
drwxr-xr-x 3 repo nobody 4096 вер 4 16:47 featuresrequest
drwxr-xr-x 8 repo nobody 4096 сер 3 12:52 W_library
repo@linux:~>
featuresrequest – это мой проект. W_library – набор библиотек, тоесть субрепозиторий. Вот его мне и надо подключить в library.
Приступим:
wert2all@linux:~/phpProjects/featerequest> echo library=../W_library > .hgsub
wert2all@linux:~/phpProjects/featerequest> cat .hgsub
library=../W_library
wert2all@linux:~/phpProjects/featerequest>
Мы сдали файл .hgsub и указали где лежит наш субрепозиторий.
Теперь создадим файл hgrc в нашем субрепозитории, чтобы Mercurial знал откуда его получать:
wert2all@linux:~/phpProjects/featerequest> vi library/.hg/hgrc
[paths]
default = ssh://repo@localhost//home/repo/W_library
Я указал свой путь к репозитарию. Теперь можно получить этот субрепозитарий:
wert2all@linux:~/phpProjects/featerequest> cd library/
wert2all@linux:~/phpProjects/featerequest/library> hg pull
Password:
pulling from ssh://repo@localhost//home/repo/W_library
requesting all changes
adding changesets
adding manifests
adding file changes
added 3 changesets with 2964 changes to 2876 files
(run 'hg update' to get a working copy)
wert2all@linux:~/phpProjects/featerequest/library> hg update
2876 files updated, 0 files merged, 0 files removed, 0 files unresolved
wert2all@linux:~/phpProjects/featerequest/library>
Теперь можно делать комиты в разне репозитории и пушить на сервер. И никаких копирований.
wert2all@linux:~/phpProjects/featerequest> hg push
Password:
pushing to ssh://repo@localhost//home/repo/featuresrequest
pushing subrepo library to ssh://repo@localhost//home/repo/W_library
Password:
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 1 changesets with 88 changes to 88 files
searching for changes
remote: adding changesets
remote: adding manifests
remote: adding file changes
remote: added 13 changesets with 3341 changes to 3130 files
wert2all@linux:~/phpProjects/featerequest>
Почитать
Всёэто я взял с Mercurial Wiki