воскресенье, 2 января 2011 г.

Общие файлы в нескольких проектах

У нас на работе есть несколько проектов (прямо сейчас - два), которые мы ведём в Mercurial. Оба на Битриксе. Корень репозитория меркуриала совпадает с корнем сайта, так как мы храним в меркуриале публичную часть тоже, но весь Битрикс в игноре. Часть функционала в обоих проектах одинаковая - это всякие наши утилиты.

Задача такая: надо сделать так, чтоб изменения в общем для обоих проектов функционале отслеживались в обоих проектах, а изменения уникального функционала - только в своём проекте. Проще говоря, когда я дописываю или исправляю что-то в наших надстройках на Битрикс, эти изменения должны отслеживаться в отдельном репозитории и распространяться по всем прочим проектам, эти надстройки использующим.

У меня было несколько идей по поводу того, как это можно реализовать. Самая клёвая, на мой взгляд, идея - это использование хардлинков (напомню - хардлинки это два разных имени одного и того же файла. Как два указателя на одно и то же место на жёстком диске). Я клонирую себе два репозитория - репозиторий проекта и репозиторий утилит, и на все утилиты делаю хардлинки из рабочей папки проекта. Таким образом, любые изменения утилит из рабочей папки проекта (кроме удаления) отразятся и на рабочей папке с утилитами. Создание всех хардлинков в нужных местах можно даже автоматизировать, повесив вызов соответствущих скриптов на хуки. Но у этой идеи есть большой недостаток - она некроссплатформенна: не во всех операционных системах есть хардлинки :(

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

Были и другие идеи - параллельное использование разных систем контроля версий для этих файлов. Например, в меркуриале хранится весь проект, и в этой же папке рабочая копия системы контроля версий git, который игнорирует все файлы, кроме нужных (разумеется, hg и git должны тоже игнорировать присутствие друг друга) - но это вообще пипец.

Ну или копипастить туда-сюда всё вручную тоже можно...

Наверняка полно народу с подобной задачей уже сталкивалось, а я, аки первопроходец, вместо того, чтоб пользоваться гуглом, наступаю на те же грабли :)

1 комментарий:

  1. А вот что рекомендуют люди в каком-то интернете:
    http://mercurial.selenic.com/wiki/Subrepository

    ОтветитьУдалить

Ублюдочный Гугл поломал форму комментариев. Извините.