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