Как правило, можно вставить пустой репозиторий, а не запускать git fetch
из него.Если вы сможете это сделать, жизнь станет намного проще.
Если у вас есть для извлечения, а не для толчка, и вы просто хотите создать зеркало происхождения в своем голом хранилище,Вы можете полностью избежать удаленного отслеживания ветвей.Если вы запускаете это зеркало с нуля, Charles Bailey ниже указывает, что git сделает все эти настройки за вас, если вы изначально клонируете репозиторий с git clone --mirror
.
В противном случае,Вы можете получить аналогичный эффект с помощью:
git fetch origin +refs/heads/*:refs/heads/*
+
означает, что это перезапишет состояние ваших локальных веток с тех, что с удаленного.Без +
обновления, которые не являются ускоренными слияниями, будут отклонены.Однако, если это просто зеркало, это не должно иметь значения.(Вы можете настроить это как действие по умолчанию на git fetch origin
, установив для переменной конфигурации remote.origin.fetch
значение +refs/heads/*:refs/heads/*
. Если вы также хотите отразить теги и ветви удаленного отслеживания от источника, вы можете использовать +refs/*:refs/*
вместо.)
Однако, если, как вы изначально просили, вы хотите поддерживать удаленные отслеживания филиалов и выборочно объединять их в локальные филиалы, вы можете использовать следующие шаги, но я не обязательно рекомендую их, если выВы единственный, кто использует этот голый репозиторий. (Примечание: изначально здесь я предложил использовать «git symbolic-ref HEAD refs /heads / what» для переключения ветки и «git reset --soft» для изменения ссылки - однако, Charles Bailey в комментариях отмечается, что можно использовать «git update-ref refs /heads / whats refs / remotes / origin / what», для которого не нужно сначала переключать ветку.)
Во-первых, вы можете проверить, что обновление ветви было бы слиянием в ускоренном режиме, а после этого обновить ветку.Обратите внимание, что здесь есть условие гонки, поэтому я говорю, что вы должны делать это только в том случае, если вы единственный, кто использует ваш локальный пустой репозиторий - проверка была бы бесполезна, если кто-то другой переместится на ветке между этими шагами.
- Вы можете проверить, что эквивалентное слияние будет ускоренным (то есть, что история
origin/master
включает master
), сравнив git merge-base master origin/master
с git show-ref master
- они должны быть одинаковыми.Или вы можете использовать is-ancestor
сценарий в этом вопросе , который выполняет эти команды с некоторыми дополнительными проверками.) - Наконец, вы можете обновить текущую ветку (в данном случае
master
)) чтобы указать origin/master
с помощью git update-ref refs/heads/master refs/remotes/origin/master
Однако, как я уже говорил в начале, я думаю, что реальное решение, которое вы хотите, это либо:
- Pushingвместо этого в ваш пустой репозиторий или
- Точное зеркальное отражение удаленного открытого репозитория, как я описал выше
Надеюсь, это пригодится.