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

Cor*_*eke 506 git

我有一个本地Git仓库,我想推送到一个新的远程仓库(在Beanstalk上设置全新的仓库,如果这很重要).我的本地仓库有一些分支和标签,我想保留我的所有历史记录.看起来我基本上只需要执行git push,但只上传master分支.如何推送所有内容,以便在遥控器上获得我当地仓库的完整副本?

cmc*_*nty 819

要推送所有分支,请使用(将REMOTE替换为远程名称,例如"origin"):

git push REMOTE '*:*'
git push REMOTE --all
Run Code Online (Sandbox Code Playgroud)

推送所有标签:

git push REMOTE --tags
Run Code Online (Sandbox Code Playgroud)

最后,我认为您可以在一个命令中执行以下操作:

git push REMOTE --mirror
Run Code Online (Sandbox Code Playgroud)

但是,此外--mirror,还会推送你的遥控器,所以这可能不是你想要的.

  • 我的上帝.............我撕毁整个互联网,我发现`--all`开关是AAAAALLLLLLLLLLLLLL我需要的! (52认同)
  • 如果原始遥控器仍然可用,那么做一个`git clone --mirror old-remote-url是个不错的主意.cd repo.git; git push --mirror new-remote-url`. (47认同)
  • `--all`而不是`*:*`似乎更友好 (46认同)
  • 只是注意到`git push REMOTE --all`返回`没有常见的参考,没有指定;`什么都不做.而``git push REMOTE'*:*`实际上把所有分支都推到了远程. (19认同)
  • 使用--dry-run来检查会发生什么,如果你在本地有"tmp"或"feature"分支,你真的不想在REMOTE中更新 (10认同)
  • - 镜子太棒了!这就是我一直在寻找的东西.它允许您从服务器A克隆,然后将整个事物推送到新的服务器B. - 只有本地跟踪的分支 - 这使得丢失工作变得容易! (5认同)
  • 我不确定,但看起来`git push REMOTE --all` 只将本地分支推送到远程,其中`git push REMOTE '*:*'` 将本地分支*和*其他远程分支推送到远程。同样,我不确定我是否理解正确,但 `--all` 和 `'*:*'` 之间肯定有区别 (3认同)
  • 区别在于 `--all` 将仅推送本地签出的分支,而 `*:*` 将推送从源源到目标源的所有分支,即包含标签的完整克隆 (2认同)

Dan*_*iel 142

在像我这样的情况下,你获得了一个回购,现在正在将远程原点切换到另一个回购,一个新的空回购......

所以你有你的repo和里面的所有分支,但是你仍然需要检查那些分支以获得git push --all命令以实际推送它们.

你应该在推动之前执行此操作:

for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done
Run Code Online (Sandbox Code Playgroud)

其次是

git push --all
Run Code Online (Sandbox Code Playgroud)

  • 奇怪的是,`git push'*:*'`推了所有分支.`git push -all`刚推了主人.我把回购从github运送到bitbucket. (7认同)
  • 这也非常有用,因为我必须手动检查所有分支.这对下次来说会很好. (4认同)
  • 而不是检查每个分支,你应该只做"git branch --track $ remote".在巨大的回购中检查旧分支需要一些时间 (3认同)
  • 为此,我必须做一个小改动:`--track remotes / $ remote`而不是`--track $ remote`。这是完整的命令行:`git branch -r中的remote。grep -v master \`; 做git checkout --track remotes / $ remote; 完成` (2认同)

Pie*_*eed 86

这是对我所处的情况更好的另一种看法.它解决了你有多个遥控器的问题,想要将远程的所有分支克隆source到远程,destination但不必事先检查它们.

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

git push destination +refs/remotes/source/*:refs/heads/*
Run Code Online (Sandbox Code Playgroud)

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

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

这将把远程的所有分支推source送到一个头部分支destination,可能会进行非快速推送.您仍然需要单独推送标签.

  • +1这对我有用,从一个`remote`克隆到另一个.谢谢! (8认同)
  • 我不得不逃避星号:`git push destination + refs/remotes/source /\*:refs/heads /\*` (3认同)
  • 优秀的答案,与通常的`--mirror`参数完全不同,每个人都推荐.适用于您只想保持同步两个遥控器以用于自动化或审计目的的场景. (3认同)
  • 谢谢,这在 `git push origin *:*` 不起作用的地方有效,没有 `git clone --bare` 或 `git clone --mirror` 并且没有循环来实现所有远程分支。移动存储库的最终命令: 1) `git clone oldurl` 2) `git remote set-url origin newurl` 3) `git push -u origin --tags 'refs/remotes/origin/*:refs/heads/* '` (3认同)
  • 对我来说,这最终推动了一个名为 HEAD 的分支,我认为在这种情况下这不是故意的。 (2认同)

Fri*_*977 15

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

git clone --mirror  OLD_GIT_URL
cd  NEW_CREATED_FOLDER
git remote add NEW-REMOTE NEW_GIT_URL
git push  NEW-REMOTE --mirror 
Run Code Online (Sandbox Code Playgroud)


scy*_*scy 13

该联机帮助页git-push值得一读.结合这个网站,我在我的网站上写了以下内容.git/config:

[remote "origin"]
    url = …
    fetch = …
    push = :
    push = refs/tags/*
Run Code Online (Sandbox Code Playgroud)

push = :手段"推动任何'匹配’分支(即已经存在于远程仓库,并有当地合作即分行)",而push = refs/tags/*表示"推动所有标签".

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

是的,这不是OP想要的(所有分支都必须已经存在于远程端),但是对于那些在搜索"我如何在同一时间推送分支和标签"时发现这个问题的人可能会有所帮助时间".


Pra*_*tik 12

运行以下命令将现有存储库移动到包含所有分支和标签的新远程存储库:

cd existing_repo
git remote rename origin old-origin
git remote add origin git@<repo-url.git>
for remote in `git branch -r `; do git checkout --track remotes/$remote ; done
git push -u origin --all
git push -u origin --tags
Run Code Online (Sandbox Code Playgroud)


ta.*_*.is 11

如果目的地为空,这是我找到的最简洁的方法.切换到空文件夹,然后:

# Note the period for cwd >>>>>>>>>>>>>>>>>>>>>>>> v
git clone --bare https://your-source-repo/repo.git .
git push --mirror https://your-destination-repo/repo.git
Run Code Online (Sandbox Code Playgroud)

替换https://...file:///your/repo等中的.


小智 9

在我的情况下,有用的是什么.

git push origin --all
Run Code Online (Sandbox Code Playgroud)

  • 简单容易。有用!“ origin”是远程URL Git存储库的别名。 (2认同)

yan*_*627 6

我发现上面的回答还有一些不清楚的地方,会误导用户。首先,可以肯定的是git push new_origin --allgit push new_origin --mirror不能复制所有的原始分支,它只是将您本地现有的分支复制到您的 new_origin。

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

1,通过克隆裸回购复制。git clone --bare origin_url,然后进入该文件夹,git push new_origin_url --mirror。通过这种方式,你也可以使用git clone --mirror origin_url,无论是--bare--mirror将下载的裸回购,不包括工作区。请参考这个

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

通过这种方式,您将获得一个额外的头部分支,这是没有意义的。


Mic*_*ski 6

镜像存储库

创建存储库的裸克隆。

git clone --bare https://github.com/exampleuser/old-repository.git
Run Code Online (Sandbox Code Playgroud)

镜像推送到新存储库。

cd old-repository.git
git push --mirror https://github.com/exampleuser/new-repository.git
Run Code Online (Sandbox Code Playgroud)

删除您在步骤1中创建的临时本地存储库。

cd ..
rm -rf old-repository.git
Run Code Online (Sandbox Code Playgroud)

镜像包含Git大文件存储对象的存储库

创建存储库的裸克隆。将示例用户名替换为拥有存储库的人员或组织的名称,然后将示例存储库名称替换为要复制的存储库的名称。

git clone --bare https://github.com/exampleuser/old-repository.git
Run Code Online (Sandbox Code Playgroud)

导航到刚克隆的存储库。

cd old-repository.git
Run Code Online (Sandbox Code Playgroud)

引入存储库的Git大文件存储对象。

git lfs fetch --all
Run Code Online (Sandbox Code Playgroud)

镜像推送到新存储库。

git push --mirror https://github.com/exampleuser/new-repository.git
Run Code Online (Sandbox Code Playgroud)

将存储库的Git大文件存储对象推送到镜像。

git lfs push --all https://github.com/exampleuser/new-repository.git
Run Code Online (Sandbox Code Playgroud)

删除您在步骤1中创建的临时本地存储库。

cd ..
rm -rf old-repository.git
Run Code Online (Sandbox Code Playgroud)

以上说明来自Github帮助:https : //help.github.com/articles/duplicating-a-repository/


CEL*_*CEL 5

推送分支和标签(但不推送远程):

git push origin 'refs/tags/*' 'refs/heads/*'
Run Code Online (Sandbox Code Playgroud)

这相当于组合--tags--all选项git push,而 git 似乎不允许这样做。


Luk*_*rić 5

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

为了实现上述目标,我接下来做了:

  • 手动将所有分支签出到本地存储库(签出所有分支的脚本如下所示),
  • 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
Run Code Online (Sandbox Code Playgroud)