设置 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 -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
文件以获得类似以下内容:
【讨论】:
@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 '\->' | 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命令前提是一定在当前项目目录下)