Перейти к основному содержанию Перейти к навигации Перейти к нижнему колонтитулу
Ограниченное время: Программа Design Partner — тариф BUSINESS навсегда

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

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

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

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

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

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

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

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

rdc vscode connect -m my-server -r my-app

Внутри репозитория создайте файл-маркер:

time echo "Hello from production" > index.html

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

Форк

time rdc repo fork --parent my-app -m my-server --tag experiment --up

Parent fans out into independent clones

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

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

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

Представьте, что вы делитесь ссылкой на папку. Ссылка одинакова, маленькая папка или огромная. Папка тяжёлая, ссылка лёгкая.

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

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

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

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

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

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

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

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. Именно поэтому «клонируй продакшен, ничего не сломай» действительно работает. Ваша песочница не может выставлять счета реальным клиентам, потому что не может притворяться вами. Подробнее мы разберём это в уроке Управление секретами.

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

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

time rdc repo list -m my-server

Вы увидите my-app и my-app:experiment, работающие одновременно.

В оригинальном репозитории проверьте, что запущено:

time docker ps

Обратите внимание на время работы. Это оригинальные контейнеры. Теперь переключитесь на форк:

rdc vscode connect -m my-server -r my-app:experiment
time docker ps

Те же образы, но время работы свежее. Контейнеры запустились вместе с форком.

Сделаем разницу ещё очевиднее. Добавим контейнер только в форк:

time docker run --rm -it -d nginx
time docker ps

Nginx запущен, но только внутри этого форка.

Попробуйте что-то деструктивное:

time rm index.html

Здесь файла нет. Вернёмся в оригинал:

rdc vscode connect -m my-server -r my-app
time docker ps

Никакого nginx. Контейнеры форка остались в форке. И index.html здесь на месте, нетронутый. Оригинал ничего не знал о происходившем. Одни и те же образы, отдельные Docker-демоны, отдельные файловые системы.

Очистка

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

time rdc repo delete --name my-app:experiment -m my-server

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


Далее: Управление секретами.