设置git来拉推所有分支

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

有没有我可以定义的设置?

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

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

299064 次浏览

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

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

如果您想始终推动所有分支,您可以设置推送引用规范。假设远程名为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/*

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

最简单的方法是:

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 config命令配置存储库。

重要的一点是,其他响应只推送所有LOCAL分支。如果分支只存在于备用REMOTE存储库中,它们不会在不首先跟踪它们的情况下移动。这里提供的for循环将对此有所帮助。

要使用git branch -a查看所有没有out的分支,您应该执行:

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

:我不得不在从艾特莱森Stash克隆仓库到AWS代码提交(空白仓库)时使用倒数第二(即首先推送主)命令。我不确定原因,但是在推送(git push new-origin --mirror)默认分支后,指的是master以外的其他分支。

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

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

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

  1. 它正确地设置了分支跟踪,与此页面上此命令的一些较旧变体不同,这些变体只提供一个参数给--trac,因此每个分支最终都会跟踪master-不好
  2. 命名没有前缀“起源/”的本地分支,这是我个人不想要的-并且与您正常结帐分支时发生的情况一致。
  3. 跳过跟踪大师因为那已经发生了
  4. 实际上没有检查任何东西,因此速度很快
  5. 避免在git分支-r的输出中绊倒->

接下来,如果您要切换源,请替换到旧源的链接并指向一个新的遥控器。确保您首先创建新的遥控器,使用bitdan/github GUI,但不要向其添加任何文件,否则会出现合并问题。例如。

git remote set-url origin git@bitbucket.org:YOUR/SOMEREPO.git

现在推送。请注意,还需要第二个命令来推送标签:

git push -u --all origin
git push --tags origin

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

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

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

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

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

如果你硬编码:

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

获取已经由现代git处理了

根据Jakub Narbski的回答:

使用现代git,您总是可以获取所有分支(作为远程跟踪分支到refs/远程/起源/*命名空间)

如果你要从一个远程原点推到另一个远程原点,你可以使用这个:

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 ush--all-u newRemote',但它只将签出的分支推送到newRemote。

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

作者:Keith Dechant,软件架构师

这是你们中的一些人在使用Git时可能遇到的场景 存储库。你有一个Git存储库的工作副本,比如从一个旧的 服务器。但你只有工作副本,而来源不是 容易接近。所以你不能只是分叉。但你想把整个 存储库和所有分支历史记录到您的新远程。

如果您的工作副本包含跟踪分支,这是可能的 从旧的远程(起源/分支1、起源/分支1等)。如果您这样做, 你有整个回购和历史。

然而,在我的情况下,有几十个分支,和一些或全部 我从来没有在当地检查过。把它们都推出去似乎是一种

那么,接下来该怎么做呢?

我确定了两个选项:

选项1:检查每个分支并推送我可以这样做,我可以 甚至写一个Bash脚本来帮助。然而,这样做会改变我的 工作文件与每个签出,并将创建一个本地分支 每个远程跟踪分支。这将是缓慢的一个大 仓库。

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

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

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

在某些 情况下,也可以只推送分支的子集。如果 分支名称以斜杠命名空间(例如, oldremote/特征/分支3,oldremote/特征/分支4等),您可以 仅推送名称以 "旧的远程/功能":

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

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

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

发布日期:2017年10月9日

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

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/{}