«Безопасно» ли клонировать git из одного репозитория и устанавливать origin в другой?

#git

#git

Вопрос:

Итак, у меня, как правило, есть недавний клон репозитория, с которым мне нужно работать в «очень близком» сетевом режиме (часто на локальном диске). Существует также «официальный» сервер, источником которого мой рабочий процесс действительно хочет быть, но он часто работает очень медленно (либо потому, что он перегружен, либо в удаленной сети, либо и то, и другое).

(это локальное репозиторий является клоном официального сервера, который, как правило, устарел на неделю или две, но репозиторий очень большой и имеет около десятилетней истории, импортированной из старых VCSE, поэтому локальный клон плюс выборка с удаленного намного быстрее)

Если я git clone -o local /path/to/repo и затем git remote add -f origin URI-for-offical-repo получу ли я то же самое, что (*) git clone URI-for-offical-repo дало бы мне?

Я особенно опасаюсь любых тонких различий, которые могут повлиять на мой репозиторий. Также, если я начну использовать этот метод ускорения клонирования, «локальное» репозиторий, возможно, было создано с использованием этого метода, возможно, для нескольких поколений.

(*) то же самое плюс дополнительное удаленное имя «local» и все, что не было перенесено с локального на официальный сервер.

Ответ №1:

Короткий ответ: Да, вероятно.

Длинный ответ: «origin» — это просто псевдоним для того места, куда вы обычно хотите нажать. Пока новое назначение связано с репозиторием, из которого вы извлекли (или с пустым репозиторием), и у вас есть доступ на запись к нему, это должно быть безопасно.

ПРИМЕЧАНИЕ: я действительно не считал, что ваш пример команды «псевдокод» является разумным. Но концепция клонирования с последующим изменением URL для «источника» является разумной концепцией. Я делал это сам, когда адреса серверов перемещались, или я решил изменить местоположение своего общедоступного репозитория и т.д.

Однако будьте осторожны, если новый origin НЕ является полностью пустым репозиторием или старым клоном вашего локального репозитория (без новых коммитов, чем на вашем локальном), используя

 git push --mirror #e.g. implicitly to "origin"
  

можно перезаписывать и отбрасывать ветви на удаленном компьютере, если у вас есть полный доступ на запись к нему.
(Это мне также удалось сделать самому, когда я небрежно скопировал и вставил данные .git / config из одного репозитория в несвязанный репозиторий. [К счастью, у него было много обновленных клонов; но я несколько секунд потел, когда сообщения об удалении прокручивались по всему моему экрану 😉 ])

Комментарии:

1. Новый источник никогда не бывает полностью пустым, а локальное репозиторий всегда является более старым клоном «нового» источника (я обновил вопрос, чтобы отразить это). Я не делаю «git push —mirror», только «git push» и «git push origin CURRENT-BRANCH»

Ответ №2:

То, что вы делаете, выглядит нормально, но вы, возможно, ищете --reference опцию, которая была добавлена в git clone некоторое время назад. Если есть локальная копия, это позволяет очень быстро создать новый клон, используя пакеты ссылочного репозитория, а затем просто обновлять из сети. например: git clone --reference ./oldercopy $url newcopy

Для вашей текущей схемы — при условии, что дерево связано, нет проблем с переключением URL-адресов для удаленных устройств. Если они не связаны, то будут отображаться всевозможные неприятные сообщения об ошибках.

Комментарии:

1. Насколько я понимаю, если вы используете —reference и удаляете репозиторий, на который ссылается ссылка (или запускаете gc или filter), могут произойти плохие вещи. Я действительно хочу избежать плохих вещей.

2. Я проверил это — и вы правы. Если ссылочный репозиторий исчезает, у вашего нового клона проблемы. Это можно исправить, но выглядит довольно пугающе.