Дмитрий Сергеевич (axshavan) wrote,
Дмитрий Сергеевич
axshavan

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

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

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

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

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

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

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

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

Оригинал записи http://axshavan.blogspot.com/2011/01/blog-post_02.html
Tags: работа
Subscribe

  • Post a new comment

    Error

    Comments allowed for friends only

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments