设置 git 拉取和推送所有分支

Posted

技术标签:

【中文标题】设置 git 拉取和推送所有分支【英文标题】:Set up git to pull and push all branches 【发布时间】:2010-12-27 05:46:01 【问题描述】:

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

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

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

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

【问题讨论】:

“并试图拉,但它不起作用”。请详细说明。向我们展示您尝试使用的命令。 【参考方案1】:

最简单的方法是:

git push --all origin

这将推送标签和分支。

【讨论】:

在我在 SO 和其他地方找到的几十个答案中,这是推送新创建的本地分支的最简单方法,无需触及配置。谢谢! 如果您添加一次-u,例如git push --all origin -u,跟踪已设置,之后您可以简单地使用 git push 对于 git 版本 1.7.12.3,我必须使用 git push --tags origin 推送所有标签。 还要查看“--mirror”而不是“--all”,这会推送更多内容 警告:如果你有一堆你没有清理的本地分支(功能,修补程序) - 或者没有正确清理(我),这将淹没你的遥控器。该死。我们刚刚进行了修剪。不知道为什么我的当地人还剩下这么多分店。【参考方案2】:

使用现代 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 文件以获得类似以下内容:

[遥远的“起源”] 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/*

【讨论】:

@Merc:git push --all origin 适合一次性发布所有分支和标签,尽管默认到当前版本的“匹配”语义意味着您将在之后推送所有分支......除非您添加新的分支或标签。 设置“默认推送[...]所有分支”就是这样写的。 您可以改进答案以添加以这种方式重新配置 Git 的方式。这对于设置了简单模式的用户很有用。 这在 git 2.0 之后发生了变化。推送默认很简单,不再匹配。 @BrianLacy 在我看来,您在配置中的 refspec 周围有引号。只需在编辑器中打开配置文件并检查。 现在push.default 的默认值为simple【参考方案3】:

在推送规范中包含 + 可能是个坏主意,因为这意味着 git 会很高兴地进行非快进推送 即使没有 -f,并且如果设置了远程服务器接受那些,你可以失去历史。

试试这个:

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

【讨论】:

您还可以将--global 选项添加到每个存储库中,以使其成为所有存储库的全局默认值。 很遗憾,在做git remote add时git会自动加上+。【参考方案4】:

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

~$ 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以外的其他分支。

【讨论】:

非常适合将存储库移动到另一台主机。谢谢! 这确实是唯一有用的方法。使用git push new_origin --all只需将您当前的本地分支推送到new_origin,而不是所有的起源分支。 请注意,这会创建一个 --bare 存储库,这与常规存储库有点不同,它只有 .git 文件,而不是您的文件。如果您不打算在其中工作,那就足够了。请参阅 --bare--mirror git-scm.com/docs/git-clone。 尽管它只有 .git 文件而不是实际的源代码,但如果您执行远程更新,它将重新获取从源到目标的所有内容。 这是救命稻草!这种“master before mirror”方法解决了 Bitbucket 是目标并且认为除“master”之外的其他分支是主分支的问题。【参考方案5】:

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

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 分支。如果分支仅存在于备用远程存储库中,则它们不会在不先跟踪它们的情况下移动。此处介绍的 for 循环将对此有所帮助。

【讨论】:

顺便说一句,我在这里使用“bb”代替“origin”,因为我假设您的原始/旧存储库被命名为“origin”并且可能仍附加到该标签。 “bb”代表 Bitbucket,我将原始存储库移至该位置,但如果您愿意,可以将其称为更适用的名称,例如“neworigin”。 这对我不起作用。最终所有远程分支都跟踪同一个本地分支:/ AFAIK 这不应该工作,根据@jhsowter 评论。我在新克隆的仓库中跟踪远程分支的正确命令是 git branch --track reponame origin/reponame 否则您将在当前本地分支上跟踪所有远程分支 我将 repo-collecting sn-p 更改为 git branch -r | grep -v '\-&gt;' | sed 's/ origin\///',它只给出了远程分支名称。【参考方案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

【讨论】:

λ git fetch --all origin fatal: fetch --all 不接受存储库参数 你在尝试git fetch --all 吗?【参考方案7】:

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

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

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

    它正确设置了分支跟踪,这与此页面上此命令的一些旧变体不同,后者仅向 --track 提供一个参数,因此每个分支最终都会跟踪 master - 不好 命名本地分支时不带前缀“origin/”,这是我个人不想要的 - 并且与您正常检出分支时发生的情况一致。 跳过跟踪主机,因为这已经发生了 实际上并没有结帐任何东西,因此速度很快 避免在 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

【讨论】:

【参考方案8】:

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

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

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

【讨论】:

谢谢!这对我有帮助:)【参考方案9】:

对我来说转移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的分支

【讨论】:

【参考方案10】:

在配置中不使用硬编码origin 的解决方案

在您的 global gitconfig

中使用以下内容
[remote]
    push = +refs/heads/*
    push = +refs/tags/*

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

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

如果你硬编码:

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

现代 git 已经处理好了提取

根据 Jakub Narębski 的回答:

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

【讨论】:

【参考方案11】:

我找到了最好和最简单的方法here,就像@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 等)。如果你这样做, 你有完整的 repo 和历史记录。

但是,在我的例子中,有几十个分支,部分或全部 他们我从来没有在本地检查过。推动他们似乎是一个 举重。那么,如何进行呢?

我确定了两个选项:

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

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

如果您的旧遥控器被称为“oldremote”并且您的 新遥控器称为“newremote”,您可以只推送遥控器 使用此命令跟踪分支:

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

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

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

无论你 推送所有分支或只是其中一些分支,Git 将执行 整个操作,无需创建任何新的本地分支,也无需 更改您的工作文件。每个跟踪分支 匹配您的模式将被推送到新的遥控器。

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

发布日期:2017 年 10 月 9 日

【讨论】:

以上是关于设置 git 拉取和推送所有分支的主要内容,如果未能解决你的问题,请参考以下文章

2. github创建 git仓库,克隆,拉取和推送操作(所有的git命令前提是一定在当前项目目录下)

git逻辑和基本命令

创建git仓库及克隆拉取和推送操作

在执行拉取和推送操作时出现以下错误(git-upload-pack not allowed on )

Git拉取和提交代码的基本步骤

git常用命令