设置git来拉动并推动所有分支

时间:2009-12-16 13:09:53

标签: git version-control branch push

我想默认推送和拉取所有分支,包括新创建的分支。

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

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

我创建了一个具有相同名称的新分支并试图拉动它但不起作用。问我分支机构的所有远程配置。我该如何设置呢。

11 个答案:

答案 0 :(得分:1132)

最简单的方法是:

git push --all origin

这会推送标签和分支。

答案 1 :(得分:142)

使用现代git,您始终会抓取所有分支(作为远程跟踪分支到refs/remotes/origin/*命名空间,使用git branch -rgit 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

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

  1. 它正确设置了分支跟踪,不像这个命令的一些旧版本,只有一个参数提供给--track,因此每个分支最终跟踪主 - 不好
  2. 命名本地分支,但没有我个人不想要的前缀“origin /” - 并且与您正常结账时发生的情况一致。
  3. 跳过跟踪主人,因为已经发生了
  4. 实际上没有检查任何东西因此很快
  5. 避免绊倒 - &gt;在git branch -r
  6. 的输出中

    接下来,如果要切换原点,请替换旧原点的链接并指向新的遥控器。确保首先使用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

如果你硬编码:

  1. 您最终将origin作为所有回购中的遥控器。因此,您无法添加原点,但需要使用set-url
  2. 如果工具创建具有不同名称的遥控器,则所有配置将不适用。然后你将不得不重命名遥控器,但重命名将无效,因为origin已经存在(从第1点开始),请记住:)
  3. 现代git

    已经完成了提取工作

    根据JakubNarębski的回答:

      

    使用现代git,你总是获取所有分支(作为远程跟踪分支到refs / remotes / origin / * namespace