712

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

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

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

我创建了一个同名的新分支并尝试拉,但它不起作用。询问我分支的所有远程配置。我该如何设置。

4

12 回答 12

1497

最简单的方法是:

git push --all origin

这将推送标签和分支。

于 2012-05-07T08:39:52.570 回答
150

使用现代 git,您始终可以获取所有分支(作为远程跟踪分支进入命名空间,使用orrefs/remotes/origin/*可见)。 git branch -rgit remote show origin

默认情况下(请参阅push.default配置变量的文档),您推送匹配的分支,这意味着首先您必须让git push origin branchgit 始终推送它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/*
于 2009-12-16T14:38:09.967 回答
34

在推送规范中包含 + 可能是个坏主意,因为这意味着即使没有 -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/*'
于 2011-03-08T23:28:38.730 回答
32

我曾使用以下命令将所有分支迁移到新存储库。

~$ 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(空白仓库)时,我必须使用倒数第二个(即先推送主服务器)命令。我不确定原因,但在 push ( git push new-origin --mirror) 之后,默认分支指的是其他分支而不是master.

于 2016-02-13T09:03:02.127 回答
14

如果您要将分支从旧分支移动到新 repo,并且没有本地所有旧 repo 分支,则需要先跟踪它们。

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。

重要的一点,其他响应只推送所有本地分支。如果分支仅存在于备用远程存储库中,则它们不会在不先跟踪它们的情况下移动。这里介绍的 for 循环将对此有所帮助。

于 2013-04-18T03:37:06.593 回答
7

如果您要将所有分支从旧的仓库移动到新的仓库,那么在您的本地仓库中,您需要在推送到新仓库之前设置每个分支到现有原始分支的跟踪,否则您的所有原始分支都不会出现在新的起源。通过跟踪或检查每个分支手动执行此操作,或使用一个班轮:

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 提供一个参数,因此每个分支最终都会跟踪 master - 不好
  2. 命名本地分支时不带前缀“origin/”,这是我个人不想要的 - 并且与您正常检出分支时发生的情况一致。
  3. 跳过跟踪大师,因为这已经发生了
  4. 实际上并没有结帐任何东西,因此速度很快
  5. 避免在 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
于 2017-03-29T06:28:46.380 回答
6

要查看所有不使用的分支,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
于 2015-01-15T10:14:04.273 回答
3

对我来说转移所有分支和标签的完整过程是结合@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通配符导致新远程中出现了一个名为的分支

于 2021-02-16T12:27:50.310 回答
3

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

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

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

于 2021-01-21T16:02:11.623 回答
2

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

git remote add newremote new-remote-url

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

我使用了'git push --all -u newremote',但它只将签出的分支推送到newremote。

Git:将所有分支推送到新的远程

作者:软件架构师 Keith Dechant

这是你们中的一些人在使用 Git 存储库时可能遇到的场景。你有一个 Git 存储库的工作副本,比如来自旧服务器。但是您只有工作副本,并且无法访问来源。所以你不能只分叉它。但是你想将整个 repo 和所有分支历史推送到你的新遥控器。

如果您的工作副本包含来自旧远程的跟踪分支(origin/branch1、origin/branch1 等),这是可能的。如果你这样做了,你就有了整个回购和历史。

然而,就我而言,有几十个分支机构,其中一些或全部我从未在本地检查过。将它们全部推开似乎是一件沉重的事情。那么,如何进行呢?

我确定了两个选项:

选项 1:检查每个分支并推送我可以做到这一点,我什至可以编写一个 Bash 脚本来提供帮助。但是,这样做会在每次结帐时更改我的工作文件,并为每个远程跟踪分支创建一个本地分支。对于大型回购,这会很慢。

选项 2:在不更改工作副本的情况下推送 还有第二种选择,它不需要检查每个分支,不会在工作副本中创建无关的分支,甚至不需要修改工作副本中的文件。

如果您的旧的不再活动的遥控器称为“oldremote”,而您的新遥控器称为“newremote”,您可以使用以下命令仅推送远程跟踪分支:

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

在某些情况下,也可以只推送分支的一个子集。如果分支名称以斜线命名(例如,oldremote/features/branch3、oldremote/features/branch4 等),则只能推送名称以“oldremote/features”开头的远程跟踪分支:

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

无论您推送所有分支还是仅推送其中一些分支,Git 都将执行整个操作,而无需创建任何新的本地分支,也无需更改您的工作文件。每个与您的模式匹配的跟踪分支都将被推送到新的远程。

有关该主题的更多信息,请查看 Stack Overflow 上的此线程。

发布日期:2017 年 10 月 9 日

于 2021-09-24T05:54:43.797 回答
1

origin配置中没有硬编码的解决方案

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

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

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

为什么不应该origin在配置中硬编码?

如果你硬编码:

  1. 您最终将origin在所有存储库中成为遥控器。所以你将无法添加原点,但你需要使用set-url.
  2. 如果一个工具创建了一个具有不同名称的遥控器,则所有配置都将不适用。然后你必须重命名遥控器,但重命名将不起作用,因为origin已经存在(从第 1 点开始)记住:)

现代 git 已经处理了获取

根据 Jakub Narębski 的回答:

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

于 2017-06-18T12:25:48.397 回答
0

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

git remote add remote_name remote_address

在您只需要使用以下命令完成之后

git push --all remote_name
于 2022-01-24T17:42:48.543 回答