Git не клонирует все ветви на последующих клонах?
У меня есть некоторые проблемы с использованием Git клонированных репозиториев и веток, и я не могу найти ответ на этот вопрос. Позвольте мне описать: у нас есть голый главный репозиторий Git, из которого мы все извлекаем и отправляем, расположенный на локальной машине Linux и доступный через ssh. Я сделал клон этого на мой флэш-накопитель USB, как это:
git clone ssh://adahl@gollum//net/repos/netcube/patches.git
Это дает мне, конечно, локальный клон с рабочей копией на моем флэш-накопителе. Я перехожу к этому и вижу некоторые ветви в этом клоне:
cd patches
git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
remotes/origin/stable
Пока все хорошо, однако, если я клонирую репозиторий на моем флэш-накопителе в другой раз, то стабильная ветка будет потеряна. Увидеть:
cd ..
git clone patches patches2
cd patches2
git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/master
Я пробовал несколько вариантов при клонировании или git fetch
после клонирования ничто не приводит стабильную ветвь к хранилищу patches2. Я предполагаю, что у меня нет понимания git здесь и просто использую это неправильно. Может ли кто-нибудь указать мне на мою ошибку в использовании и / или понимании?
4 ответа
Смотрите Как клонировать все удаленные ветки в Git?
Вам нужно создать локальную ветвь на основе удаленной ветки, если вы действительно хотите, чтобы она была включена в клон. Однако, поскольку вы все равно не работаете в удаленных ветвях, вы создадите локальные ветки, как только начнете работать над веткой. А до этого он не нужен в вашем клоне, так как вы можете просто получить его с любого удаленного пункта.
Однако, если у ноутбука нет подключения к сети, вам придется создавать локальные филиалы для всех удаленных филиалов, которые вы хотите, чтобы они были клонированы при клонировании вашего локального репо.
Если у вас есть подключение к сети, используйте git remote add origin2 ssh://adahl@gollum//net/repos/netcube/patches.git
а потом git fetch origin2
- не стесняйтесь заменить origin2
с более значимым именем.
В дополнение к @ThiefMaster:
Мне нравится
git clone --mirror
или же
git push --mirror
обновить все (локальные и удаленные) ссылки на филиалы и теги
Дополнительная информация Как уже отмечалось, --mirror действительно будет реплицировать репо как есть, таким образом перезаписывая изменения в месте назначения. Ветви, которые не существуют в источнике, будут безоговорочно удалены.
По сути, это похоже на работу с удаленным компьютером и выполнение "git remote update --prune", с той разницей, что затронутые ветви могут быть как локальными, так и "удаленными" ссылками [1].
@LeSpocky (и другие?)
Теперь, если изменения исчезнут, они никогда не вызовут проблем слияния, так что это легко.
--mirror
назван в честь реальной концепции, поэтому он был разработан для преодоления любых различий в цели. Если цель не пустая, и у вас зафиксированы локальные изменения, вы всегда можете получить их обратно через reflog локальной ветви цели (git log -g
, git reflog
).
В качестве общей меры безопасности у вас может быть крючок "git stash save" в цели.
Имейте в виду, однако, что --mirror был разработан, чтобы, ну, в общем, отразить, и этот вопрос был на самом деле о том, как реплицировать все ветви на пустой пульт.:)
[1] (ссылки есть, но удаленные определения не копируются; если вы хотите, сделайте ручное копирование из.git/config в.git/config в месте назначения push)
"origin" - это имя по умолчанию, присвоенное месту, из которого вы клонировали репо, которое автоматически добавляется как удаленный (примечание: remote означает просто "репо, а не текущий" - пульты могут быть на одной машине).
В patches
"Происхождение" относится к первоначальному репо на Gollum.
В patches2
"происхождение" относится к patches
,
Ссылки на удаленное отслеживание (начинающиеся с remotes/
) на самом деле не являются локальными ветвями - они просто указатели того места, где в последний раз было известно, что ветки находятся на удаленном компьютере. Таким образом, в patches
, у вас есть ссылки на удаленное отслеживание исходного репо, но на patches2
, у вас есть только ссылка удаленного отслеживания для местного master
филиал в patches
потому что там patches2
Происхождение указывает на.
Ты можешь использовать git remote add
добавить оригинальный репо в качестве другого пульта в patches2
после клонирования - или вы можете просто клонировать снова из исходного репо вместо patches
,