EMZETT.
Войти

Git Mirror Clone

Коротко: Полная копия репозитория Git со всеми ветками, тегами и полной историей коммитов — а не обычный checkout для работы.

Подробнее: git clone --mirror <url> создаёт «голый» (bare) репозиторий (без рабочего каталога, только папка .git). Затем git push --mirror <новый-url> переносит полную историю 1:1 в новый целевой репозиторий. Чтобы действительно продолжить работу, после этого всё равно нужен обычный git clone нового репозитория — папка-зеркало лишь промежуточный шаг.

Подробности

Полная процедура

Полная процедура переноса репозитория через зеркальный клон состоит из трёх шагов:

git clone --mirror https://github.com/old-account/projekt.git
cd projekt.git
git push --mirror https://github.com/own-account/emzett.git
git clone https://github.com/own-account/emzett.git

Что конкретно означает «bare-репозиторий»

Обычный клонированный репозиторий состоит из двух частей: папки .git (вся история/метаданные) и рабочего каталога (реально извлечённые файлы, которые вы редактируете). «Bare»-репозиторий, создаваемый с --mirror, состоит ТОЛЬКО из содержимого .git, без рабочего каталога — то есть нет извлечённых файлов, с которыми можно было бы работать напрямую. Это намеренно: bare-репозиторий — чистый контейнер данных, предназначенный как промежуточная станция или цель для push, а не для прямого редактирования. Это также объясняет, почему после зеркального push всё равно нужен обычный git clone нового репозитория.

Отличие от обычного клона + push

Решающее отличие от обычного git clone + git push: обычный клон тоже получает полную историю текущей извлечённой ветки, но НЕ автоматически все остальные ветки/теги, а обычный push переносит только текущую ветку, а не всю сеть ссылок. При переносе репозитория (в отличие от повседневной работы) вы, напротив, действительно хотите взять всё 1:1, включая ветки, которые сами, возможно, никогда не извлекали, — например, старые feature-ветки или теги прошлых релизов, остающиеся важными для полной истории.

Что НЕ переносится

Важный момент, который легко упустить при переносе репозитория: зеркальный клон переносит полную историю Git, но НЕ специфичные для платформы метаданные, такие как задачи (issues) GitHub, pull request, вики-страницы, релизы (как объекты GitHub, а не как теги Git) или настройки репозитория (правила защиты веток, вебхуки, настроенные секреты). Всё это живёт вне чистой объектной модели Git в собственной базе данных GitHub и при реальном переносе платформы должно быть перенесено или настроено заново отдельно.

Аутентификация при зеркальном push

Поскольку зеркальный push потенциально переносит очень много ссылок сразу, он особенно подвержен проблемам аутентификации у больших репозиториев — просроченный токен или неверно настроенное SSH-соединение часто вызывает ошибку только посреди передачи, что может оставить целевой репозиторий в неполном промежуточном состоянии. Поэтому после зеркального push, прежде чем удалять или архивировать старый репозиторий, рекомендуется сравнить число веток/тегов в целевом репозитории с оригиналом.

См. также: SSH-ключ (аутентификация Git), Git