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

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

21 ответ

Решение

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

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

Чтобы вставить все ваши теги:

git push REMOTE --tags

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

git push REMOTE --mirror

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

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

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

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

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

С последующим

git push --all

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

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

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

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

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

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

Зеркальное отображение хранилища

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

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 Large File Storage.

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/

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

# 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 и т.д. в зависимости от обстоятельств.

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

git push origin --all

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

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

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

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

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

Мой любимый (и самый простой) способ

git clone --mirror  OLD_GIT_URL
cd  NEW_CREATED_FOLDER
git remote add NEW-REMOTE NEW_GIT_URL
git push  NEW-REMOTE --mirror 

Запустите следующее, чтобы переместить существующий репозиторий на новый удаленный со всеми ветвями и тегами:

      cd existing_repo
git remote rename origin old-origin
git remote add origin git@<repo-url.git>
for remote in `git branch -r `; do git checkout --track remotes/$remote ; done
git push -u origin --all
git push -u origin --tags

Я нашел выше ответы все еще есть некоторые неясные вещи, которые могут ввести пользователей в заблуждение. Во-первых, уверен, что 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

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

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

Для достижения вышесказанного я сделал следующее:

  • вручную проверить все ветки в локальном репозитории (сценарий для проверки всех, показанных ниже),
  • git push origin '*:*'

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

for branch in `git branch -a | grep remotes | grep -v HEAD | grep -v master `; do
   git branch --track ${branch#remotes/origin/} $branch
done

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

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

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

Я нашел лучший и самый простой метод https://www.metaltoad.com/blog/git-push-all-branches-new-remote, работает для меня как шарм, он подтолкнет все теги и ветки от источника к новый пульт:

      git remote add newremote new-remote-url

git push newremote --tags refs/remotes/origin/*:refs/heads/*

Я использовал git push --all -u newremote, но он только подталкивал отмеченные ветки к newremote.

Git: перенести все ветки на новый пульт

Кейт Декант, архитектор программного обеспечения

Вот сценарий, с которым некоторые из вас могли столкнуться с вашими репозиториями Git. У вас есть рабочая копия репозитория Git, скажем, со старого сервера. Но у вас есть только рабочая копия, а источник недоступен. Так что вы не можете просто разветвить его. Но вы хотите отправить все репо и всю историю веток на свой новый пульт.

Это возможно, если ваша рабочая копия содержит ветки отслеживания со старого пульта (origin / branch1, origin / branch1 и т. Д.). Если да, то у вас есть все репо и история.

Однако в моем случае были десятки отделений, и некоторые или все из них я никогда не проверял локально. Толкать их всех казалось тяжелым подъемом. Итак, как действовать?

Я выделил два варианта:

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

Вариант 2: Отправка без изменения вашей рабочей копии. Есть вторая альтернатива, которая не требует проверки каждой ветви, не создает посторонних веток в рабочей копии и даже не изменяет файлы в рабочей копии.

Если ваш старый, уже не активный пульт называется «oldremote», а новый пульт называется «newremote», вы можете нажать только ветки удаленного отслеживания с помощью этой команды:

git push newremote refs/remotes/oldremote/*:refs/heads/*

В некоторых случаях также можно отправить только подмножество ветвей. Если имена веток отмечены косой чертой (например, oldremote / features / branch3, oldremote / features / branch4 и т. Д.), Вы можете отправить только удаленные ветки отслеживания с именами, начинающимися с «oldremote / features»:

git push newremote refs/remotes/oldremote/features/*:refs/heads/features/*

Независимо от того, нажимаете ли вы все ветки или только некоторые из них, Git выполнит всю операцию без создания каких-либо новых локальных веток и без внесения изменений в ваши рабочие файлы. Каждая ветвь отслеживания, соответствующая вашему шаблону, будет перенесена на новый пульт.

Для получения дополнительной информации по теме ознакомьтесь с этой веткой на StackOverflow.

Дата публикации: 9 октября 2017 г.

Чтобы отправить все ветки на пульте дистанционного управления, вам просто нужно сначала зафиксировать все ветки, а затем попробовать команду ниже:

      git push --all your-remote-branch-name

Нравиться

      git push --all origin(my remote name)

Надеюсь поможет(:

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

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

Команда ниже подтолкнет все ветки (включая те, которые вы никогда не проверяли, но присутствуют в вашем репозитории git, вы можете увидеть их с помощьюgit branch -a)

git push origin '*:*'

ПРИМЕЧАНИЕ. Эта команда удобна при миграции службы контроля версий (например, при переходе с Gitlab на GitHub).

Основной способ сделать то, что вы хотите, это использовать--all а также --tagsфлаги. Если вы их не упустите, это не приведет к тому, что вы хотите. К сожалению, их нельзя использовать вместе (не понимаю почему), поэтому их нужно запускать один за другим.

      git push --all
git push --tags

Другим актуальным вариантом является--pruneопция, которая удаляет любые ветки/теги на удаленном компьютере, которые не существуют локально.

Как вариант, рассмотрите--mirrorвариант, поскольку он в основном эквивалентен --all --tags --prune.

      git push --mirror

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

Я начал новый локальный проект, который хочу разместить в своем репо (BitBucket). Вот что я сделал:

  1. перейти к корню моего локального проекта
  2. начать с: git init
  3. добавить все файлы с помощью: git add .
  4. совершить с помощью: git commit -m "Initial commit"
  5. перейти в мое репо (BitBucket)
  6. создать новый репозиторий: new_project
  7. вернуться к моему местному проекту
  8. добавьте пульт с помощью: git remote add origin git@bitbucket.org:AndrewFox/new_project.git
  9. нажмите фиксацию с помощью: git push origin master -f

В -f Флаг - принудительное нажатие, иначе он определит, что два репо разные, и не удастся.

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

Ожидаемым результатом было репо, "клонированное" на другой пульт (т. Е. С 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

Вот что я решил [удаленный отказ] , когда я нажимаю локальный репозиторий Git на новый удаленный, включая все ветки и теги

  • git clone --зеркало старого репозитория

  • cd <имя-repo.git>

  • git remote добавить новое новое репо

  • git подтолкнуть новый --mirror

Откройте терминал.

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

      git clone --mirror https://github.com/EXAMPLE-USER/REPOSITORY-TO-MIRROR.git

Установите место нажатия на зеркало.

      cd REPOSITORY-TO-MIRROR

git remote set-url --push origin https://github.com/EXAMPLE-USER/MIRRORED

Как и в случае с простым клоном, зеркальный клон включает в себя все удаленные ветки и теги, но все локальные ссылки будут перезаписываться при каждом извлечении, поэтому он всегда будет таким же, как исходный репозиторий. Установка URL-адреса для push-уведомлений упрощает отправку на ваше зеркало.

Чтобы обновить зеркало, загрузите обновления и нажмите.

      git fetch -p origin
git push --mirror

Ссылка: Гитхаб

Другие вопросы по тегам