Git не клонирует все ветви на последующих клонах? - PullRequest
6 голосов
/ 06 апреля 2011

У меня есть некоторые проблемы с 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 ]

12 голосов
/ 06 апреля 2011

В дополнение к @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 был разработан дляХорошо, mirror , и этот вопрос был на самом деле о том, как реплицировать все ветви на чистый пульт.:)

[1] (ссылки есть, но удаленные определения не копируются; если вы хотите, сделайте ручное копирование из .git / config в .git / config в месте назначения push))

3 голосов
/ 06 апреля 2011

См. Как клонировать все удаленные ветви в Git?

Вам необходимо создать локальную ветвь на основе удаленной ветки, если вы действительно хотите, чтобы она была включена в клон. Однако, поскольку вы все равно не работаете в удаленных ветвях, вы создадите локальные ветки, как только начнете работать над веткой. А до этого он вам действительно не нужен в вашем клоне, так как вы можете просто получить его с пульта в любой точке.

Однако, если у ноутбука нет подключения к сети, вам придется создавать локальные ветви для всех удаленных филиалов, которые вы хотите, чтобы они клонировались при клонировании вашего локального репо.

Однако если у вас есть сетевое подключение, используйте git remote add origin2 ssh://adahl@gollum//net/repos/netcube/patches.git, а затем git fetch origin2 - не стесняйтесь заменить origin2 на более значимое имя.

2 голосов
/ 06 апреля 2011

«origin» - это имя по умолчанию, присвоенное месту, из которого вы клонировали репо, которое автоматически добавляется как удаленный (примечание: remote означает просто «репо не текущий» - удаленные могут быть на одной машине).

В patches «происхождение» относится к исходному репо на gollum.

В patches2, «происхождение» относится к patches.

Удаленноссылки отслеживания (начинающиеся с remotes/) на самом деле не являются локальными ветвями - они просто указатели того места, где в последний раз было известно, что ветки находятся на удаленном компьютере.Таким образом, в patches у вас есть ссылки на удаленное отслеживание для исходного репо, но в patches2 у вас есть только ссылка для удаленного отслеживания для локальной ветви master в patches, потому что именно там patches2Источник указывает на.

Вы можете использовать git remote add, чтобы добавить исходное репо в качестве другого пульта в patches2 после клонирования, или вы можете просто клонировать снова из исходного репо вместо patches.

0 голосов
/ 14 февраля 2012
$ git remote update
$ git pull --all
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...