设置混帐拉和推所有分支机构
我想默认推拉所有分支,包括新创build的分支。
有没有可以为其定义的设置?
否则,当我添加一个新的分支,在本地,我想从服务器拉它,最简单的方法是什么?
我创build了一个具有相同名称的新分支,并试图拉,但它不起作用。 问我所有分支的远程configuration。 我如何设置它。
最简单的方法是做:
git push --all origin
这将推动标签和分支。
使用现代的git,您总是可以获取所有分支 (作为远程跟踪分支到refs/remotes/origin/*
命名空间,使用git branch -r
或git remote show origin
可见)。
默认情况下(请参阅push.default
configurationvariables的文档),你推送匹配的分支 ,这意味着首先你必须做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
这一行命令是基于这个页面的其他答案中的版本,但可以说是更好的,因为:
- 它正确地设置了分支追踪,不同于这个页面上这个命令的一些老版本,它只提供一个参数给–track,因此每个分支最终跟踪主 – 不好
- 命名本地分公司没有我个人不希望的前缀“origin /”,并与正常结账分支时发生的情况一致。
- 跳过跟踪主,因为这已经发生
- 实际上没有检查任何东西,因此速度很快
- 避免在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硬编码?
如果你硬编码:
- 您将在所有回购中以
origin
为远程。 所以你不能添加来源,但你需要使用set-url
。 - 如果一个工具使用不同的名字创build一个远程,那么所有的configuration将不会被应用。 那么你将不得不重命名远程,但重命名将无法正常工作,因为
origin
已经存在(从第1点)记得:)
现在的git已经抓住了抓取
根据JakubNarębski的回答:
使用现代的git,您总是可以获取所有分支(作为远程跟踪分支到refs / remotes / origin / *命名空间