Передача локального репозитория Git на новый пульт, включая все ветви и теги - PullRequest
477 голосов
/ 29 июля 2011

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

Ответы [ 11 ]

776 голосов
/ 29 июля 2011

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

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

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

git push REMOTE --tags

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

git push REMOTE --mirror

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

135 голосов
/ 09 октября 2012

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

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

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

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

Вслед за

git push --all
85 голосов
/ 16 апреля 2013

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

(проблема, с которой я столкнулся при решении Даниэля, состояла в том, что он отказывался бы извлекать ветку отслеживания с пульта source, если я ранее уже проверял ее, т. Е. Он не обновлял мою локальную ветвь перед отправкой)

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

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

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

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

12 голосов
/ 19 декабря 2013

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

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

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

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

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

9 голосов
/ 16 декабря 2016

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

# 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 и т. Д. В зависимости от ситуации.

9 голосов
/ 12 октября 2016

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

git push origin --all
4 голосов
/ 21 августа 2018

Зеркальное отображение репозитория

Создание чистого клона репозитория.

git clone --bare https://github.com/exampleuser/old-repository.git

Зеркальное отражение в новом репозитории.

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git

Удалите временный локальный репозиторий, созданный на шаге 1.

cd ..
rm -rf old-repository.git

Зеркальное отображение репозитория, содержащего объекты Git Large File Storage

Создание чистого клонарепозиторий.Замените пример имени пользователя именем человека или организации, которая владеет репозиторием, и замените пример репозитория именем репозитория, который вы хотели бы дублировать.

git clone --bare https://github.com/exampleuser/old-repository.git

Перейдите к хранилищу, которое вытолько что клонировали.

cd old-repository.git

Вставьте объекты хранилища больших файлов Git хранилища.

git lfs fetch --all

Зеркально нажмите на новое хранилище.

git push --mirror https://github.com/exampleuser/new-repository.git

Нажмитеобъекты Git Large File Storage хранилища для вашего зеркала.

git lfs push --all https://github.com/exampleuser/new-repository.git

Удалите временный локальный репозиторий, созданный на шаге 1.

cd ..
rm -rf old-repository.git

Вышеприведенная инструкция взята из справки Github: https://help.github.com/articles/duplicating-a-repository/

4 голосов
/ 01 сентября 2016

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

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

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

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

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

2 голосов
/ 10 июля 2016

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

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

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

2 голосов
/ 08 января 2015

Основано на @ Даниэль ответ, который я сделал:

for remote in \`git branch | grep -v master\`
do 
    git push -u origin $remote
done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...