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

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

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

我创建了一个具有相同名称的新分支,并试图拉,但它不起作用。要求我提供分支机构的所有远程配置。怎么设置呢?


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

默认情况下(请参阅push.default配置变量的文档),您会推送匹配的分支,这意味着首先您必须执行git push origin branch,以便git总是在git push上推送它。

如果你想一直推送所有分支,你可以设置push refspec。假设远程名为origin,你可以使用git配置:

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

在推送规范中包含+可能是一个坏主意,因为这意味着即使没有-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/*'

最简单的方法是:

git push --all origin

这将推动标签和分支。


如果你正在将分支从旧的回购转移到新的回购,并且没有所有的旧回购分支都在本地,你将需要首先跟踪它们。

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配置命令配置repo。

重要的是,其他响应只推送所有LOCAL分支。如果分支只存在于一个备用的REMOTE存储库中,那么在没有首先跟踪它们之前,它们将不会移动。这里给出的for循环将帮助解决这个问题。


要查看所有没有使用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 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(空白repo)时,我不得不使用第二个最后(即推主第一个)命令。我不确定原因,但在push (git push new-origin——mirror) default branch指的是master以外的一些其他分支。


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

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

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

it correctly sets up the branch tracking, unlike some older variants of this command on this page which only supply one parameter to --track and thus each branch ends up tracking master - not good names the local branches without the prefix “origin/” which I personally don’t want - and is consistent with what happens when you checkout a branch normally. skips tracking master since that is already happening doesn’t actually checkout anything thus is fast avoids stumbling over the -> in the output of 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

解决方案没有硬编码的配置来源

在全局gitconfig中使用以下命令

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

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

为什么你不应该硬编码的来源配置?

如果你硬编码:

你最终会在所有的回购中使用origin作为遥控器。你不能添加origin,你需要使用set-url。 如果一个工具用不同的名称创建了一个远程,则push all配置将不应用。然后你将不得不重命名远程,但重命名将不起作用,因为原点已经存在(从点1)记住:)

现代git已经在处理抓取了

美国每年Jakub刚纳ębski的答案:

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


如果你从一个远端源推到另一个远端源,你可以使用这个:

git push newremote refs/remotes/oldremote/*:refs/heads/*

这对我很管用。参考这个:https://www.metaltoad.com/blog/git-push-all-branches-new-remote


对我来说,转移所有分支和标签的完整过程是,结合@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的分支由于通配符出现在新的远程中


我在这里找到了最好和最简单的方法,就像@kumarahul张贴的那样,对我来说很有魅力,它会把所有的标签和分支从原点推送到新的遥控器:

git remote add newremote new-remote-url

git push newremote --tags refs/remotes/origin/*:refs/heads/*

我使用'git push——all -u newremote',但它只会将检出的分支推到newremote。

Git: Push All Branches to a New Remote by Keith Dechant , Software Architect Here's a scenario some of you might have encountered with your Git repositories. You have a working copy of a Git repo, say from an old server. But you only have the working copy, and the origin is not accessible. So you can't just fork it. But you want to push the whole repo and all the branch history to your new remote. This is possible if your working copy contains the tracking branches from the old remote (origin/branch1, origin/branch1, etc.). If you do, you have the entire repo and history. However, in my case there were dozens of branches, and some or all of them I had never checked out locally. Pushing them all seemed like a heavy lift. So, how to proceed? I identified two options: Option 1: Checkout every branch and push I could do this, and I could even write a Bash script to help. However, doing this would change my working files with each checkout, and would create a local branch for each of the remote tracking branches. This would be slow with a large repo. Option 2: Push without changing your working copy There is a second alternative, which doesn't require a checkout of each branch, doesn't create extraneous branches in the working copy, and doesn't even modify the files in the working copy. If your old, no-longer-active remote is called "oldremote" and your new remote is called "newremote", you can push just the remote tracking branches with this command: git push newremote refs/remotes/oldremote/*:refs/heads/* In some cases, it's also possible to push just a subset of the branches. If the branch names are namespaced with a slash (e.g., oldremote/features/branch3, oldremote/features/branch4, etc.), you can push only the remote tracking branches with names beginning with "oldremote/features": git push newremote refs/remotes/oldremote/features/*:refs/heads/features/* Whether you push all the branches or just some of them, Git will perform the entire operation without creating any new local branches, and without making changes to your working files. Every tracking branch that matches your pattern will be pushed to the new remote. For more information on the topic, check out this thread on Stack Overflow. Date posted: October 9, 2017


首先将远程git添加到您的loacl with中

git remote add remote_name remote_address

而之后你只需要用下面的命令就可以了

git push --all remote_name

添加新的远程回购,最后一步将在您推送时排除HEAD分支

git clone <url_of_old_repo>
cd <name_of_old_repo>
git remote add new-origin <url_of_new_repo>
git ls-remote . | grep 'refs/remotes/origin/' | grep -v 'HEAD' | awk -F 'origin/' '{print $2}' | xargs -i git push -f new-origin  --tags refs/remotes/origin/{}:refs/heads/{}