设置混帐拉和推所有分支机构

我想默认推拉所有分支,包括新创build的分支。

有没有可以为其定义的设置?

否则,当我添加一个新的分支,在本地,我想从服务器拉它,最简单的方法是什么?

我创build了一个具有相同名称的新分支,并试图拉,但它不起作用。 问我所有分支的远程configuration。 我如何设置它。

最简单的方法是做:

git push --all origin 

这将推动标签和分支。

使用现代的git,您总是可以获取所有分支 (作为远程跟踪分支到refs/remotes/origin/*命名空间,使用git branch -rgit remote show origin可见)。

默认情况下(请参阅push.defaultconfigurationvariables的文档),你推送匹配的分支 ,这意味着首先你必须做git push origin branch git推它总是在git push

如果你想一直推送所有分支 ,你可以设置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文件,如下所示:

 [远程“起源”]
         url = user@example.com:/srv/git/repo.git
         fetch = + refs / heads / *:refs / remotes / origin / *
         fetch = + refs / tags / *:refs / tags / *
         push = + refs / heads / *:refs / heads / *
         push = + refs / tags / *:refs / tags / *

在push规范中join+可能不是一个好主意,因为这意味着即使不使用-f ,git也会乐于进行非快速前进的推送,如果远程服务器设置为接受这些推送规则,则可能会丢失历史logging。

试试这个:

 $ 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/*' 

我已经使用下面的命令将所有分支迁移到新的存储库。

 ~$ 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中的repo克隆到AWS CodeCommit (空白回购)时,我必须使用倒数第二个(即先推送master)命令。 我不知道是什么原因,但是推后( git push new-origin --mirror )默认分支是指其他分支而不是master

如果您将分支机构从旧的分支机构转移到新的回购机构,而且没有将所有旧的回购分支机构设在本地,则需要先跟踪这些分支机构。

 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命令configurationrepo,如果你没有这样做,或者只是想移动本地分支。

重要的一点是,其他的回应只推送所有本地分支机构。 如果分支仅存在于备用REMOTE存储库中,那么它们将不会移动,而不会首先进行跟踪。 在这里介绍的for循环将有助于这一点。

要使用git branch -a查看所有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 

如果您将所有分支机构从旧的分支机构移动到新的回购机构,那么在您的本地回购机构中,您需要设置每个分支机构到现有原始分支机构的跟踪,然后推送到新的回购机构,否则所有的起始分支机构将不会出现新的起源。 通过跟踪或检查每个分支来手动执行此操作,或者使用单行代码:

 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的输出中绊倒 – >

接下来,如果您正在切换原点,请将链接replace为旧的原点并指向新的远程。 确保先使用bitbucket / github GUI创build新的远程,但不要添加任何文件,否则会出现合并问题。 例如

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

现在推。 注意第二个命令也需要推送标签:

 git push -u --all origin git push --tags origin 
 for b in $(git branch -a | grep -v master | \ sed -e "s|remotes\/origin\/\(.*\)|\1|g"); do git checkout $b && \ git push origin $b; done 

解决scheme没有硬编码origin在configuration

在你的全局 gitconfig中使用以下内容

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

这推动所有分支和所有标签

为什么你不应该在origin中configuration硬编码?

如果你硬编码:

  1. 您将在所有回购中以origin为远程。 所以你不能添加来源,但你需要使用set-url
  2. 如果一个工具使用不同的名字创build一个远程,那么所有的configuration将不会被应用。 那么你将不得不重命名远程,但重命名将无法正常工作,因为origin已经存在(从第1点)记得:)

现在的git已经抓住了抓取

根据JakubNarębski的回答:

使用现代的git,您总是可以获取所有分支(作为远程跟踪分支到refs / remotes / origin / *命名空间