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

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

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


当前回答

这里有另一个对同一件事的看法,它更适合我所处的情况。它解决了您有多个远程的问题,想要克隆远程源中的所有分支到远程目标,但不需要事先检查它们。

(我与丹尼尔的解决方案的问题是,它将拒绝从源远程签出跟踪分支,如果我之前已经签出了它,即,它不会在推送之前更新我的本地分支)

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

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

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

其他回答

我最喜欢的(也是最简单的)方法

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

我发现上面的答案还有一些不清楚的地方,会误导用户。首先,git push new_origin——all和git push new_origin——mirror不能复制所有的origin分支,它只能复制你本地已经存在的分支到你的new_origin。

下面是我测试过的两种有用的方法:

1、副本由克隆裸回购。Git clone——bare origin_url,然后进入文件夹,然后Git push new_origin_url——mirror。通过这种方式,你也可以使用git clone——mirror origin_url, both——bareand——mirror将下载一个裸回购,不包括工作区。请参考这个

2、如果你有一个使用git克隆的git repo,这意味着你有裸repo和git工作区,你可以使用git远程添加new_origin new_origin_url,然后git push new_origin +refs/remotes/origin/\*:refs/heads/\*,然后git push new_origin——tags

通过这种方式,你会得到一个额外的头部分支,这是没有意义的。

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

git push --all
git push --tags

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

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

git push --mirror

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

git push origin --all

要推送分支和标签(但不包括遥控器):

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

这相当于结合了git push的——tags和——all选项,而git似乎不允许这样做。