我有一个本地Git回购,我想把它推到一个新的远程回购(全新的回购设置在Beanstalk上,如果这很重要的话)。 我的本地回购有一些分支和标签,我想保留我的所有历史。

看起来我基本上只需要做一个git推送,但这只上传主分支。

我如何推动所有东西,以便在遥控器上获得本地回购的完整副本?


当前回答

我正处于从一个版本控制服务切换到另一个版本控制服务的过程中,需要克隆所有存储库,包括所有分支、标签和历史记录。

为了实现以上目标,我做了下面的事情:

手动签出所有分支到本地存储库(脚本签出所有如下所示), 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 destination +refs/remotes/source/*:refs/heads/*

注意: 如果你不直接使用CLI,你必须转义星号: Git push destination +refs/remotes/source/\*:refs/heads/\* @mattalxndr

这将把远程源中的所有分支推到目标中的头分支,可能执行非快进推。你仍然需要分别推送标签。

我正处于从一个版本控制服务切换到另一个版本控制服务的过程中,需要克隆所有存储库,包括所有分支、标签和历史记录。

为了实现以上目标,我做了下面的事情:

手动签出所有分支到本地存储库(脚本签出所有如下所示), 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

然而,除此之外——镜子,也会推动你的遥控器,所以这可能不是你想要的。

对我来说,有效的方法是。

git push origin --all

实现目标的主要方法是使用——all和——tags标记。忽略其中任何一个都不能实现你想要的东西。不幸的是,它们不能一起使用(不知道为什么),所以它们必须一个接一个地运行。

git push --all
git push --tags

另一个相关的选项是——prune选项,它删除远程上本地不存在的任何分支/标签。

或者,考虑——mirror选项,因为它基本上等同于——all——tags——prune。

git push --mirror