Нажать локальный репозиторий Git на новый пульт, включая все ветки и теги

У меня есть локальный репозиторий Git, который я хотел бы нажать на новое дистанционное репо (новый репо, созданный на Beanstalk, если это имеет значение). В моем локальном репо есть несколько ветвей и тегов, и я бы хотел сохранить всю свою историю. Похоже, мне просто нужно сделать push Git, но только загружает главную ветку. Как мне нажать все, чтобы получить полную копию моего локального репо на пульте дистанционного управления?

Ответ 1

Чтобы нажать все ваши ветки, используйте либо (замените REMOTE на имя пульта, например "origin" ):

git push REMOTE '*:*'
git push REMOTE --all

Нажать все ваши теги:

git push REMOTE --tags

Наконец, я думаю, вы можете сделать это все в одной команде с помощью:

git push REMOTE --mirror

Однако, кроме того, --mirror, также нажимает ваши пульты, так что это может быть не совсем то, что вы хотите.

Ответ 2

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

Итак, у вас есть свое репо и все ветки внутри, но вам все равно нужно проверить эти ветки для команды git push --all, чтобы на самом деле нажать их тоже.

Вы должны сделать это, прежде чем нажимать:

for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done

Далее

git push --all

Ответ 3

Вот еще одна попытка сделать то же самое, что улучшилось для ситуации, в которой я был. Это решает проблему, когда у вас более одного пульта, хотелось бы клонировать все ветки в удаленном source удаленном destination, но без предварительной проверки их всех.

(Проблема, с которой я столкнулась с решением Daniel, заключалась в том, что она откажется проверять ветвь отслеживания с удаленного пульта source, если я ранее проверил ее, т.е. не будет обновлять мою локальную ветвь до нажатия)

git push destination +refs/remotes/source/*:refs/heads/*

Примечание: Если вы не используете прямой CLI, вы должны избегать звездочек:

git push destination +refs/remotes/source/\*:refs/heads/\*

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

Ответ 4

Командная строка для git-push стоит прочитать. В сочетании с этот сайт Я написал следующее в .git/config:

[remote "origin"]
    url = …
    fetch = …
    push = :
    push = refs/tags/*

push = : означает "нажимать любые" соответствующие "ветки (т.е. ветки, которые уже существуют в удаленном репозитории и имеют локальный экземпляр)", а push = refs/tags/* означает "нажимать все теги".

Итак, теперь мне нужно запустить git push, чтобы нажимать все соответствующие ветки и все теги.

Да, это не совсем то, что хотел OP (все ветки, которые нужно нажать, уже должны существовать на удаленной стороне), но могут быть полезны для тех, кто находит этот вопрос во время поиска в googling для "как мне нажимать ветки и теги в то же время".

Ответ 5

Это самый сжатый способ, который я нашел, если пункт назначения пуст. Переключитесь в пустую папку, а затем:

# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git

Подставьте https://... для file:///your/repo и т.д. по мере необходимости.

Ответ 6

В моем случае работа была.

git push origin --all

Ответ 7

На основании ответа @Daniel я сделал:

for remote in \`git branch | grep -v master\`
do 
    git push -u origin $remote
done

Ответ 8

Чтобы нажимать ветки и теги (но не удалять):

git push origin 'refs/tags/*' 'refs/heads/*'

Это будет эквивалентно объединению опций --tags и --all для git push, которые git, похоже, не позволяют.

Ответ 9

Я нашел ответы выше, все еще есть некоторые неясные вещи, которые будут вводить пользователей в заблуждение. Во-первых, он уверен, что git push new_origin --all и git push new_origin --mirror не могут дублировать все ветки происхождения, а просто дублируют ваши локальные ветки на ваш new_origin.

Ниже приведены два полезных метода, которые я тестировал:

1, дублируйте с помощью clone bare repo. git clone --bare origin_url, затем введите папку и git push new_origin_url --mirror. Таким образом, вы также можете использовать git clone --mirror origin_url, как --bare, так и --mirror будет загружать голый репо, не считая рабочего пространства. пожалуйста, обратитесь this

2 Если у вас есть git repo с помощью git clone, что означает, что у вас есть рабочее место repo и git, вы можете использовать git remote add new_origin new_origin_url, а затем git push new_origin +refs/remotes/origin/\*:refs/heads/\*, а затем git push new_origin --tags

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

Ответ 10

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

Ожидаемый результат был "клонирован" репо на другой пульт (т.е. от Github к другому провайдеру):

  • Все ветки создаются на новом удаленном устройстве
  • Вся история ветвей создается на новом удаленном компьютере
    • (это было пропущено на каждом решении, которое я пробовал)
  • Все теги создаются на новом удаленном устройстве
  • Источник перемещается (заданный)
  • Неразрушающий (предоставление паузы опции --mirror)

Основная проблема, которую я видел, заключалась либо в том, что все удаленные ветки не воссоздавались на новом удаленном компьютере. Если команда выполнялась, новый пульт не имел истории ветвления (т.е. Выполнение git checkout branch; git log не отображает ожидаемые ответвления).

Я заметил, что git checkout -b branchname НЕ совпадает с git checkout branchname (последнее - это то, что мне нужно). Я заметил, что git checkout --track branchname не отображал историю ветвей.

Мое решение (основано на powershell):

Function Git-FetchRemoteBranches {
$originalbranch = (git symbolic-ref HEAD).split("/")[-1]

Foreach ($entry in (git branch -r)) {

If ($entry -like "*->*") {
  $branch = $entry.split("->")[2].split("/")[1]
}
  else {$branch = $entry.split("/")[1]}

Write-Host "--Trying git checkout " -NoNewline
Write-Host "$branch" -Foreground Yellow

git checkout $branch

Remove-Variable branch -Force

""}

#Switch back to original branch, if needed
If ( ((git symbolic-ref HEAD).split("/")[-1]) -ne $originalbranch) {
"Switching back to original branch"
git checkout $originalbranch
Remove-Variable originalbranch -Force
}
}

git clone http://remoterepo
cd remoterepo
Git-FetchRemoteBranches
git remote add newremote
git push newremote --all
git push newremote --tags #Not sure if neeeded, but added for good measure