推送本地Git仓库到新的远程,包括所有分支和标签

我有一个本地的Git回购,我想推到一个新的远程回购(如果有的话,在Beanstalk上build立全新的回购)。 我本地的回购有几个分支和标签,我想保留我所有的历史。 它看起来像我基本上只需要做一个git推,但只上传主分支。 我如何推送所有东西,以便在遥控器上获得本地回购的完整副本?

要推送所有分支 ,请使用(将REMOTEreplace为远程的名称,例如“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 

这是另外一个对于我所处的情况更好的解决scheme。它解决了您有多个远程的问题,想要将远程source所有分支克隆到远程destination而无需全部检查预先。

(我在Daniel的解决scheme中遇到的问题是,如果我之前已经检查过它,它将拒绝从source远程程序签出一个跟踪分支,也就是说,在推送之前它不会更新我的本地分支)

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

注意:如果您不使用直接CLI,则必须跳过星号:

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

  • @mattalxndr

这会将远程source中的所有分支推送到destination分支,可能会进行非快速前进的推送。 您仍然需要单独推送标签。

git-push的手册页是值得一读的。 结合这个网站,我在.git/config写下了以下内容:

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

push = :意思是“推送任何”匹配的分支(即远程仓库中已存在的分支,并有一个本地对应)“,而push = refs/tags/*意味着”推送所有标签“。

所以现在我只需要运行git push来推送所有匹配的分支和所有的标签。

是的,这不是什么OP想要的(所有推动的分支必须已经存在于远程端),但可能会帮助那些谁发现这个问题,同时search“如何推动分支和标签在同一个时间”。

这是我find的最简洁的方式,只要目的地是空的。 切换到一个空的文件夹,然后:

 # 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://...replace为file:///your/repo等。

在我的情况是什么工作。

 git push origin --all 

推送分支和标签(但不是遥控器):

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

这相当于将git push--tags和 – --tags选项组合在一起,git似乎不允许。

我发现上面的答案还有一些不清楚的地方,这会误导用户。 首先,确定git push new_origin --allgit push new_origin --mirror不能复制所有分支的起源,它只是复制你的本地分支到你的new_origin。

以下是我testing过的两个有用的方法:

1,通过克隆裸回购复制。 git clone --bare origin_url ,然后input文件夹,然后git push new_origin_url --mirror 。这样,你也可以使用git clone --mirror origin_url ,–bare和--mirror会下载一个裸回购,而不是包括工作区。 请参考这个

2,如果你有一个使用git clone的git repo,这意味着你有裸回购和git工作区,你可以使用git remote add new_origin new_origin_url ,然后git push new_origin +refs/remotes/origin/\*:refs/heads/\* ,然后git push new_origin --tags

这样,你会得到一个额外的头部分支,这是没有意义的。

基于@丹尼尔的答案我做到了:

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

我发现这些似乎都不适合我。 随意火焰这个死亡,但由于某种原因无法让其他选项正常工作。

预期的结果是“克隆”到另一个远程(即从Github到另一个提供者)的回购:

  • 所有分支都在新的远程上创build
  • 所有分支历史都是在新的远程上创build的
    • (这是错过了我试过的每个解决scheme)
  • 所有的标签都是在新的远程上创build的
  • 源移动(给定)
  • 无损(暂停–mirror选项)

我看到的主要问题是所有的远程分支没有在新的远程中重新创build。 如果一个命令做了,新的远程没有分支历史(即做一个git checkout branch; git log不会显示预期的分支提交)。

我注意到git checkout -b branchnamegit checkout branchname不一样(后者正是我所需要的)。 我注意到git checkout --track branchname似乎没有拉动分支历史。

我的解决scheme (基于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