我想默认推送和拉取所有分支,包括新创建的分支。
我可以为它定义一个设置吗?
否则,当我在本地添加一个新分支并且我想从服务器中提取它时,最简单的方法是什么?
我创建了一个具有相同名称的新分支并试图拉动它但不起作用。问我分支机构的所有远程配置。我该如何设置呢。
答案 0 :(得分:1132)
最简单的方法是:
git push --all origin
这会推送标签和分支。
答案 1 :(得分:142)
使用现代git,您始终会抓取所有分支(作为远程跟踪分支到refs/remotes/origin/*
命名空间,使用git branch -r
或git remote show origin
可见。
默认情况下(请参阅push.default
配置变量的文档),您可以推送 匹配分支 ,这意味着首先必须执行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
文件,使其具有如下内容:
[remote "origin"] 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/*
答案 2 :(得分:32)
在推送规范中包含+可能是一个坏主意,因为这意味着即使没有-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/*'
答案 3 :(得分:19)
我曾使用以下命令将所有分支迁移到新存储库。
~$ 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
之外的其他分支。
答案 4 :(得分:11)
如果您要将分支机构移动到旧的仓库并且没有本地的所有旧仓库分支,则需要先跟踪它们。
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命令配置repo,如果您没有这样做或者只是想移动本地分支。
重要的是,其他响应只会推动所有LOCAL分支。如果分支仅存在于备用REMOTE存储库中,则它们将在不先跟踪它们的情况下移动。这里介绍的for循环将有助于此。
答案 5 :(得分:5)
要使用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
答案 6 :(得分:2)
如果您要将所有分支机构移动到旧的仓库,那么在本地仓库中,您需要设置跟踪每个分支到现有的原始分支,然后再推送到新的仓库,否则全部您的原始分支不会出现在新的原点。通过跟踪或检查每个分支手动执行此操作,或使用单个衬管:
for remote in `git branch -r | grep -v '\->' | grep -v master`; do git branch --track `echo $remote|sed 's=origin/=='` `echo $remote`; done
这一行命令基于此页面上其他答案的版本,但可以说更好,因为:
接下来,如果要切换原点,请替换旧原点的链接并指向新的遥控器。确保首先使用bitbucket / github GUI创建新远程,但不要向其添加任何文件,否则会出现合并问题。 E.g。
git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git
现在推。注意,推送标签也需要第二个命令:
git push -u --all origin
git push --tags origin
答案 7 :(得分:1)
如果你从一个远程源推送到另一个,你可以使用这个:
git push newremote refs/remotes/oldremote/*:refs/heads/*
这对我有用。参考这个:https://www.metaltoad.com/blog/git-push-all-branches-new-remote
答案 8 :(得分:1)
对我来说转移ALL分支和标签的完整程序是结合@vikas027和@kumarahul的答案:
~$ git clone <url_of_old_repo>
~$ cd <name_of_old_repo>
~$ git remote add new-origin <url_of_new_repo>
~$ git push new-origin --mirror
~$ git push new-origin refs/remotes/origin/*:refs/heads/*
~$ git push new-origin --delete HEAD
最后一步是因为通配符导致新远程出现了一个名为HEAD
的分支
答案 9 :(得分:0)
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
答案 10 :(得分:0)
origin
的解决方案
在全局 gitconfig
中使用以下内容[remote]
push = +refs/heads/*
push = +refs/tags/*
这会推送所有分支和所有标记
origin
?如果你硬编码:
origin
作为所有回购中的遥控器。因此,您无法添加原点,但需要使用set-url
。 origin
已经存在(从第1点开始),请记住:)根据JakubNarębski的回答:
使用现代git,你总是获取所有分支(作为远程跟踪分支到refs / remotes / origin / * namespace