2014-12-12 2 views
0

Мне интересно, существует ли способ управления версиями дерева каталогов между несколькими (не менее 3) Git репозиториями.Одно рабочее дерево, совместно управляемое несколькими репозиториями?

Вот упрощенная версия моего дерева каталогов. В реальной жизни это веб-каталог для сайта Drupal или Joomla.

root/ 
    index.php # code, managed by application repository 
    configuration.php # secrets, e.g. database password 
    uploads/ # contains user-supplied data 
    temp/  # directory of temporary files, not archived 
    attack.php # attack code or data, unwanted, should be detected 

index.php представляет код моего веб-приложения. Только разработчики вносят свой вклад в это. Мы хотим, чтобы он контролировался версиями. Мы хотим полагаться на Git для развертывания на промежуточных и производственных серверах.

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

uploads/ представляет файлы и деревья каталогов, содержащие данные, предоставленные пользователем: их сообщения в блогах, их изображения, их общие файлы. Эти файлы должны быть добавлены в репозиторий приложений не. Тем не менее, я могу захотеть иметь отдельный репозиторий данных, предоставленных пользователем, для их отслеживания. Я мог бы поддержать их, я мог бы использовать репозиторий, чтобы переместить их на другой сервер. Я хочу заметить, добавляет ли злоумышленник файлы, например. с неожиданными расширениями имен файлов, в этот каталог.

tmp/ представляет собой каталог временных файлов, сгенерированных приложением, поскольку он обрабатывает активность пользователя. Это может быть кеш. Я не хочу, чтобы эти файлы находились в любом управлении версиями. Тем не менее, я хочу заметить, добавляет ли злоумышленник файлы, например. с неожиданными расширениями имен файлов, в этот каталог.

attack.php представляет собой новые файлы и изменения в файлах приложений, которые добавляются злоумышленником. Я хочу понять, что они появились. git status отлично подходит для этого, если в репозитории имеется правильный контент.

Мне легко понять, как управлять этим деревом каталогов с помощью одного репозитория приложений. настройте это дерево каталогов с помощью git-dir в другом месте. Я могу посыпать «.gitignore» вокруг, скажем, игнорировать содержимое uploads/ и tmp/. Я могу оставить в репозитории приложений configuration.php.

Я не вижу, как настроить второй репозиторий для управления configuration.php и перезаписать безобидные значения в копии репозитория приложения. Я не вижу, как настроить .gitignore s, который скажет репозиторию приложений посмотреть index.php и проигнорировать uploads/, сообщая репозиторию пользовательских данных, чтобы сделать обратное.

Основополагающее препятствие, по-видимому, состоит в том, что Git предполагает, что рабочее дерево принадлежит только одному репозиторию, и я пытаюсь получить несколько репозиториев для его совместного использования. Итак, есть ли способ поделиться этим, практически, с Гит?

Вопрос Multiple repositories in one directory аналогичен. Я думаю, кто-то утверждает, что это можно сделать с помощью Subversion. Я не вижу ни одного из ответов, говорящих, что это можно сделать с Git.В частности, ответ, который указывает на то, что вы можете указать параметры --git-dir и --working-tree многим командам Git, не говорит о том, как обращаться с различными .gitignore потребностями.

Вопрос Is it possible to manage multiple repositories coherently? есть ответ, который упоминает Repo, который, в свою очередь, упоминает Gerrit. Это интересно, но кто-нибудь использовал их для создания такой структуры, как я?

Альтернативой окроплению .gitignore файлов по рабочему дереву является список путей в файле $GIT-DIR/info/exclude для каждого репозитория. Это позволяет каждому репозиторию игнорировать то, что он хочет игнорировать. Но я обеспокоен тем, что содержимое этих файлов exclude само по себе не будет контролироваться версиями и может не передаваться разработчикам, которые работают над приложением в своих собственных хранилищах.

Какой подход вы рекомендуете?

ответ

1

Агрегирование несколько репо в одном главном репо работу лучше всего:

Для файла с конфиденциальной или окружающей среды вы должны использовать драйвер фильтра содержимого (см. this answer), который при проверке автоматически генерирует файл с соответствующим контентом.

Смежные вопросы