推送本地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 --all
和git 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 branchname
与git 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