Перейти к основному содержанию Перейти к навигации Перейти к нижнему колонтитулу
Ограниченное время: Программа Design Partner. План BUSINESS бесплатно на всю жизнь.

Форк репозитория

Клонируйте целый репозиторий (приложение, базу данных, файлы) за секунды. Любой размер. Без лишнего места на диске.

Форк репозитория

Форкируйте целую продакшен-среду (приложение, базу данных, конфигурационные файлы) за секунды. Любой размер. Без лишнего места на диске. Форкируйте столько раз, сколько хотите.

Девиз: клонируй продакшен, ничего не сломай.

Смотреть урок

Создайте что-то, что можно потерять

Сначала создадим файл в работающем приложении, чтобы доказать изоляцию форка. Откройте репозиторий в VS Code, затем внутри репозитория создайте файл-маркер:

rdc vscode connect -m my-server -r my-app
echo "Hello from production" > index.html

Теперь сделаем форк.

Форк

rdc repo fork --parent my-app -m <machine-name> --tag experiment --up

Одна команда клонирует весь repo: приложение, базу данных и конфигурационные файлы. Время fork постоянно и не зависит от размера repo, будь то один гигабайт, сто гигабайт или один терабайт.

Parent fans out into independent clones

Одна команда. Всё склонировалось (приложение, база данных, конфигурационные файлы) и произошло это за секунды. Запустите снова, и получите ещё один независимый клон.

Почему так быстро?

Sharing a folder link is the same speed regardless of the folder's size

Всё дело в btrfs reflinks. При форке создаётся новое дерево файловой системы, указывающее на те же блоки данных, что и родитель. При форке данные не копируются. Всё это просто метаданные, поэтому размер родителя никогда не влияет на скорость форка.

1 GB, 100 GB, 1 TB. Same time, every time.

Форк работает так же. 1 ГБ, 100 ГБ, 1 ТБ. Одно время, каждый раз.

Что общее, а что ваше

Many mirrors, one sun: shared base, your changes are yours

Думайте о родительском репозитории как о неподвижном источнике. Ваш форк представляет собой copy-on-write-представление этого источника. Запишите что-то в форк, и эти записи останутся в форке. Родитель не меняется, сколько бы форков ни указывало на него.

Солнце не удержать, но можно удержать его отражение в зеркале.

Что будет, если родитель изменится?

A fork is a frozen photograph; the parent keeps flowing like a river

Теперь представьте снимок. Когда вы форкаете, вы замораживаете родителя в этот точный момент. Родитель продолжает изменяться. Ваш форк нет.

Если родительский репозиторий изменится позже, ваш форк останется там, где был.

Реку не удержать, но можно удержать её снимок на фотографии.

Место на диске остаётся неизменным

Five forks of a 100 GB repo, still about 100 GB total

Вот почему диск не переполняется. Пять форков репозитория объёмом 100 ГБ? Всё равно около 100 ГБ суммарно. Вы платите дисковым пространством только за то, что изменяете в каждом форке.

Форкайте хоть пять раз. Диск даже не заметит.

Что форки не наследуют: секреты

Есть одна вещь, которую форк намеренно не копирует: секреты. Форк стартует без API-ключей, без паролей к базе данных, без токенов Stripe. Именно поэтому «клонируй продакшен, ничего не сломай» действительно работает. Ваша песочница не может выставлять счета реальным клиентам, потому что не может притворяться вами. Подробнее мы разберём это в уроке Управление секретами.

Проверка изоляции

Выведите оба репозитория рядом:

rdc repo list -m <machine-name>

Оба repo теперь сосуществуют на одной машине и одном диске как два полностью независимых окружения.

Вы увидите my-app и my-app:experiment, работающие одновременно. В оригинальном репозитории файл-маркер находится ровно там, где вы его оставили:

rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html'

Проверьте изоляцию, просмотрев исходный repo: маркерный файл остался на месте. Создание fork не изменяет родительский repo.

Теперь внесите деструктивное изменение, но только в форке:

rdc term connect -m <machine-name> --repository my-app:experiment --command 'rm index.html && echo removed'

Удалите маркерный файл только внутри fork. Это деструктивное изменение, ограниченное scope fork.

Вернитесь в оригинал и проверьте:

rdc term connect -m <machine-name> --repository my-app --command 'ls -la index.html'

Вернитесь к исходному repo: маркерный файл остался нетронутым. Родительский repo и fork используют один образ, но работают на отдельных Docker daemon и отдельных файловых системах.

Файл-маркер здесь, нетронутый. Изменения форка остались в форке. Одни и те же образы, отдельные Docker-демоны, отдельные файловые системы.

Очистка

Когда закончите, просто удалите форк:

rdc repo delete --name my-app:experiment -m <machine-name>

Удалите fork по завершении. Исходный repo не затрагивается, что обеспечивает безопасный рабочий процесс: fork, эксперимент, удаление.

Оригинал остаётся в точности таким, каким был. Форк, эксперимент, сломал, удалил. Никакого риска.


Далее: Изоляция форка в действии.