设置git拉动所有分支


615

我想默认情况下推拉所有分支,包括新创建的分支。

我可以为它定义一个设置吗?

否则,当我在本地添加新分支并且想要从服务器中将其提取时,最简单的方法是什么?

我用相同的名称创建了一个新分支,并尝试拉,但它不起作用。向我询问分支的所有远程配置。我该如何设置。


4
“并试图拉,但不起作用”。请详细。向我们展示您尝试使用的命令。
2009年

Answers:


1297

最简单的方法是:

git push --all origin

这将推送标签和分支。


10
在SO和其他地方找到的数十个答案中,这是在不涉及配置的情况下推送新创建的本地分支的最简单方法。谢谢!
安德拉斯Szepesházi

174
并且,如果您添加-u一次,例如git push --all origin -u,跟踪已设置,然后您可以简单地使用git push
亚历克

23
对于git版本1.7.12.3,我不得不git push --tags origin用来推送所有标签。
thisgeek 2012年

17
还要看“ --mirror”而不是“ --all”,这会推动更多工作
Loda

21
警告:如果您有一堆尚未清理的本地分支(功能,修补程序)或未正确清理(我),则这将淹没您的遥控器。该死的。我们只是做了修剪。不知道为什么我的当地人剩下这么多分支机构。
2014年

147

使用现代git时,您始终会获取所有分支(作为到refs/remotes/origin/*名称空间的远程跟踪分支,可通过git branch -r或看到git remote show origin)。

默认情况下(请参阅push.defaultconfig变量的文档),您推送匹配的分支,这意味着首先必须使git push origin branchgit始终将其推送到git push

如果要始终推送所有分支,则可以设置推送refspec。假设遥控器已命名origin,则可以使用git config

$ git config --add remote.origin.push '+refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push '+refs/tags/*:refs/tags/*'

或直接编辑.git/config文件,使其具有以下内容:

[远程“来源”]
        网址= user@example.com:/srv/git/repo.git
        提取= + refs / heads / *:refs / remotes / origin / *
        提取= + refs / tags / *:refs / tags / *
        推送= + refs / heads / *:refs / heads / *
        推送= + refs / tags / *:refs / tags / *

3
@Merc:git push --all origin一次发布所有分支和标签非常有用,尽管默认直到当前版本的“ matching”语义都意味着您之后将推送所有分支...除非添加新的分支或标签。该设置“推[...]默认情况下,所有的分支”作为写。
JakubNarębski2013年

您可以改善答案,以添加以这种方式重新配置Git的方法。这对于设置简单模式的用户很有用。
Dereckson 2014年

3
自git 2.0起,这已经改变。推送默认设置很简单,不再匹配。
迈克2014年

我尝试了此操作,但在推送时遇到了一个错误:(fatal: Invalid refspec ''+refs/heads/*:refs/heads/*'' 注意:我使用的是git 2.0。我仍在研究如何解决此问题。)
Brian Lacy 2015年

2
现在的默认值push.defaultsimple
hasanghaforian '16

32

在push规范中包含+可能不是一个好主意,因为这意味着即使没有-f,git也会很乐意进行非快进推送,并且如果将远程服务器设置为接受那些,则可能会丢失历史记录。

试试这个:

$ git config --add remote.origin.push 'refs/heads/*:refs/heads/*'
$ git config --add remote.origin.push 'refs/tags/*:refs/tags/*'
$ git config --add remote.origin.fetch 'refs/heads/*:refs/remotes/origin/*'
$ git config --add remote.origin.fetch 'refs/tags/*:refs/tags/*'

您还可以将--global选项添加到每个选项中,以使该选项成为所有存储库的全局默认值。
以太

不幸的是,这样做时git会自动添加+ git remote add
以太

25

我曾使用以下命令将所有分支迁移到新存储库。

~$ git clone --mirror <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin master
~$ git push new-origin --mirror

注意:在将仓库从Atlassian Stash克隆到AWS CodeCommit(空白仓库)时,我必须使用倒数第二条命令(即,首先推送主数据库)。我不确定原因,但是在推送(git push new-origin --mirror)之后,默认分支引用了以外的其他分支master


1
非常适合将存储库移动到另一个主机。谢谢!
2013年

2
这确实是唯一有用的方法。使用git push new_origin --all仅将您当前的本地分支推送到new_origin,而不是所有原始分支。
yanzi1225627

只是要注意,这使得--bare存储库与常规存储库有所不同,它仅包含.git文件,而没有文件。如果您不打算在其中工作,那就足够了。参见--bare--mirror git-scm.com/docs/git-clone
jmmut

尽管它只有.git文件,而没有实际的源代码,但是如果您执行远程更新,它将重新获取从源到目的地的所有内容。
SanthoshM'17年

这是救命稻草!此“先镜像后主”方法解决了以下问题:Bitbucket是目的地,并且认为除“大师”以外的其他分支是主分支。
Toddius Zho

12

如果您要将分支从一个旧的仓库转移到一个新的仓库中,而又没有将所有的旧仓库都放在本地,则需要先对其进行跟踪。

for remote in `git branch -r | grep -v '\->'`; do git branch --track $remote; done

然后添加新的远程仓库:

git remote add bb <path-to-new-repo>

然后,您可以使用以下命令推送所有内容:

git push -u bb --all

或者,如果您一次不执行此操作,或者仅希望移动本地分支,则可以使用此处其他响应中提到的git config命令配置存储库。

重要的是,其他响应仅推送所有本地分支。如果分支仅存在于备用REMOTE存储库中,则它们必须先进行跟踪才能移动。这里介绍的for循环将对此有所帮助。


顺便说一句,我在这里使用“ bb”代替“ origin”,因为我假设您的原始/旧存储库被命名为“ origin”,并且可能仍附加到该标签上。“ bb”用于Bitbucket,我将原始存储库移到了其中,但是您可以根据需要将其称为“ neworigin”。
兰斯·克利夫兰

2
那对我没用。最终所有远程分支都跟踪同一个本地分支:/
jhsowter 2014年

2
根据@jhsowter的评论,此操作无效。对我来说,在新克隆的存储库中跟踪远程分支的正确命令是git branch --track reponame origin/reponame否则,您将在当前本地分支上跟踪所有远程分支
Pioneer Skies

我将回购代码段更改为git branch -r | grep -v '\->' | sed 's/ origin\///',仅提供了远程分支名称。
保罗·希克斯

6

要查看所有不使用的分支,git branch -a应执行以下步骤:

for remote in `git branch -r`; do git branch --track $remote; done
git fetch --all
git pull --all

现在您可以看到所有分支:

git branch

要推送所有分支,请尝试:

git push --all


你在尝试git fetch --all吗?
tokhi

4

如果您要将所有分支从旧仓库移至新仓库,则在本地仓库中,您需要设置对每个分支到现有原始分支的跟踪,然后再推送到新仓库,否则所有原始分支都不会出现在新的起源。通过跟踪或签出每个分支来手动执行此操作,或使用一个衬套:

for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done

这一行命令基于此版本在本页其他答案中的版本,但可以说更好,因为:

  1. 它正确地设置了分支跟踪,这与此页面上此命令的某些旧变体不同,后者仅向--track提供一个参数,因此每个分支最终都成为跟踪主对象-不好
  2. 命名本地分支时不带前缀“ origin /”,这是我个人不希望看到的-与正常签出分支时发生的情况一致。
  3. 跳过跟踪大师,因为这已经在发生
  4. 实际上并没有结帐,因此速度很快
  5. 避免绊倒git branch -r输出中的->

接下来,如果要切换原点,请将链接替换为旧的原点,然后指向新的遥控器。确保首先使用bitbucket / github GUI创建新的遥控器,但不要向其中添加任何文件,否则会出现合并问题。例如

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

现在推。请注意,还需要第二个命令来推送标签:

git push -u --all origin
git push --tags origin

0

解决方案,无需origin在配置中进行硬编码

全局 gitconfig中使用以下内容

[remote]
    push = +refs/heads/*
    push = +refs/tags/*

这将推送所有分支和所有标签

为什么origin不对配置进行硬编码?

如果您硬编码:

  1. 您最终将origin在所有存储库中都作为遥控器。因此,您将无法添加原点,但需要使用set-url
  2. 如果工具使用不同的名称创建了一个遥控器,则所有配置都将不适用。然后,您必须重命名遥控器,但是重命名将不起作用,因为origin已经存在(从第1点开始),请记住:)

取现已由现代git处理

根据雅库布·纳伦斯基(JakubNarębski)的回答:

使用现代git时,您始终会获取所有分支(作为远程跟踪分支进入refs / remotes / origin / *名称空间)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.