Вопрос или проблема
Это может быть расплывчатый вопрос, но я не могу в данный момент найти хорошее решение в своей голове.
У меня есть приложение BookStack, работающее на сервере компании. Чтобы упростить и обеспечить безопасность, у меня есть пользовательский файл .gitignore
, который игнорирует все, кроме наших пользовательских расширений и конфигурации .env
.
Идея заключается в том, что разработчики могут добавить репозиторий в качестве удаленного источника в директорию с BookStack вместе с макетом базы данных, чтобы протестировать его безопасно.
Это нормально до тех пор, пока мне не нужно извлекать данные из репозитория BookStack. Если я сейчас добавлю BookStack в качестве удаленного источника на производственном сервере, это будет конфликтовать с .gitignore
при обновлении.
У вас есть какие-либо советы, как я мог бы решить эту проблему, кроме как разрешать этот конфликт при каждом обновлении?
Это просто идея и небольшое общее руководство о том, что вы могли бы сделать с worktree
.
Как уже упоминалось, есть несколько возможностей.
Вы также можете использовать отдельные ветки для настроек или использовать автоматизированный пользовательский скрипт и так далее.
Git Worktree для чистого разделения
С помощью Git Worktree вы можете создать две отдельные рабочие директории для одного и того же репозитория:
- Одна для изменений из upstream (BookStack).
- Одна для ваших собственных настроек (Custom Code).
Это избегает конфликтов и позволяет управлять обеими версиями параллельно.
Шаги:
-
Клонируйте ваш репозиторий на сервер
-
Добавьте репозиторий BookStack как upstream удаленный
-
Создайте новую рабочую директорию (Worktree) для ветки upstream
-
Работайте в основной директории на отдельной ветке
-
Обновите upstream worktree с помощью
git pull
-
Слейте изменения в вашу пользовательскую ветку, если нужно
-
Используйте
.git/info/exclude
для игнорирования таких файлов, как.env
или пользовательские расширения
Изменения в upstream и ваши собственные настройки отделены и могут быть обновлены независимо от вашего кода.
Вы можете использовать обе версии параллельно без постоянного переключения веток.
worktree
git-worktree – Управление несколькими рабочими деревьями
Для чего бы я использовал git-worktree?
.git/info/exclude
Исключение локальных файлов без создания файла .gitignore
gitignore – Указывает на намеренно непрослеживаемые файлы, которые нужно игнорировать
Когда вы бы использовали .git/info/exclude вместо .gitignore для исключения файлов?
Ответ или решение
Настройка Git-репозитория на производственном сервере с удаленным источником может представлять собой сложную задачу, особенно когда речь идет о сочетании upstream-обновлений и пользовательских изменений. Рассмотрим, как можно использовать возможности Git для эффективного управления вашим проектом, сохраняя при этом его целостность и надежность.
Теория
Ваша задача состоит в том, чтобы интегрировать изменения из основного репозитория (BookStack) с вашими собственными модификациями, не создавая при этом конфликтов. Это стандартная проблема управления конфигурацией в системах контроля версий, которую можно решить с помощью расширенных возможностей Git, таких как worktree
и индивидуальное игнорирование файлов с помощью .git/info/exclude
.
Git Worktree — это мощный инструмент, который позволяет работать с несколькими рабочими деревьями (directories) в одном репозитории. Это дает возможность параллельно отслеживать изменения в основном репозитории и в вашей собственной ветке с доработками.
Пример
Рассмотрим пример применения worktree
для разделения upstream кода и пользовательских изменений:
-
Клонируйте основной репозиторий на ваш сервер. Это обеспечит вам доступ к коду BookStack:
git clone <repository-url> bookstack-main
-
Добавьте репозиторий BookStack как удаленный источник (upstream):
cd bookstack-main git remote add upstream <upstream-repo-url>
-
Создайте новое рабочее дерево (worktree) для upstream-времени:
git worktree add ../bookstack-upstream master
Это позволит вам отделить upstream изменения от ваших пользовательских настроек.
-
Работайте в основном каталоге (bookstack-main) на отдельной ветке, содержащей ваши кастомизации:
git checkout -b custom-branch
-
Для обновления ветки upstream, перейдите в рабочее дерево и выполните pull:
cd ../bookstack-upstream git pull
-
Сливайте изменения в вашу кастомизированную ветку по мере необходимости:
cd ../bookstack-main git checkout custom-branch git merge upstream/master
-
Настройте
.git/info/exclude
, чтобы игнорировать локальные файлы, такие как.env
:- Откройте файл
.git/info/exclude
и добавьте в него необходимые исключения.
- Откройте файл
Применение
Применение вышеописанного подхода позволяет отделить upstream код от пользовательских изменений, что значительно упрощает процесс обновления и поддержания консистентности системы:
- Совместимость с обновлениями: Вы можете обновлять upstream-ветку без риска переписывания ваших пользовательских настроек.
- Снижение конфликтов: Разделение на различные рабочие области позволяет избежать прямых конфликтов между upstream и пользовательскими модификациями.
- Гибкость тестирования: Использование отдельных ветвей избавляет вас от необходимости переключаться между различными версиями кода вручную, предлагая при этом возможность использования различных конфигураций и тестирования на реальных данных.
Используя описанный процесс, ваша команда разработчиков сможет эффективно работать с production-сервером, не создавая непредвиденные трудности и сохраняя систему в актуальном состоянии с минимальными усилиями. Успешная реализация такого подхода также может стать надежной основой для последующей автоматизации процессов интеграции и развертывания.