ChatGPT解决这个技术问题 Extra ChatGPT

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

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

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

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

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

“并试图拉,但它不起作用”。请详细说明。向我们展示您尝试使用的命令。

s
saurabheights

最简单的方法是:

git push --all origin

这将推送标签和分支。


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

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

默认情况下(请参阅 push.default 配置变量的文档)您推送 匹配的分支,这意味着首先您必须执行 git push origin branch 才能让 git 始终将其推送到 { 3}。

如果你想总是推送所有分支,你可以设置 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/*

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

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

~$ 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(空白存储库)时,我必须使用倒数第二个(即先推送 master)命令。我不确定原因,但在推送 (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”之外的其他分支是主分支的问题。
M
Michiel de Mare

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

您还可以将 --global 选项添加到其中的每一个,以使其成为所有存储库的全局默认值。
不幸的是,在执行 git remote add 时,git 会自动添加 +。
J
James M. Greene

如果您要将分支从旧分支移动到新 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 循环将对此有所帮助。


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

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

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

t
tokhi

要查看所有不使用 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 吗?
A
Amir

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


k
kumarahul

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

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

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


t
tom

我找到了最好和最简单的方法 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: Push All Branches to a New Remote 作者 Keith Dechant, 软件架构师 这是你们中的一些人在使用 Git 存储库时可能遇到的场景。你有一个 Git 存储库的工作副本,比如来自旧服务器。但是您只有工作副本,并且无法访问来源。所以你不能只分叉它。但是你想将整个 repo 和所有分支历史推送到你的新遥控器。如果您的工作副本包含来自旧远程的跟踪分支(origin/branch1、origin/branch1 等),这是可能的。如果你这样做了,你就有了整个回购和历史。然而,就我而言,有几十个分支机构,其中一些或全部我从未在本地检查过。将它们全部推开似乎是一件沉重的事情。那么,如何进行呢?我确定了两个选项: 选项 1:检查每个分支并推送我可以这样做,我什至可以编写一个 Bash 脚本来提供帮助。但是,这样做会在每次结帐时更改我的工作文件,并为每个远程跟踪分支创建一个本地分支。对于大型回购,这会很慢。选项 2:在不更改工作副本的情况下推送 还有第二种选择,它不需要检查每个分支,不会在工作副本中创建无关的分支,甚至不需要修改工作副本中的文件。如果您的旧的不再活动的遥控器称为“oldremote”,而您的新遥控器称为“newremote”,您可以使用以下命令仅推送远程跟踪分支:git push newremote refs/remotes/oldremote/*:refs/ head/* 在某些情况下,也可以只推送分支的一个子集。如果分支名称以斜线命名(例如 oldremote/features/branch3、oldremote/features/branch4 等),您只能推送名称以“oldremote/features”开头的远程跟踪分支: git push newremote refs /remotes/oldremote/features/*:refs/heads/features/* 无论你推送所有分支还是只推送其中一些分支,Git 都会执行整个操作,而无需创建任何新的本地分支,也不会更改你的工作文件。每个与您的模式匹配的跟踪分支都将被推送到新的远程。有关该主题的更多信息,请查看 Stack Overflow 上的此线程。发布日期:2017 年 10 月 9 日


D
Dheeraj Bhaskar

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

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

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

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

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

如果你硬编码:

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

现代 git 已经处理了获取

根据 Jakub Narębski 的回答:

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


k
keginx

添加您的新远程仓库,最后一步将在您推送时排除 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/{}

m
mohsen

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

git remote add remote_name remote_address

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

git push --all remote_name