我有一个本地Git回购,我想把它推到一个新的远程回购(全新的回购设置在Beanstalk上,如果这很重要的话)。 我的本地回购有一些分支和标签,我想保留我的所有历史。
看起来我基本上只需要做一个git推送,但这只上传主分支。
我如何推动所有东西,以便在遥控器上获得本地回购的完整副本?
我有一个本地Git回购,我想把它推到一个新的远程回购(全新的回购设置在Beanstalk上,如果这很重要的话)。 我的本地回购有一些分支和标签,我想保留我的所有历史。
看起来我基本上只需要做一个git推送,但这只上传主分支。
我如何推动所有东西,以便在遥控器上获得本地回购的完整副本?
当前回答
git-push的手册值得一读。结合这个网站,我在我的。git/config中写了以下内容:
[remote "origin"]
url = …
fetch = …
push = :
push = refs/tags/*
push =:表示“推送任何‘匹配的’分支(即已经存在于远程存储库并且有本地对应的分支)”,而push = refs/tags/*表示“推送所有标签”。
所以现在我只需要运行git push来推送所有匹配的分支和所有标签。
是的,这不是OP想要的(所有要推送的分支必须在远程端已经存在),但是对于那些在谷歌搜索“如何同时推送分支和标签”时发现这个问题的人来说可能是有帮助的。
其他回答
对我来说,有效的方法是。
git push origin --all
我正处于从一个版本控制服务切换到另一个版本控制服务的过程中,需要克隆所有存储库,包括所有分支、标签和历史记录。
为了实现以上目标,我做了下面的事情:
手动签出所有分支到本地存储库(脚本签出所有如下所示), 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
要推送所有分支,可以使用以下任意一种(将REMOTE替换为远程的名称,例如“origin”):
git push REMOTE '*:*'
git push REMOTE --all
推送所有标签:
git push REMOTE --tags
最后,我认为你可以在一个命令中完成这一切:
git push REMOTE --mirror
然而,除此之外——镜子,也会推动你的遥控器,所以这可能不是你想要的。
在像我这样的情况下,你获得了一个回购,现在将远程源切换到一个不同的回购,一个新的空的…
你在里面有repo和所有分支,但你仍然需要为git push -all命令签出这些分支。
你应该在推之前这样做:
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
紧随其后的是
git push --all
我发现这些方法似乎都不适合我。放心燃烧这个死亡,但由于某种原因不能让其他选项正常工作。
预期的结果是回购“克隆”到另一个远程(即从Github到另一个提供商):
所有分支都在新的远程上创建 所有分支历史记录都在新的远程上创建 (我尝试的每个解决方案都错过了这一点) 所有标记都在新的远程上创建 源移动(给定) 非破坏性(暂停——mirror选项)
我看到的主要问题是,所有远程分支都没有在新的远程中重新创建。如果一个命令有,新的远程没有分支历史记录(即做一个git签出分支;Git日志不会显示预期的分支提交)。
我注意到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