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,

$ git remote update
$ git pull --all
Другие вопросы по тегам